import time
from machine import Pin, PWM
# 1. Configurar los pines de los LEDs (Matriz 3x3)
rojos = [Pin(3, Pin.OUT), Pin(4, Pin.OUT), Pin(5, Pin.OUT)]
amarillos = [Pin(6, Pin.OUT), Pin(7, Pin.OUT), Pin(8, Pin.OUT)]
verdes = [Pin(9, Pin.OUT), Pin(10, Pin.OUT), Pin(11, Pin.OUT)]
# 2. Configurar Buzzer en GP28 y Botón en GP27
buzzer = PWM(Pin(28))
boton = Pin(27, Pin.IN, Pin.PULL_UP)
# --- FUNCIONES BÁSICAS ---
def sonar_buzzer(frecuencia, duracion):
"""Hace sonar el buzzer a una frecuencia específica (tono) y por un tiempo"""
if frecuencia > 0:
buzzer.freq(frecuencia)
buzzer.duty_u16(32768) # 50% de ciclo de trabajo (volumen)
time.sleep(duracion)
buzzer.duty_u16(0) # Silenciar al terminar
def set_estado_luces(lista_leds, valor):
"""Enciende (1) o apaga (0) una fila completa de LEDs"""
for led in lista_leds:
led.value(valor)
def apagar_todo():
"""Apaga todas las luces de la matriz"""
set_estado_luces(rojos, 0)
set_estado_luces(amarillos, 0)
set_estado_luces(verdes, 0)
def pausa_revisando_boton(segundos):
"""
Reemplaza al time.sleep() normal.
Espera los segundos indicados, pero si detecta que el botón
es presionado, corta la espera y retorna True inmediatamente.
"""
pasos = int(segundos / 0.1)
for _ in range(pasos):
if boton.value() == 0: # 0 significa que el botón fue presionado (PULL_UP)
return True
time.sleep(0.1)
return False
# --- MODO CARRERA: PI PI PI PIIII ---
def secuencia_carrera():
"""Se activa al presionar el botón: Cuenta regresiva y partida"""
apagar_todo()
time.sleep(0.5) # Breve pausa dramática
# 1er "pi" (Encienden Rojos)
set_estado_luces(rojos, 1)
sonar_buzzer(1000, 0.15)
time.sleep(0.85)
# 2do "pi" (Cambia a Amarillos)
set_estado_luces(rojos, 0)
set_estado_luces(amarillos, 1)
sonar_buzzer(1000, 0.15)
time.sleep(0.85)
# 3er "pi" (Rojos y Amarillos juntos: Tensión máxima antes de partir)
set_estado_luces(rojos, 1)
sonar_buzzer(1000, 0.15)
time.sleep(0.85)
# "PIIII" largo y PARTIDA (Verdes)
apagar_todo()
set_estado_luces(verdes, 1)
sonar_buzzer(1500, 1.5) # Tono agudo y largo
time.sleep(3) # Mantener la luz verde de partida encendida 3 segundos
apagar_todo()
# --- BUCLE PRINCIPAL: SEMÁFORO NORMAL ---
while True:
apagar_todo()
# 1. LUZ ROJA (5 segundos)
set_estado_luces(rojos, 1)
if pausa_revisando_boton(5):
secuencia_carrera()
continue
# 2. LUZ VERDE (5 segundos)
set_estado_luces(rojos, 0)
set_estado_luces(verdes, 1)
if pausa_revisando_boton(5):
secuencia_carrera()
continue
# 3. VERDE PARPADEANTE (3 parpadeos antes del amarillo)
interrumpido = False
for _ in range(6):
for led in verdes:
led.toggle()
if pausa_revisando_boton(0.5):
secuencia_carrera()
interrumpido = True
break
if interrumpido:
continue # Si se interrumpió durante el parpadeo, reinicia el ciclo principal
# 4. LUZ AMARILLA (2 segundos)
set_estado_luces(verdes, 0)
set_estado_luces(amarillos, 1)
if pausa_revisando_boton(2):
secuencia_carrera()
continue