from machine import Pin, I2C
from time import sleep_ms, ticks_ms
from pico_i2c_lcd import I2cLcd
# Pins for LEDs
R1 = Pin(2, Pin.OUT)
Y1 = Pin(3, Pin.OUT)
G1 = Pin(4, Pin.OUT)
R2 = Pin(6, Pin.OUT)
Y2 = Pin(7, Pin.OUT)
G2 = Pin(8, Pin.OUT)
# Pins for Buttons
BT1 = Pin(10, Pin.IN, Pin.PULL_DOWN)
BT2 = Pin(12, Pin.IN, Pin.PULL_DOWN)
# LCD setup
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd_addr = i2c.scan()[0]
lcd = I2cLcd(i2c, lcd_addr, 2, 16)
# Traffic light modes
MODES = [
"Mode : 0 - Flashing Red",
"Mode : 1 - Flashing Yellow",
"Mode : 2 - Red1 Yellow2",
"Mode : 3 - Yellow1 Red2",
"Mode : 4 - Regular Seq",
"Mode : 5 - Manual Flip"
]
current_mode = 0
def display_mode():
lcd.clear()
lcd.putstr(MODES[current_mode])
def reset_lights():
R1.value(0)
Y1.value(0)
G1.value(0)
R2.value(0)
Y2.value(0)
G2.value(0)
def mode_0():
R1.value(1)
R2.value(1)
while current_mode == 0:
R1.toggle()
R2.toggle()
sleep_ms(500)
def mode_1():
Y1.value(1)
Y2.value(1)
while current_mode == 1:
Y1.toggle()
Y2.toggle()
sleep_ms(500)
def mode_2():
R1.value(1)
Y2.value(1)
while current_mode == 2:
R1.toggle()
Y2.toggle()
sleep_ms(500)
def mode_3():
Y1.value(1)
R2.value(1)
while current_mode == 3:
Y1.toggle()
R2.toggle()
sleep_ms(500)
def mode_4():
while current_mode == 4:
R1.value(1)
G2.value(1)
sleep_ms(2000)
R1.value(1)
Y2.value(1)
sleep_ms(1000)
G1.value(1)
R2.value(1)
sleep_ms(2000)
Y1.value(1)
R2.value(1)
sleep_ms(1000)
def mode_5():
while current_mode == 5:
if BT2.value() == 1:
R1.toggle()
R2.toggle()
sleep_ms(500)
# Main program
def main():
lcd.putstr("Traffic Light Control Panel!")
sleep_ms(3000) # Display initial message for 3 seconds
lcd.clear()
while True:
display_mode()
if BT1.value() == 1:
global current_mode
current_mode = (current_mode + 1) % len(MODES)
reset_lights()
sleep_ms(500) # Debounce delay
if current_mode == 0:
mode_0()
elif current_mode == 1:
mode_1()
elif current_mode == 2:
mode_2()
elif current_mode == 3:
mode_3()
elif current_mode == 4:
mode_4()
elif current_mode == 5:
mode_5()
if __name__ == "__main__":
main()