Introduction: Keysorter

I'm currently studying NMCT at Howest. For our final semester we had to make a project. So I made a Keysorter.

What does it do?

We have alot of car keys at home and they all look alike. So I made a Keysorter to resolve this issue.

It has to scan in a key via RFID and give it a place in the box. If I scan the same key again it will show his previously assigned place. There is also a button to show the last washed car.

This will al run on a Raspberry Pi which also has a the option to add a webpage via Flask.

On the page I should be able to look at all the keys, add a name to a key and remove a key.

Step 1: Step 1: What Will I Need?

I started by making a list of components that I'll need to make this thing work.


  • Raspberry pi
  • 2 x Shift register (74hc595)
  • 3 x button
  • 9 x green led
  • RFID scanner (MFRC522)
  • 12 x resistor 220 ohm

Then I put all this into my fritzing schematic.

Once I this was done I made it in real life.

Step 2: Step 2: Making a Database Schematic

To save al my data I had to create a database that could run on my Pi.

I made it in Mysql.

Table car:

  • Car ID
  • User ID
  • Brand (car brand)
  • Type
  • Last washed
  • Key

Step 3: Step 3: Coding

When all this was ready I could start coding.

I started by making the code for my sensor in Python 3.5.

To download the code click here.

Use the link to clone the project.

Step 4: Step 4: Putting Al the Code on My Raspberry Pi

Installing packages

First I installed al the packages I needed to make this work.

me@my-rpi:~ $ sudo apt update
me@my-rpi:~ $ sudo apt install -y python3-venv python3-pip python3-mysqldb mysql-server uwsgi nginx uwsgi-plugin-python3

Virtual environment

me@my-rpi:~ $ python3 -m pip install --upgrade pip setuptools wheel virtualenv
me@my-rpi:~ $ mkdir project1 && cd project1 me@my-rpi:~/project1 $ python3 -m venv --system-site-packages env me@my-rpi:~/project1 $ source env/bin/activate (env)me@my-rpi:~/project1 $ python -m pip install mysql-connector-python argon2-cffi Flask Flask-HTTPAuth Flask-MySQL mysql-connector-python passlib

Upload the project onto your Pi using pycharm

Open Pycharm and go to VCS > Import from Version Control > Github and clone my github file.

Put the deployment config to the directory you just made. (/home/me/project1). Press apply!

Go to the interpreter settings and choose the virtual environment you just made. (/home/me/project1/env/bin/pyhon)

Check if path mapping is correct.

Now you can upload the code to your directory using Pycharm.


Check if the database is running.
You should get something like this:

me@my-rpi:~ $ sudo systemctl status mysql
● mariadb.service - MariaDB database server Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-06-03 09:41:18 CEST; 1 day 4h ago Main PID: 781 (mysqld) Status: "Taking your SQL requests now..." Tasks: 28 (limit: 4915) CGroup: /system.slice/mariadb.service └─781 /usr/sbin/mysqld
Jun 03 09:41:13 my-rpi systemd[1]: Starting MariaDB database server...
Jun 03 09:41:15 my-rpi mysqld[781]: 2018-06-03  9:41:15 4144859136 [Note] /usr/sbin/mysqld (mysqld 10.1.26-MariaDB-0+deb9u1)
Jun 03 09:41:18 my-rpi systemd[1]: Started MariaDB database server.
me@my-rpi:~ $ ss -lt | grep mysql
LISTEN     0      80                    *:*

Create users and adding the database

me@my-rpi:~ $ sudo mariadb

once you're in the database do this.

CREATE USER 'project1-admin'@'localhost' IDENTIFIED BY 'adminpassword';
CREATE USER 'project1-web'@'localhost' IDENTIFIED BY 'webpassword'; CREATE USER 'project1-sensor'@'localhost' IDENTIFIED BY 'sensorpassword';
GRANT ALL PRIVILEGES ON project1.* to 'project1-admin'@'localhost' WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, DELETE ON project1.* TO 'project1-web'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON project1.* TO 'project1-sensor'@'localhost';

`idUser` int(11) NOT NULL, `Password` varchar(45) DEFAULT NULL, PRIMARY KEY (`idUser`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

`idCar` int(11) NOT NULL AUTO_INCREMENT, `idUser` int(11) NOT NULL, `Brand` varchar(45) DEFAULT NULL, `Type` varchar(45) DEFAULT NULL, `LastWashed` datetime DEFAULT NULL, `RFID_Number` varchar(15) DEFAULT NULL, `Key` varchar(5) DEFAULT NULL, PRIMARY KEY (`idCar`,`idUser`), KEY `fk_Car_User1_idx` (`idUser`), CONSTRAINT `fk_Car_User1` FOREIGN KEY (`idUser`) REFERENCES `user` (`idUser`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

Connect your database to Pycharm

Click on the database tab on the right side. If you don't have a the tab open do this: View > Tool Windows > Database.

Click add connection. Choose Data Source > MySQL (If there is a button download driver press it.)

Go to SSH/SSL en check SSH. Fill in the your Raspberry pi credentials (host/user/password). Port should be 22 and don't forget to check remember password.

Go back to General. Host should be localhost and database should be project1. Fill in the credentials from project1-admin en test the connection.

If the connection is OK then go to the tab Schemas and make sure project1 is checked.

Check if the database is correct

me@my-rpi:~ $ echo 'show tables;' | mysql project1 -t -u project1-admin -p
Enter password: +---------------------------+ | Tables_in_project1 | +---------------------------+ | sensor | | users | +---------------------------+

Configuration Files

In the directory conf you'll find 4 files. You should change the usernames to your username.


To start everything you should execute these commands.

me@my-rpi:~/project1 $ sudo cp conf/project1-*.service /etc/systemd/system/
me@my-rpi:~/project1 $ sudo systemctl daemon-reload
me@my-rpi:~/project1 $ sudo systemctl start project1-*
me@my-rpi:~/project1 $ sudo systemctl status project1-*
● project1-flask.service - uWSGI instance to serve project1 web interface
   Loaded: loaded (/etc/systemd/system/project1-flask.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-06-04 13:14:56 CEST; 1s ago
 Main PID: 6618 (uwsgi)
    Tasks: 6 (limit: 4915)
   CGroup: /system.slice/project1-flask.service
           ├─6618 /usr/bin/uwsgi --ini /home/me/project1/conf/uwsgi-flask.ini
           ├─6620 /usr/bin/uwsgi --ini /home/me/project1/conf/uwsgi-flask.ini
           ├─6621 /usr/bin/uwsgi --ini /home/me/project1/conf/uwsgi-flask.ini
           ├─6622 /usr/bin/uwsgi --ini /home/me/project1/conf/uwsgi-flask.ini
           ├─6623 /usr/bin/uwsgi --ini /home/me/project1/conf/uwsgi-flask.ini
           └─6624 /usr/bin/uwsgi --ini /home/me/project1/conf/uwsgi-flask.ini
Jun 04 13:14:56 my-rpi uwsgi[6618]: mapped 383928 bytes (374 KB) for 5 cores
Jun 04 13:14:56 my-rpi uwsgi[6618]: *** Operational MODE: preforking ***
● project1-sensor.service - Project 1 sensor service
   Loaded: loaded (/etc/systemd/system/project1-sensor.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-06-04 13:16:49 CEST; 5s ago
 Main PID: 6826 (python)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/project1-sensor.service
           └─6826 /home/me/project1/env/bin/python /home/me/project1/sensor/
Jun 04 13:16:49 my-rpi systemd[1]: Started Project 1 sensor service.
Jun 04 13:16:49 my-rpi python[6826]: DEBUG:__main__:Saved sensor process_count=b'217\n' to database
Jun 04 13:16:55 my-rpi python[6826]: DEBUG:__main__:Saved sensor process_count=b'218\n' to database


me@my-rpi:~/project1 $ ls -l /etc/nginx/sites-*
total 4
-rw-r--r-- 1 root root 2416 Jul 12  2017 default
total 0
lrwxrwxrwx 1 root root 34 Jan 18 13:25 default -> /etc/nginx/sites-available/default

To make everything default execute these commands.

me@my-rpi:~/project1 $ sudo cp conf/nginx /etc/nginx/sites-available/project1
me@my-rpi:~/project1 $ sudo rm /etc/nginx/sites-enabled/default me@my-rpi:~/project1 $ sudo ln -s /etc/nginx/sites-available/project1 /etc/nginx/sites-enabled/project1 me@my-rpi:~/project1 $ sudo systemctl restart nginx.service


Let's make sure everything start's automatically.

Go to the conf directory and execute these final commands and you're done!

me@my-rpi:~/project1 $ sudo systemctl enable project1-*

If you reboot your Pi it should start automatically.

Step 5: Step 5: Making a Housing.


To make my housing I used an old closet my mom would trow away.


I sawed 4 planks (34 cm x 26 cm). (so it's a cube from 34 x 34 x 26).

On the bottom I added a thin piece of wood as bottom.

Board with led's

In the middle I've put 2 small pieces of wood on each side both at 9 cm from the top. This holds the board where the led's will be sitting.

The board with the led's is a small board (32 cm x 32 cm).

I drilled 9 holes for the led's to come out of.


I made the division with the same material as the bottom and the board with led's.

4 pieces each with a incision at 10.3 cm (9 cm x 31 cm). Now I'm able to put them together.

Buttons and RFID reader

I made a hole in the base to put my RFID reader and buttons in. For the RFID I put a thin piece of board in front of it to make it look cleaner.

Step 6: Step 6: Putting Everything in the Housing.

This depends on how you want to do it. I personally used a lot of cables without soldering because I want to be able to reuse my Raspberry Pi.

I glued the led's in place and taped the RFID reader and breadboards to the case.

And that's how you make a Keysorter!