from machine import Pin, Timer
import time
# -------- Settings --------
GREEN_TIME = 5000
YELLOW_TIME = 2000
RED_TIME = 5000
DEBOUNCE_MS = 200
# -------- Pins --------
green_led = Pin(25, Pin.OUT)
yellow_led = Pin(26, Pin.OUT)
red_led = Pin(27, Pin.OUT)
button = Pin(4, Pin.IN, Pin.PULL_UP)
# -------- State --------
last_press = 0
pedestrian_request = False
# traffic states
GREEN = 0
YELLOW = 1
RED = 2
current_state = GREEN
# timer
traffic_timer = Timer(0)
# -------- LED Control --------
def set_lights(state):
green_led.off()
yellow_led.off()
red_led.off()
if state == GREEN :
green_led.on()
elif state == YELLOW :
yellow_led.on()
elif state == RED :
red_led.on()
# -------- Interrupt --------
def button_pressed(pin):
global last_press , pedestrian_request
now = time.ticks_ms()
if time.ticks_diff(now, last_press) >= DEBOUNCE_MS :
pedestrian_request = True
print("pedestrain requested")
last_press = now
# -------- Timer Callback --------
def change_traffic(timer):
global current_state, pedestrian_request
# Pedestrain request
if pedestrian_request and current_state != RED:
current_state = RED
set_lights(RED)
pedestrian_request = False
print("pedestrain crossing")
traffic_timer.init(
period = RED_TIME,
mode = Timer.ONE_SHOT,
callback = change_traffic
)
return
# normal case
if current_state == GREEN:
current_state = YELLOW
set_lights(YELLOW)
traffic_timer.init(
period = YELLOW_TIME,
mode = Timer.ONE_SHOT,
callback = change_traffic
)
elif current_state == YELLOW:
current_state = RED
set_lights(RED)
traffic_timer.init(
period = RED_TIME,
mode = Timer.ONE_SHOT,
callback = change_traffic
)
elif current_state == RED:
current_state = GREEN
set_lights(GREEN)
traffic_timer.init(
period = GREEN_TIME,
mode = Timer.ONE_SHOT,
callback = change_traffic
)
# attach interrupt
button.irq(trigger = Pin.IRQ_FALLING, handler = button_pressed)
# -------- Start System --------
print("Traffic Light System Started")
set_lights(GREEN)
traffic_timer.init(
period = YELLOW_TIME,
mode = Timer.ONE_SHOT,
callback = change_traffic
)
# -------- Main Loop --------
while True:
# main loop stays free
time.sleep_ms(10)