from machine import Pin
from time import sleep
# Initialize the buttons and LED pins
ped1_button = Pin(1, Pin.IN, Pin.PULL_UP) # Pedestrian1 button
ped2_button = Pin(2, Pin.IN, Pin.PULL_UP) # Pedestrian2 button
# Pedestrian crossing lights
ped_red_led = Pin(16, Pin.OUT)
ped_green_led = Pin(17, Pin.OUT)
# Main road traffic lights
main_red_led = Pin(18, Pin.OUT)
main_yellow_led = Pin(19, Pin.OUT)
main_green_led = Pin(20, Pin.OUT)
# Seven-segment display pins
segments = {
'a': Pin(10, Pin.OUT),
'b': Pin(11, Pin.OUT),
'c': Pin(12, Pin.OUT),
'd': Pin(13, Pin.OUT),
'e': Pin(14, Pin.OUT),
'f': Pin(15, Pin.OUT),
'g': Pin(28, Pin.OUT),
}
# Seven-segment display number representation (common cathode)
num_map = {
0: [1, 1, 1, 1, 1, 1, 0],
1: [0, 1, 1, 0, 0, 0, 0],
2: [1, 1, 0, 1, 1, 0, 1],
3: [1, 1, 1, 1, 0, 0, 1],
4: [0, 1, 1, 0, 0, 1, 1],
5: [1, 0, 1, 1, 0, 1, 1],
6: [1, 0, 1, 1, 1, 1, 1],
7: [1, 1, 1, 0, 0, 0, 0],
8: [1, 1, 1, 1, 1, 1, 1],
9: [1, 1, 1, 0, 0, 1, 1],
}
def display_number(num):
"""Displays a number on the seven-segment display"""
for i, segment in enumerate('abcdefg'):
segments[segment].value(num_map[num][i])
def clear_display():
"""Clears the seven-segment display by turning off all segments"""
for segment in segments.values():
segment.value(0)
def main_traffic_light_sequence():
# Main road green light, pedestrian red light
main_red_led.value(0)
main_yellow_led.value(0)
main_green_led.value(1)
ped_red_led.value(1)
ped_green_led.value(0)
def pedestrian_traffic_light_sequence():
# Main road red light, pedestrian green light
main_green_led.value(1)
sleep(5)
main_green_led.value(0)
main_yellow_led.value(1)
sleep(2)
main_yellow_led.value(0)
main_red_led.value(1)
ped_red_led.value(0)
ped_green_led.value(1)
for i in range(9, 0, -1):
display_number(i)
sleep(1)
main_red_led.value(0)
main_yellow_led.value(1)
sleep(1)
main_red_led.value(0)
main_yellow_led.value(0)
main_green_led.value(0)
ped_red_led.value(0)
ped_green_led.value(0)
clear_display()
sleep(0.1)
while True:
# Main traffic light sequence runs continuously
main_traffic_light_sequence()
# Read the button states
ped1_button_state = ped1_button.value()
ped2_button_state = ped2_button.value()
# Check if either button is pressed
if ped1_button_state == 0 or ped2_button_state == 0:
# Debounce the button press
sleep(0.05) # 50ms delay for debouncing
if ped1_button.value() == 0 or ped2_button.value() == 0:
pedestrian_traffic_light_sequence()
# Wait for both buttons to be released
while ped1_button.value() == 0 or ped2_button.value() == 0:
sleep(0.05) # Short delay to avoid busy waiting
sleep(0.05) # Additional delay to ensure debounce