'''
Programa de ejemplo para definir una ISR para botón
que distinga entre click corto, click largo y doble click
Importante !!!!!!
poner parámetro "bounce": "0" en componente "wokwi-pushbutton"
{
"type": "wokwi-pushbutton",
"id": "btn1",
"top": 118.6,
"left": 115.4,
"rotate": 180,
"attrs": { "bounce": "0", "color": "green", "xray": "1" }
}
'''
import time, micropython
from machine import Pin
micropython.alloc_emergency_exception_buf(100)
button=Pin(22,Pin.IN)
but_on = 0
but_off = 0
but_dur = 0
click_ant = 0
but_dclick = 500 # 2 clicks en 500 ms es doble click
but_long = 500 # un click de 500 ms es long click
click_doble = False
click_corto = False
def Fbut_press(pin):
global but_on, but_dur, but_off, but_dclick, click_ant, click_doble, but_long, click_corto
if pin.value() == 0:
but_on = time.ticks_ms()
but_dur = 0
else:
but_off = time.ticks_ms()
but_dur = time.ticks_diff(but_off, but_on)
if time.ticks_diff(but_off, click_ant) < but_dclick:
click_doble = True
else:
click_doble = False
but_on = 0
click_ant = but_off
if but_dur > but_long:
click_corto = False
else:
click_corto = True
button.irq(handler=Fbut_press, trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING)
while True:
if but_dur > 0: # Todo el bloque del IF se ejecuta cuando se libera boton, o sea un click completo
if time.ticks_diff(time.ticks_ms(), click_ant) > but_dclick: # Espera el tiempo para ver si hay doble click
if click_doble:
print('Doble click')
else:
if not click_corto:
print('Largo')
else:
print('Corto')
but_dur = 0
time.sleep(.1)