import utime from machine import Pin class Button: DEBOUNCE_MS = 50 DOUBLECLICK_MS = 400 HOLD_MS = 1000 def __init__(self, pin: Pin, inverted=False) -> None: self._pin = pin self._inverted = inverted self._pressed = False self._clicked = False self._doubleclicked = False self._held = False self._debounce = 0 self._hold = 0 self._doubleclick = 0 if self._pin(): self._debounce = utime.ticks_ms() def update(self) -> None: now = utime.ticks_ms() on = bool(self._pin()) if self._inverted: on = not on if on: if self._debounce and now - self._debounce >= self.DEBOUNCE_MS: self._debounce = 0 self._pressed = True self._hold = now elif not self._pressed and not self._debounce: self._debounce = now elif self._hold and now - self._hold >= self.HOLD_MS: self._hold = 0 self._held = True else: if self._pressed: self._pressed = False if self._doubleclick: if now - self._doubleclick <= self.DOUBLECLICK_MS: self._doubleclicked = True self._doubleclick = 0 self._hold = 0 self._held = False else: self._doubleclick = now if self._doubleclick and now - self._doubleclick > self.DOUBLECLICK_MS: if not self._held: self._clicked = True self._doubleclick = 0 self._hold = 0 self._held = False def pressed(self) -> bool: return self._pressed def was_clicked(self) -> bool: if self._clicked: self._clicked = False return True return False def was_double_clicked(self) -> bool: if self._doubleclicked: self._doubleclicked = False return True return False def held(self) -> bool: return self._held if __name__ == "__main__": button = Button(Pin(36, Pin.IN)) while True: button.update() if button.was_clicked(): print("CLICKED") if button.was_double_clicked(): print("DOUBLE-CLICKED") if button.held(): print("HELD") utime.sleep_ms(10)