38 lines
1.5 KiB
Python
38 lines
1.5 KiB
Python
import machine
|
|
import time
|
|
|
|
class Button():
|
|
def __init__(self,pin,onPushDown = None, onPushUp = 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.setCallbacks(onPushDown,onPushUp)
|
|
self.pin.irq(trigger=machine.Pin.IRQ_RISING|machine.Pin.IRQ_FALLING , handler=self._IRQ)
|
|
self.value = self.pin.value()
|
|
self.inverted = inverted
|
|
|
|
def setCallbacks(self,onPushDown = None, onPushUp = None):
|
|
self.onPushDown = onPushDown
|
|
self.onPushUp = onPushUp
|
|
|
|
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(time_ms-self.pushDownTimeStamp)
|
|
else:
|
|
if (self.onPushDown != None):
|
|
self.onPushDown()
|
|
self.pushDownTimeStamp = time_ms
|
|
else:
|
|
pass
|
|
|
|
def isPushed(self):
|
|
return not (self.pin.value() ^ self.inverted) |