'''
07.50 - Estado de un botón con interrupción de hardware
Se muestra cómo leer el estado de un botón usando una interrupción de hardware
en lugar de un bucle "while".
Cuando se presiona el botón, el LED se enciende durante 500 mseg.
Componentes
----------
- ESP32
- Botón momentáneo con cuatro pines
- Estos botones suelen venir con cuatro pines:
- 1| |4
- -------
- | / \ |
- | \ / |
- -------
- 2| |3
-
- Conectar los pines 1 o 2 del botón a GPIO4
- Conecte los pines 3 o 4 del botón a GND
- Sin necesidad de resistencia pull/up-down (utilizando pull-up internap)
- Resistencia de 330 Ohm para el LED
- LED de 5 mm
- Conectar ánodo a GPIO 21
- Conecte el cátodo a GND a través de la resistencia
- Alambres
- Protoboard
Tener cuidado:
La IRQ debe estar deshabilitada por un período de tiempo muy corto.
De lo contrario, el perro guardián (WDT) reiniciará el dispositivo.
Curso:
'''
from machine import Pin, disable_irq, enable_irq
from time import sleep_ms
led = Pin(4, Pin.OUT) # Crear una salida para el pin GPIO02
button_pin4 = Pin(2, Pin.IN, Pin.PULL_UP) # Crear una entrada para el pin GPIO04
button_pressed = False
press_counter = 0
def button_pressed_isr(pin):
state = disable_irq()
global button_pressed
global button_pin
global press_counter
button_pressed = True
button_pin = pin
press_counter = press_counter + 1
enable_irq(state)
# identificar el pin, nivel / cambio en señal, función que atiende
button_pin4.irq(trigger=Pin.IRQ_FALLING, handler=button_pressed_isr)
while True:
if button_pressed == True:
button_pressed = False
led.on()
print("Boton presionado en ", button_pin)
print("Presione boton: ", press_counter)
press_counter = 0
sleep_ms(500)
else:
led.off()