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()
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT