"""Sprint 04 - Pico / MicroPython / Wokwi.
Chaves: esquerda=0, direita=1. Botoes: I=iniciar, P=parar, R=reiniciar.
O LED azul representa a saida que habilitaria a recarga em um sistema real.
Percentual e tempo sao simulados: 1% por segundo nao e uma previsao real.
"""
from machine import Pin, I2C
from time import ticks_ms, ticks_diff, sleep_ms
from logica import Recarga, recomendado
from lcd_i2c import LCD
BATERIA_INICIAL = 40
META = 80
INTERVALO_MS = 1000
class Botao:
def __init__(self, numero):
self.pin = Pin(numero, Pin.IN, Pin.PULL_UP)
self.anterior = self.pin.value()
self.estavel = self.anterior
self.mudou_em = ticks_ms()
def pressionou(self, agora):
valor = self.pin.value()
if valor != self.anterior:
self.anterior = valor
self.mudou_em = agora
if ticks_diff(agora, self.mudou_em) >= 30 and valor != self.estavel:
self.estavel = valor
return valor == 0
return False
def executar():
chaves = [Pin(n, Pin.IN, Pin.PULL_DOWN) for n in (2, 3, 4, 5)]
iniciar, parar, reiniciar = [Botao(n) for n in (6, 7, 8)]
azul, vermelho, verde = [Pin(n, Pin.OUT, value=0) for n in (10, 11, 12)]
lcd = None
try:
lcd = LCD(I2C(0, sda=Pin(0), scl=Pin(1), freq=100000))
except OSError as erro:
print("LCD indisponivel; acompanhe pelo monitor serial:", erro)
recarga = Recarga(BATERIA_INICIAL, META)
ultimo_passo = ticks_ms()
ultima_assinatura = None
print("SPRINT 04 | A=energia B=potencia C=orcamento D=disponibilidade")
print("Chaves: esquerda=0 / direita=1. I=iniciar P=parar R=reiniciar")
print("SIMULACAO: bateria inicial %d%%, meta %d%%, 1%% por segundo" % (BATERIA_INICIAL, META))
try:
while True:
agora = ticks_ms()
entradas = tuple(p.value() for p in chaves)
pedido_inicio = iniciar.pressionou(agora)
pedido_parada = parar.pressionou(agora)
pedido_reset = reiniciar.pressionou(agora)
estado_anterior = recarga.estado
if pedido_reset:
recarga = Recarga(BATERIA_INICIAL, META)
ultimo_passo = agora
pedido_inicio = False
pedido_parada = False
print("REINICIO DO CENARIO: bateria restaurada para %d%%" % BATERIA_INICIAL)
passo = ticks_diff(agora, ultimo_passo) >= INTERVALO_MS
recarga.atualizar(entradas, pedido_inicio, pedido_parada, passo)
if recarga.estado != "CARREGANDO" or estado_anterior != "CARREGANDO" or passo:
ultimo_passo = agora
carga = recarga.saida_carga(entradas)
azul.value(carga)
vermelho.value(recarga.estado in ("BLOQUEADO", "FALHA"))
verde.value(recarga.estado == "CONCLUIDO")
assinatura = (entradas, recarga.estado, recarga.bateria, recarga.motivo)
if assinatura != ultima_assinatura:
print("t=%dms | A=%d B=%d C=%d D=%d | S=%d | %s | bateria=%d%% | meta=%d%% | carga=%d | %s" % (
agora, entradas[0], entradas[1], entradas[2], entradas[3],
recomendado(*entradas), recarga.estado,
recarga.bateria, recarga.meta, carga, recarga.motivo))
ultima_assinatura = assinatura
if lcd:
linha1 = {"AGUARDANDO": "Pronto: INICIAR", "CARREGANDO": "Carregando...",
"INTERROMPIDO": "Carga pausada", "CONCLUIDO": "Meta atingida",
"BLOQUEADO": "Bloqueado", "FALHA": "Falha: suspensa"}[recarga.estado]
linha2 = "Bat:%d%% Meta:%d%%" % (recarga.bateria, recarga.meta)
if recarga.estado in ("BLOQUEADO", "FALHA"):
linha2 = recarga.motivo.split(" / ")[0]
try:
lcd.mostrar(linha1, linha2)
except OSError as erro:
print("Falha no display:", erro)
lcd = None
sleep_ms(10)
finally:
azul.off()
vermelho.off()
verde.off()
executar()
A - Energia suficiente
B - Potencia compativel
C - Dentro do orcamento
D - Carregador disponivel
SPRINT 04 - Recarga inteligente | Pico + MicroPython
Chaves: esquerda = 0 | direita = 1
REINICIAR restaura a bateria para o teste