import machine import time class Button(): def __init__(self,pin,onPushDown = None, onPushUp = None,onClick = None,onHold = None,clickTime=300,debounceTimeMs = 50,inputMode = machine.Pin.IN,inverted = False): self.pin = machine.Pin(pin,inputMode) self.debounceTimestamp = -debounceTimeMs self.debounceTimeMs = int(debounceTimeMs) self.clickTime = clickTime self.pushDownTimeStamp = -clickTime self.onPushDown = onPushDown self.onPushUp = onPushUp self.onClick = onClick self.onHold = onHold self.pin.irq(trigger=machine.Pin.IRQ_RISING|machine.Pin.IRQ_FALLING , handler=self._IRQ) self.value = self.pin.value() self.inverted = inverted def _IRQ(self,p): new_value = self.pin.value() time_ms = time.ticks_ms() if (self.value != new_value): self.value = new_value if ((self.debounceTimestamp+self.debounceTimeMs) < time_ms): self.debounceTimestamp = time_ms if (new_value ^ self.inverted): if (self.onPushUp != None): self.onPushUp() if (self.onClick != None and (self.pushDownTimeStamp + self.clickTime > time_ms)): self.onClick() else: if (self.onPushDown != None): self.onPushDown() self.pushDownTimeStamp = time_ms else: pass