This runs a Raspberry Pi as a controller for a school bell.
It makes the school bell ring at the right times taking the calendar into consideration.
Also there is an LCD screen to visualize time, database stats, upcoming rings etc.
Administration of the school bell is done via a web UI.
It is written entirely in python.
Also it installs gpio-watch to catch the buttons connected to the Pi's GPIO. https://github.com/larsks/gpio-watch
Now running on RaspberryPiOS Bullseye.
Everything updated to run on python3.
Updated install script.
Made it easier for those not having the Swedish holidays. (More work needed...)
New module for printing to LCD.
Fixed apache not defaulting to index.py.
The API for Swedish holidays, api.dryg.net, is dead.
Substituted by sholiday.faboul.se.
Changed all GPIO pins to make an easier PCB layout possible.
This makes all older electric installs incompatible.
Added KiCad files for new pin layout.
Corrected editing of ring times.
Bug discovered
There was a fault in the database setup.
Instead of updating, you can:
Log in to database
$ sudo mysql -u root -p piSchoolBell
Change column type
MariaDB [piSchoolBell]> ALTER TABLE ringTimes CHANGE weekDays weekDays VARCHAR(7);
-
1 x Raspberry Pi 3 B+, kjell.com Art#88100 (could be any of the later models)
-
1 x LCD display, kjell.com Art#90215 (16x2 characters, based on the HD44780 chip)
-
1 x USB micro power adapter, kjell.com Art#88525
-
1 x Micro SD card, kjell.com Art#97600
-
1 x 10k potentiometer, kjell.com Art#90633
-
1 x 5V relay module, kjell.com Art#87878
-
4 x Push button, kjell.com Art#36023
-
4 x 10k resistor
-
4 x 1k resistor
-
1 x Switch, kjell.com Art#36016
-
1 x Casing for rpi, kjell.com Art#89030
-
1 x Casing for relay, kjell.com Art#89014
-
1 x RTC-module, kjell.com Art#87984
-
1 x CR2032 battery, kjell.com ART#33715
-
GPIO header connector, kjell.com Art#87915 (or breakout board)
-
Wiring, cables
-
PCB board, kjell.com Art#89416 or Art#89435 (or a breadboard, just to set it up)
-
Soldering material
Assemble all the parts according to the KiCad files.
Download RaspberryPiOS Lite from https://www.raspberrypi.com/software/operating-systems/.
Cd to where your download is.
$ xz -d 2022-04-04-raspios-bullseye-armhf-lite.img.xz
Insert SD-card and find out drive letter.
$ dmesg
For example '/dev/mmcblk0' or '/dev/sdb'.
Unmount if mounted.
$ umount /dev/mmcblk0p1
$ umount /dev/mmcblk0p2
Write image to SD-card.
$ sudo dd bs=4M if=2022-04-04-raspios-bullseye-armhf-lite.img of=/dev/mmcblk0 conv=fsync status=progress
Remove SD-card and insert it again to make new partitions visible.
Mount the first partition.
$ sudo mount /dev/mmcblk0p1 /mnt/tmp
Write empty file to boot partition to enable ssh at boot.
$ sudo touch /mnt/tmp/ssh
Unmount.
$ sudo umount /mnt/tmp
Remove SD-card and insert it in a RPi connected to your local network and boot it up.
For this version of the operating system you should have a monitor and keyboard hooked up at the first boot.
After some restarts you will start to configure your machine:
- Select keyboard layout
- Create user and set password. For the sake of this installation it's preferred you set 'pi' as username.
After this you will have a prompt.
Find out the ip of the RPi
$ ifconfig
Connect to the RPi via ssh on another machine (if you don't want to continue as before).
$ ssh -ip from above- -l pi
Login with the username and password you created earlier
$ sudo raspi-config
1 S1 Configure wifi
2 S4 Change hostname
4 P2 Set GPU memory to 16
5 L1 Set locales
5 L2 Set time zone
6 A1 Expand file system to use whole SD-card
Reboot to set new options.
Connect again
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install git
$ cd /home/pi
$ git clone https://github.com/jonsag/piSchoolBell.git
$ cd /home/pi/piSchoolBell
$ sudo ./install.sh
$ sudo mysql_secure_installation
Set root password, and press 'enter' on all other questions
$ sudo /home/pi/piSchoolBell/mysql-setup.sh
$ /home/pi/piSchoolBell/insertTestData.sh
$ /home/pi/bin/piSchoolBell/getCalendar.py -v
If you're not lucky enough to live in Sweden, you can run this to make all weekdays workdays.
$ /home/pi/piSchoolBell/makeAllWeekdaysToWorkdays.sh
This includes ALL Mondays to Fridays.
You will have to manually add your own work free weekdays.
To set 4'th of July 2023 to work free day (if it wasn't a Sunday already...)
Connect to mysql
$ mysql -u pi -p$(grep password /home/pi/bin/piSchoolBell/mysql-config.ini | awk '{ print $3 }') piSchoolBell
MariaDB [piSchoolBell]> UPDATE days SET isWorkDay = '0' WHERE date = '2023-06-04';
In Sweden we use the correct way for dates and numbering days.
The first day of the week is Monday. It has number '0' in the database.
When printing dates we use 'YYYY-MM-DD'.
$ sudo /home/pi/piSchoolBell/www-secure-setup.sh
$ sudo raspi-config
3 I5 Enable I2C interface
$ ./install-rtc.sh
Check that time and date is correct
$ date
Set hardware clock
$ sudo hwclock -w
Comment out the following lines in /lib/udev/hwclock-set
if [ -e /run/systemd/system ] ; then
exit 0
fi
Reboot
Press button on unit to display its IP-address on the second line of the LCD.
Connect to the unit by pointing your browser to
http://\<IP-address\>:8080'.
Edit or add breaks, ring times and ring patterns.
Remember, you can't really add rings on saturdays or sundays, as this is mainly intended for use on normal school schedules.
At the first of every month cron will download calendar from 'dryg.net', adding data to the database.
Every night cron will delete past breaks and days from the database.
Normally the LCD display shows:
Line 1: HH:MM YYYY-mm-dd, current time and date
Line 2: HH:MM YYYY-mm-dd, the time and date for the next bell ring
By pressing button 1, display will show:
Line 1: days left in db, last date in db
Line 2: IP-address
If it shows 'Not connected' it has not been able to acquire an IP address.
The first character on line 2 shows if the unit can access internet.
If it is a '*' it is connected.
If it is a '-' it is not connected.
Pressing button 2 will make the LCD go back to showing default info.
To dump database and logs to USB-stick:
Format a stick to fat32 and label it 'PISCHOOLBEL'.
Insert into Pi.
Display will show:
The USBs label and drive letter
'USB mounted'
Press button 3.
Display will confirm writing
When finished display shows number of files written
Remove USB
Display will show:
drive letter
'USB umounted'
Edit the database file with the highest date and time on the stick.
To read back edited file to database:
Insert the USB-stick.
Display will show:
The USBs label and drive letter
'USB mounted'
Press button 4.
Display will confirm reading
...
Not implemented yet.
For now it only shows how many lines to read back to the database.
If you get problems with Adafruit_Python_CharLCD failing to write to LCD.
$ cd /home/pi/piSchoolBell/Adafruit_Python_CharLCD
$ sudo python setup.py install
Check system time:
$ date
Check HW-time:
$ sudo hwclock -r
Set HW-clock to system time:
$ sudo hwclock -w
Set system clock from HW-clock:
$ sudo hwclock -s
Set system date manually:
$ date +%Y%m%d -s "20120418"
Set system time manually:
$ date +%T -s "11:14:00"
Set HW-clock manually:
$ sudo hwclock --set --date="2011-08-14 16:45:05"
$ rsync -raci ~/Documents/EclipseWorkspace/piSchoolBell/* pi@192.168.10.44:/home/pi/bin/piSchoolBell/
$ rsync -raci ~/Documents/EclipseWorkspace/piSchoolBell/www/* pi@192.168.10.44:/var/www/piSchoolBell/
$ ssh pi@192.168.10.44 'sudo chmod 755 -R /var/www/piSchoolBell'
$ ssh pi@192.168.10.44 'sudo chown -R pi:www-data /var/www/piSchoolBell'
$ rsync -raci ~/Documents/EclipseWorkspace/piSchoolBell/purgeDatabase.py pi@192.168.10.44:/home/pi/bin/piSchoolBell/$ rsync -raci ~/Documents/CodeWorkspace/piSchoolBell pi@192.168.10.99:/home/pi/
$ rsync -raci ~/Documents/CodeWorkspace/piSchoolBell/bin/* pi@192.168.10.99:/home/pi/bin/piSchoolBell
$ list /home/pi/bin/piSchoolBell/
$ cat /home/pi/bin/piSchoolBell/gpio.service
$ cat /lib/systemd/system/gpio.service
$ list /home/pi/bin/piSchoolBell/gpio-scripts
$ cat /home/pi/bin/piSchoolBell/gpio-scripts/gpio-script
$ list /var/www/piSchoolBell
$ cat etc/cron.d/piSchoolBell
$ ps ax | grep gpio
$ /home/pi/bin/piSchoolBell/printToLcd.py -v
$ i2cdetect -y 1
$ cat /proc/driver/rtc