"""
PROGRAMA: CONTROL DE MÓDULO RELEVADOR CON BOTÓN
Descripción: Este programa permite controlar un módulo relevador conectado a una
Raspberry Pi Pico W mediante un botón. Incluye funcionalidad antirebote (debounce)
y control del LED integrado para feedback visual.
"""
# --- SECCIÓN 1: IMPORTACIÓN DE LIBRERÍAS NECESARIAS ---
from machine import Pin # Para controlar los pines GPIO
import time # Para manejar retardos y tiempos
# --- SECCIÓN 2: CONFIGURACIÓN INICIAL DE HARDWARE ---
# Configura el pin del relevador (GPIO 0 como salida)
relevador = Pin(0, Pin.OUT)
relevador.off() # Asegura que el relevador comience apagado
# Configura el pin del botón (GPIO 12 con resistencia pull-up interna)
boton = Pin(12, Pin.IN, Pin.PULL_UP)
# Configura el LED integrado en la Pico W (GPIO 14 como salida)
led_integrado = Pin(14, Pin.OUT)
led_integrado.off() # Comienza con el LED apagado
# --- SECCIÓN 3: VARIABLES GLOBALES ---
estado_relevador = False # False = relevador apagado, True = relevador encendido
ultimo_tiempo_presion = 0 # Para controlar el debounce del botón
# --- SECCIÓN 4: FUNCIÓN DE INTERRUPCIÓN PARA EL BOTÓN ---
def manejar_boton(pin):
"""
Función que se ejecuta cuando se presiona el botón.
Cambia el estado del relevador y proporciona feedback visual.
"""
global estado_relevador, ultimo_tiempo_presion
# Obtiene el tiempo actual en milisegundos
tiempo_actual = time.ticks_ms()
# Verificación antirebote (debounce) - ignora pulsaciones muy cercanas
if tiempo_actual - ultimo_tiempo_presion > 300: # 300ms de delay antirebote
# Cambia el estado del relevador
estado_relevador = not estado_relevador
# Actualiza el relevador según el nuevo estado
if estado_relevador:
relevador.on() # Activa el relevador
led_integrado.on() # Enciende el LED integrado
print("Relevador ACTIVADO")
else:
relevador.off() # Desactiva el relevador
led_integrado.off() # Apaga el LED integrado
print("Relevador DESACTIVADO")
# Actualiza el tiempo de la última pulsación válida
ultimo_tiempo_presion = tiempo_actual
# --- SECCIÓN 5: CONFIGURACIÓN DE INTERRUPCIÓN ---
# Configura la interrupción para que se active en el flanco de bajada (cuando se presiona el botón)
boton.irq(trigger=Pin.IRQ_FALLING, handler=manejar_boton)
# --- SECCIÓN 6: BUCLE PRINCIPAL ---
print("Sistema de control de relevador iniciado")
print("Presione el botón para activar/desactivar el relevador")
try:
while True:
# El programa principal no necesita hacer nada
# ya que la interrupción maneja todo
time.sleep(0.1) # Pequeña pausa para reducir el consumo de CPU
except KeyboardInterrupt:
# Maneja la interrupción por teclado (Ctrl+C)
print("\nApagando el sistema...")
relevador.off() # Asegura que el relevador se apague
led_integrado.off() # Apaga el LED integrado
print("Sistema apagado correctamente")