This is an old revision of the document!
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.
<sxh [py][; options for SyntaxHighlighter]>
#! /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 = (18,23,24,25) 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()
</sxh>