from machine import Pin
from time import sleep_ms
# Definição dos pinos
CAR_RED_LED = Pin(2, Pin.OUT)
CAR_YELLOW_LED = Pin(4, Pin.OUT)
CAR_GREEN_LED = Pin(5, Pin.OUT)
PERSON_RED_LED = Pin(14, Pin.OUT)
PERSON_GREEN_LED = Pin(12, Pin.OUT)
# CORREÇÃO: Adicionar pull-up interno
PERSON_BUTTON = Pin(13, Pin.IN, Pin.PULL_UP)
# Tempos (em milissegundos)
GREEN_TO_YELLOW_TIMEOUT = 6000
YELLOW_TO_RED_TIMEOUT = 2000
RED_TO_GREEN_TIMEOUT = 6000
isPersonButtonPressed = False
def delay_to_see_pressed_button(timeout_ms):
global isPersonButtonPressed
# CORREÇÃO: Verificar mais frequentemente
check_interval = 100 # Verifica a cada 100ms
checks = timeout_ms // check_interval
for i in range(checks):
sleep_ms(check_interval)
# CORREÇÃO: Com pull-up, botão pressionado = 0 (LOW)
button_state = PERSON_BUTTON.value()
# Debug: mostrar estado do botão (opcional)
if button_state == 0:
print(f"Botão pressionado! Iteração {i}")
isPersonButtonPressed = True
break
def test_button():
"""Função para testar o botão - chame no início"""
print("Testando botão por 10 segundos...")
for i in range(100): # 10 segundos
button_state = PERSON_BUTTON.value()
if button_state == 0:
print(f"BOTÃO PRESSIONADO - Estado: {button_state}")
sleep_ms(100)
print("Teste do botão finalizado")
def setup():
# Inicializa os LEDs em estado conhecido
CAR_RED_LED.off()
CAR_YELLOW_LED.off()
CAR_GREEN_LED.off()
PERSON_RED_LED.off()
PERSON_GREEN_LED.off()
# Teste inicial do botão
print("Estado inicial do botão:", PERSON_BUTTON.value())
setup()
# DESCOMENTE PARA TESTAR O BOTÃO
# test_button()
while True:
# Estado normal: carros passam, pedestre espera
PERSON_RED_LED.on()
PERSON_GREEN_LED.off()
print("Carros: VERDE - Pressione o botão para solicitar travessia")
CAR_GREEN_LED.on()
CAR_RED_LED.off()
CAR_YELLOW_LED.off()
delay_to_see_pressed_button(GREEN_TO_YELLOW_TIMEOUT)
print("Carros: AMARELO")
CAR_YELLOW_LED.on()
CAR_GREEN_LED.off()
delay_to_see_pressed_button(YELLOW_TO_RED_TIMEOUT)
# Se botão pressionado, permite travessia do pedestre
if isPersonButtonPressed:
print("BOTÃO FOI PRESSIONADO! Pedestre pode atravessar")
PERSON_GREEN_LED.on()
PERSON_RED_LED.off()
CAR_RED_LED.on()
CAR_YELLOW_LED.off()
print("Carros: VERMELHO - Pedestre atravessando")
delay_to_see_pressed_button(RED_TO_GREEN_TIMEOUT)
PERSON_GREEN_LED.off()
PERSON_RED_LED.on()
isPersonButtonPressed = False
print("Travessia concluída")
else:
print("Botão NÃO foi pressionado - Ciclo normal")
CAR_RED_LED.on()
CAR_YELLOW_LED.off()
delay_to_see_pressed_button(RED_TO_GREEN_TIMEOUT)
from esp32_i2c_lcd import I2cLcd
# Endereço I2C do LCD (geralmente 0x27 ou 0x3F)
DEFAULT_I2C_ADDR = 0x27
# Configuração do LCD
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16
# Inicializa I2C
i2c = machine.I2C(0, scl=machine.Pin(22), sda=machine.Pin(21), freq=400000)
# Verifica se o LCD está conectado
devices = i2c.scan()
if len(devices) == 0:
print("Nenhum dispositivo I2C encontrado!")
else:
for device in devices:
print("Endereço I2C: ", hex(device))
if device == DEFAULT_I2C_ADDR:
lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)
lcd.putstr("LCD Funcionando!")
print("LCD inicializado e mensagem exibida.")
else:
print("Endereço I2C do LCD não corresponde ao padrão (0x27).")