30
10/15
17:45
A Very Simple Raspberry Pi Clock Using Adafruit 16×2 LCD Pi Plate
I had a spare Raspberry Pi and Pi Plate sitting around so I decided to make yet another clock. The trick to this is that I wanted to make a full height display using a 16×2 character LCD. The PiPlate supports defining a few custom characters which I sketched out on a napkin (literally). I am sure this wont make much sense to others, but here it is:
After installing the drivers and such per instructions here: https://learn.adafruit.com/adafruit-16×2-character-lcd-plus-keypad-for-raspberry-pi
Raspbian automatically sets up NTP to keep the clock accurate, so the final code is pretty simple:
#!/usr/bin/python
# Simple clock using 16x2 LCD
import math
import time
import sys
import Adafruit_CharLCD as LCD
# Initialize the LCD using the pins
lcd = LCD.Adafruit_CharLCDPlate()
lcd.set_backlight(1)
# Create some custom characters
lcd.create_char(0, [0, 0, 0, 0, 0, 0, 0, 0])
lcd.create_char(1, [16, 24, 24, 24, 24, 24, 24, 16])
lcd.create_char(2, [1, 3, 3, 3, 3, 3, 3, 1])
lcd.create_char(3, [17, 27, 27, 27, 27, 27, 27, 17])
lcd.create_char(4, [31, 31, 0, 0, 0, 0, 0, 0])
lcd.create_char(5, [0, 0, 0, 0, 0, 0, 31, 31])
lcd.create_char(6, [31, 31, 0, 0, 0, 0, 0, 31])
lcd.create_char(7, [31, 0, 0, 0, 0, 0, 31, 31])
# Define digit pairs from 00 to 61 (yes 61 because of leap seconds)
digits=[\
[24341,25351],[24120,25120],[24161,25370],[24161,25171],[24301,25141],[2
4360,25171],[24360,25371],[24141,25101],[24361,25371],[24341,25141],
[ 2241, 2251],[ 2020, 2020],[ 2061, 2270],[ 2061, 2071],[ 2201, 2041],[
2260, 2071],[ 2260, 2271],[ 2041, 2001],[ 2261, 2271],[ 2241, 2041],
[ 6341,27251],[ 6120,27020],[ 6161,27270],[ 6161,27071],[ 6301,27041],[
6360,27071],[ 6360,27271],[ 6141,27001],[ 6361,27271],[ 6341,27041],
[ 6341, 7351],[ 6120, 7120],[ 6161, 7370],[ 6161, 7171],[ 6301, 7141],[
6360, 7171],[ 6360, 7371],[ 6141, 7101],[ 6361, 7371],[ 6341, 7141],
[20341, 4351],[20120, 4120],[20161, 4370],[20161, 4171],[20301, 4141],[2
0360, 4171],[20360, 4371],[20141, 4101],[20361, 4371],[20341, 4141],
[26241, 7351],[26020, 7120],[26061, 7370],[26061, 7171],[26201, 7141],[2
6260, 7171],[26260, 7371],[26041, 7101],[26261, 7371],[26241, 7141],
[26241,27351],[26020,27120]]
# Loop forever
while True:
now=time.localtime()
hrs=int(time.strftime("%H"))
min=int(time.strftime("%M"))
sec=int(time.strftime("%S"))
# Build string representing top and bottom rows
L1="0"+str(digits[hrs][0]).zfill(5)+str(digits[min][0]).zfill(5)+str(dig
its[sec][0]).zfill(5)
L2="0"+str(digits[hrs][1]).zfill(5)+str(digits[min][1]).zfill(5)+str(dig
its[sec][1]).zfill(5)
# Convert strings from digits into pointers tocustom character
i=0
XL1=""
XL2=""
while i < len(L1):
XL1=XL1+chr(int(L1[i]))
XL2=XL2+chr(int(L2[i]))
i += 1
# Update Display
lcd.home()
lcd.message(XL1+"\n")
lcd.message(XL2)
# Wait for next tic
time.sleep(0.9)
while now==time.localtime():
time.sleep(0.01)
The final step is just to make it start on boot which I did by adding the following line to root’s crontab:
@reboot /usr/bin/python /usr/bin/pintp.py

