36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
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 |