from machine import Pin
from time import sleep, ticks_ms,ticks_diff
def init_mode(traffic):
# init state light is OUT
rood_a.value(0)
oranje_a.value(0)
groen_a.value(0)
rood_b.value(0)
oranje_b.value(0)
groen_b.value(0)
if traffic:
zone_start = 0
rood_a.value(1) # init state light is ON
rood_b.value(1) # init state light is ON
else:
zone_start = 0
oranje_a.value(1) # init state light is ON
oranje_b.value(1) # init state light is ON
return zone_start
if __name__ == '__main__':
SINGLE_SPEED = 1
DOUBLE_SPEED = 2
DENDER_VALUE = 0.4
# ESP32 IN & OUT
rood_a = Pin(21, Pin.OUT) # traffic light A
oranje_a = Pin(19, Pin.OUT)
groen_a = Pin(18, Pin.OUT)
rood_b = Pin(25, Pin.OUT) # traffic light B
oranje_b = Pin(26, Pin.OUT)
groen_b = Pin(27, Pin.OUT)
led_blauw = Pin(2, Pin.OUT)
druk_mode = Pin(34, Pin.IN, Pin.PULL_DOWN) # press for toggle modes normal - alarm(blink)
druk_speed = Pin(35, Pin.IN, Pin.PULL_DOWN) # press for toggle normal - double
druk_mode_now = 0
druk_speed_now = 0
druk_mode_prev = 0
druk_speed_prev = 0
info_flag = True
time_stamp = ticks_ms()
traffic_mode = True
speed_mode = SINGLE_SPEED
intervals = [2000, 5000, 2000, 2000, 5000, 2000]
blink_interval = 1000
zone = init_mode(traffic_mode)
# init_speed(speed_mode)
while True:
# display info banner and blue ESP32 LED for double speed
if info_flag:
text_traffic = "NORMAL" if traffic_mode else "ALARM "
if traffic_mode:
text_speed = "DOUBLE" if speed_mode == 2 else "NORMAL"
else:
text_speed = "N/A"
print("Traffic =", text_traffic,"Speed =", text_speed)
led_blauw.value(1) if speed_mode == 2 else led_blauw.value(0)
info_flag = False
# check button to toggle traffic_mode
druk_mode_now = druk_mode.value()
if druk_mode_now != druk_mode_prev:
druk_mode_prev = druk_mode_now
if druk_mode_now:
traffic_mode = not traffic_mode
info_flag = True
zone = init_mode(traffic_mode)
sleep(DENDER_VALUE)
if traffic_mode:
# check button to toggle speed_mode (only in NORMAL traffic mode)
druk_speed_now = druk_speed.value()
if druk_speed_now != druk_speed_prev:
druk_speed_prev = druk_speed_now
if druk_speed_now:
speed_mode = 1 if speed_mode ==2 else 2
info_flag = True
sleep(DENDER_VALUE)
# 2 types of traffic lights cycles
time_now = ticks_ms()
if traffic_mode: # NORMAL traffic mode
if zone == 0:
if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
rood_a.value(0)
groen_a.value(1)
zone += 1
time_stamp = time_now
elif zone == 1:
if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
groen_a.value(0)
oranje_a.value(1)
zone += 1
time_stamp = time_now
elif zone == 2:
if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
oranje_a.value(0)
rood_a.value(1)
zone += 1
time_stamp = time_now
elif zone == 3:
if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
rood_b.value(0)
groen_b.value(1)
zone += 1
time_stamp = time_now
elif zone == 4:
if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
groen_b.value(0)
oranje_b.value(1)
zone += 1
time_stamp = time_now
elif zone == 5:
if ticks_diff(time_now, time_stamp) >= intervals[zone]/speed_mode:
oranje_b.value(0)
rood_b.value(1)
zone = 0
time_stamp = time_now
else: # ALARM traffic mode (blinking orange lights)
if zone == 0:
if ticks_diff(time_now, time_stamp) >= blink_interval:
oranje_a.value(0)
oranje_b.value(0)
zone += 1
time_stamp = time_now
elif zone == 1:
if ticks_diff(time_now, time_stamp) >= blink_interval:
oranje_a.value(1)
oranje_b.value(1)
zone = 0
time_stamp = time_now