====== 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()