38 lines
1.2 KiB
ReStructuredText
38 lines
1.2 KiB
ReStructuredText
|
Debouncing a pin input
|
||
|
======================
|
||
|
|
||
|
A pin used as input from a switch or other mechanical device can have a lot
|
||
|
of noise on it, rapidly changing from low to high when the switch is first
|
||
|
pressed or released. This noise can be eliminated using a capacitor (a
|
||
|
debouncing circuit). It can also be eliminated using a simple function that
|
||
|
makes sure the value on the pin is stable.
|
||
|
|
||
|
The following function does just this. It gets the current value of the given
|
||
|
pin, and then waits for the value to change. The new pin value must be stable
|
||
|
for a continuous 20ms for it to register the change. You can adjust this time
|
||
|
(to say 50ms) if you still have noise. ::
|
||
|
|
||
|
import pyb
|
||
|
|
||
|
def wait_pin_change(pin):
|
||
|
# wait for pin to change value
|
||
|
# it needs to be stable for a continuous 20ms
|
||
|
cur_value = pin.value()
|
||
|
active = 0
|
||
|
while active < 20:
|
||
|
if pin.value() != cur_value:
|
||
|
active += 1
|
||
|
else:
|
||
|
active = 0
|
||
|
pyb.delay(1)
|
||
|
|
||
|
|
||
|
Use it something like this::
|
||
|
|
||
|
import pyb
|
||
|
|
||
|
pin_x1 = pyb.Pin('X1', pyb.Pin.IN, pyb.Pin.PULL_DOWN)
|
||
|
while True:
|
||
|
wait_pin_change(pin_x1)
|
||
|
pyb.LED(4).toggle()
|