from machine import Pin, ADC
from time import sleep
import tm1637
# LEDs
red = Pin(18, Pin.OUT)
yellow = Pin(21, Pin.OUT)
green = Pin(19, Pin.OUT)
solar_led = Pin(25, Pin.OUT)
# Switch da rede elétrica
power_pin = Pin(32, Pin.IN, Pin.PULL_UP)
# Potenciômetro (painel solar)
solar_sensor = ADC(Pin(34))
solar_sensor.atten(ADC.ATTN_11DB)
# Displays
traffic_display = tm1637.TM1637(clk=Pin(22), dio=Pin(23))
battery_display = tm1637.TM1637(clk=Pin(26), dio=Pin(27))
traffic_display.brightness(7)
battery_display.brightness(7)
battery = 0
using_battery = False
def update_battery():
global battery, using_battery
solar_level = solar_sensor.read()
grid_available = power_pin.value()
# Carrega a bateria se houver bastante luz
if solar_level > 3000 and battery < 100:
battery += 1
# Usa bateria quando falta energia
using_battery = (grid_available == 0 and battery > 0)
# Consumo
if using_battery:
battery -= 1
battery = max(battery, 0)
battery_display.number(battery)
# LED azul indica alimentação pela bateria
solar_led.value(using_battery)
def all_off():
red.off()
yellow.off()
green.off()
solar_led.off()
traffic_display.show(' ')
battery_display.show(' ')
def countdown(seconds):
for i in range(seconds, -1, -1):
update_battery()
# Falta energia e bateria acabou
if power_pin.value() == 0 and battery == 0:
all_off()
return False
traffic_display.number(i)
sleep(1)
return True
while True:
# Sem energia e sem bateria
if power_pin.value() == 0 and battery == 0:
all_off()
sleep(0.1)
continue
# Verde
green.on()
yellow.off()
red.off()
if not countdown(5):
continue
# Amarelo
green.off()
yellow.on()
if not countdown(2):
continue
# Vermelho
yellow.off()
red.on()
if not countdown(5):
continue