bouton-interruption.py
El botón cableado a GP15 alterna el LED mediante una interrupción hardware (irq): no se pierde ningún ciclo de CPU escrutando el pin. Un filtro de 50 ms dentro del handler elimina los rebotes mecánicos del contacto.
Hardware
Una placa genérica con microcontrolador RP2350 (doble Cortex-M33) programada en MicroPython. 1 botón pulsador (una pata a GP15, la otra a GND).
Cableado
Botón entre GP15 y GND; la resistencia de pull-up la activa Pin.PULL_UP en la placa.
Funcionamiento
BTN.irq se dispara con el flanco de bajada (pulsación a masa). El handler compara time.ticks_ms() con el último flanco, ignora rebotes de menos de 50 ms e invierte el estado del LED.
Ejecución
Graba la versión MicroPython « RP2350 » vía BOOTSEL (.uf2) y copia el script en la unidad. El pin del LED de usuario varía según el fabricante: consulta la documentación de la placa.
Variantes
Cambia el disparo a Pin.IRQ_RISING | Pin.IRQ_FALLING para contar todos los flancos, o apila varios botones con un handler por pin.
bouton-interruption.py
# Bascule LED sur appui bouton : interruption materielle + anti-rebond.
from machine import Pin
import time
BTN = Pin(15, Pin.IN, Pin.PULL_UP) # bouton vers GND
LED = Pin(25, Pin.OUT)
etat_led = [0] # liste mutable : modifiable dans le handler
dernier = [0] # horodatage du dernier front valide
def sur_appui(pin):
maintenant = time.ticks_ms()
# Anti-rebond : on ignore les fronts de moins de 50 ms apres le dernier.
if time.ticks_diff(maintenant, dernier[0]) < 50:
return
dernier[0] = maintenant
etat_led[0] = 1 - etat_led[0]
LED.value(etat_led[0])
print("Appui -> LED", "ON" if etat_led[0] else "OFF")
BTN.irq(trigger=Pin.IRQ_FALLING, handler=sur_appui)
print("Pret : appuyez sur le bouton (GP15)")
while True:
time.sleep_ms(100) # le handler s'execute en interruption