"""
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Interfacing with 7 Segment Display (MicroPython) ┃
┃ ┃
┃ Design and Implement a Traffic Light Controller System ┃
┃ with the use of 7 segment display as counter given the ┃
┃ scenario: Road Structure & State Machine and State Table ┃
┃ ┃
┃ Copyright (c) 2024 CPE4B - Group 1 ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
"""
from machine import Pin
from utime import sleep
# Pins for Traffic Signal A (East-West)
red_A = Pin(26, Pin.OUT)
yellow_A = Pin(27, Pin.OUT)
green_A = Pin(28, Pin.OUT)
# Pins for Traffic Signal B (North-South)
red_B = Pin(22, Pin.OUT)
yellow_B = Pin(21, Pin.OUT)
green_B = Pin(20, Pin.OUT)
pins = [
Pin(2, Pin.OUT), # A
Pin(3, Pin.OUT), # B
Pin(4, Pin.OUT), # C
Pin(5, Pin.OUT), # D
Pin(6, Pin.OUT), # E
Pin(8, Pin.OUT), # F
Pin(7, Pin.OUT), # G
Pin(0, Pin.OUT) # DP (optional, not used)
]
digits = [
[0, 0, 0, 0, 0, 0, 1, 1], # 0
[1, 0, 0, 1, 1, 1, 1, 1], # 1
[0, 0, 1, 0, 0, 1, 0, 1], # 2
[0, 0, 0, 0, 1, 1, 0, 1], # 3
[1, 0, 0, 1, 1, 0, 0, 1], # 4
[0, 1, 0, 0, 1, 0, 0, 1], # 5
[0, 1, 0, 0, 0, 0, 0, 1], # 6
[0, 0, 0, 1, 1, 1, 1, 1], # 7
]
# Turns off all segments on the 7-segment display
def reset_display():
for pin in pins:
pin.value(1)
# Displays a number on the 7-segment display
def display_number(num):
for i in range(7):
pins[i].value(digits[num][i])
# Initial State 0
def state_S0():
green_A.value(1)
red_B.value(1)
red_A.value(0)
for i in range(7, 0, -1):
display_number(i)
sleep(1)
green_A.value(0)
# State 1
def state_S1():
yellow_A.value(1)
red_B.value(1)
for i in range(2, 0, -1):
display_number(i)
sleep(1)
yellow_A.value(0)
# State 2
def state_S2():
red_A.value(1)
red_B.value(1)
for i in range(2, 0, -1):
display_number(i)
sleep(1)
# State 3
def state_S3():
green_B.value(1)
red_A.value(1)
red_B.value(0)
for i in range(7, 0, -1):
display_number(i)
sleep(1)
green_B.value(0)
# State 4
def state_S4():
yellow_B.value(1)
red_A.value(1)
for i in range(2, 0, -1):
display_number(i)
sleep(1)
yellow_B.value(0)
# State 5
def state_S5():
red_B.value(1)
red_A.value(1)
for i in range(2, 0, -1):
display_number(i)
sleep(1)
while True:
reset_display()
state_S0()
reset_display()
state_S1()
reset_display()
state_S2()
reset_display()
state_S3()
reset_display()
state_S4()
reset_display()
state_S5()