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