Всем привет!
Помогите, пожалуйста, разобраться с проблемой дребезга контактов.
Есть кнопка, подключенная между пином ESP и землей. Задача - считать количество нажатий кнопки (на самом деле литры воды, но тестирую на обычной кнопке). Тупым опросом пина все работает, но народ в комментариях негодует - говорят нужно pin change interrupt.
Для начала попробовал ловить только falling edge, но все равно при отпускании кнопки из-за дребезга контактов происходят ложные срабатывания. Пробовал также ловить и falling и rising, и даже написал простой фильтр - все равно не работает.
Вот код:
Порой встречается вот такая ситуация
Т.е. при отпускани кнопки прерывание вызывается (по идее при переходе от 0 к 1), но если прочитать из пина значение, то читается 0, что приводит к ложному срабатыванию (код думает, что кнопка опять замкнулась)
ЧЯДНТ? Можно ли как-то узнать почему тригнулось прерывание?
Помогите, пожалуйста, разобраться с проблемой дребезга контактов.
Есть кнопка, подключенная между пином ESP и землей. Задача - считать количество нажатий кнопки (на самом деле литры воды, но тестирую на обычной кнопке). Тупым опросом пина все работает, но народ в комментариях негодует - говорят нужно pin change interrupt.
Для начала попробовал ловить только falling edge, но все равно при отпускании кнопки из-за дребезга контактов происходят ложные срабатывания. Пробовал также ловить и falling и rising, и даже написал простой фильтр - все равно не работает.
Вот код:
Код:
import machine
import utime
pin = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
value = 0
last_value_change_ms = 0
def callback(p):
global value
global last_value_change_ms
pin_state = p.value()
cur_time = utime.ticks_ms()
diff = cur_time - last_value_change_ms
if diff > 500:
print("")
#print("CurTime={}, LastChange={}, Diff={}, State={}".format(cur_time, last_value_change_ms, diff, p.value()))
if diff > 50:
if pin_state == 0:
value += 1
print('pin change', value)
else:
print("Button up")
else:
print("Debouncing...", pin_state)
last_value_change_ms = cur_time
pin.irq(trigger=machine.Pin.IRQ_FALLING | machine.Pin.IRQ_RISING, handler=callback)
prev_value = value
while True:
new_value = value
if new_value != prev_value:
print("Value Changed:", value)
prev_value = value
Код:
pin change 8
Value Changed: 8
pin change 9
Debouncing... 1
Debouncing... 0
Debouncing... 1
Debouncing... 0
Value Changed: 9
ЧЯДНТ? Можно ли как-то узнать почему тригнулось прерывание?