====== Inverted LED Display ======
Apr 2017
\\
\\
----
==== I made a mistake ====
\\
When I designed the PCB for this project. I did what most people would do and I made the PCB the 'right way up' with 40 Way Raspberry pi header and the 7 Segment LED also the normal way up (so you can read it). Later on I realised this was a bit of a mistake, because this means the Raspberry Pi Zero Power and USB connections are now at the bottom, so you can't power this up and put it on a table :(.
\\
\\
Fear not though, with some help I have edited the code so that it writes the time upside-down, so if you rotate your Raspberry Pi 180° you can read the time correctly, and still put it on the table. Below is the adjusted code.
\\
\\
Please NOTE: You do NOT have to rotate the 7 Segment LED on the PCB, the code does this for you.
\\
\\
{{:ntp_normal.jpg?300|}} {{:ntp_inverted.jpg?300|}}
\\
\\
Above we can see the Clock working in 'Normal' mode on the left, and in 'Inverted' mode on the right.
\\
\\
----
==== The Python Code ====
\\
#! /usr/bin/python
# Python Script to run a 7 Segment Common Anode LED as a clock.
# Version 1.0
import RPi.GPIO as GPIO
import time
#Define numbering system for the IO pins Raspberry Pi
GPIO.setmode(GPIO.BCM)
# Define GPIO ports for the 7seg
gpioSegments = (5,6,13,19,26,21,20,16)
# 7seg_segment_pins (11,7,4,2,1,10,5,3) + 100R inline
# Setup channels for output and set initial values
for segment in (gpioSegments):
GPIO.setup(segment,GPIO.OUT)
GPIO.output(segment,GPIO.HIGH)
# Define GPIO ports for the digits 0-3
gpioDigits = (25,24,23,18)
# Pins (12,9,8,6) select digits 0-3 respectively reading LTR on display
# Setup channels for output and set initial values
for digit in (gpioDigits):
GPIO.setup(digit,GPIO.OUT)
GPIO.output(digit,GPIO.LOW)
#Define flags for comtrol of Colon separator on display
colon_visible=True
colon_counter=0
#Define segment arrays for each number to be displayed
numbers = {
'0':(0,0,1,0,1,0,0,0),
'1':(0,1,1,1,1,1,0,1),
'2':(0,0,1,1,0,0,1,0),
'3':(0,0,1,1,0,1,0,0),
'4':(0,1,1,0,0,1,0,1),
'5':(1,0,1,0,0,1,0,0),
'6':(1,0,1,0,0,0,0,0),
'7':(0,0,1,1,1,1,0,1),
'8':(0,0,1,0,0,0,0,0),
'9':(0,0,1,0,0,1,0,0),
' ':(0,0,0,0,0,0,0,0)}
#Cycle through each digit and its segments
try:
while True:
time_string = str(time.ctime()[11:13]+time.ctime()[14:16]).rjust(4)
for digit in range(4):
#select digit to display
GPIO.output(gpioDigits[digit], 2)
#set required segments on
for segment in range(0,8):
GPIO.output(gpioSegments[segment], numbers[time_string[digit]][segment])
#check to see if we are on segment 3 of digit 2(LTR)
if ((digit==2) and (segment==2)):
#when colon counter gets to set value flip colon display mode between TRUE (visible) and False (NOT.visible)
if (colon_counter<=25):
#count value not reached turn colon ON or OFF based on current setting of colon_visible
if colon_visible==True:
GPIO.output(13, 0)
else:
GPIO.output(13, 1)
#colon counter set value reached so flip colon display mode and reset colon counter
else:
colon_counter = 0
colon_visible = not colon_visible
#display all selected segments for a short time
time.sleep(0.005)
#turn-off All segments
for segment in range(0,8):
GPIO.output(gpioSegments[segment],GPIO.HIGH)
#turn-off current digit selector pin
GPIO.output(gpioDigits[digit], GPIO.LOW)
#advance colon counter
colon_counter=colon_counter+1
finally:
GPIO.cleanup()