Программное обеспечение, устраняющее дребезг кнопки при отпускании

У меня возникли проблемы с программным устранением дребезга на Arduino UNO. В моем коде есть условие, при котором нежелательный дребезг регистрируется как нажатие кнопки.

Я использую прерывание для нажатия кнопки, так как мой основной цикл иногда имеет большие задержки, если выполняются определенные условия. Я прикрепил вывод 2 к своему прерыванию следующим образом:

#define BTN 2
pinMode(BTN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BTN),buttonClick, FALLING);

И моя функция прерывания:

volatile unsigned long _lastClick = 0;    
void buttonClick()
{
  unsigned long _clickTimer = millis();
  if (_clickTimer - _lastClick > DEBOUNCE) 
  {
    _timer = 0;
    _count++;
    _lcd.setCursor(0, 1);
    _lcd.print(_count);
    _softSerial.println("stuff");
  }
  _lastClick = _clickTimer;
}

Это работает просто отлично при нажатии кнопки. Однако это не учитывает отскок при отпускании кнопки. Поэтому иногда, если я удерживаю кнопку нажатой достаточно долго, а затем отпускаю, отскок от нажатия клавиши также регистрируется как падающий фронт.

Все работает просто отлично, если нажатие кнопки достаточно короткое, чтобы попасть в предел, установленный DEBOUNCE. Каков наилучший способ гарантировать, что прерывание не будет вызвано при нажатии кнопки? Без добавления пассивных элементов в мою схему, таких как конденсаторы?

, 👍0


1 ответ


1

Непроверенная идея: распознавать нажатие кнопки только по заднему фронту, который следует длительный период HIGH. Для этого вам придется:

  • присоедините обработчик прерываний к событиям CHANGE

  • обновлять _lastClick при каждом таком событии

  • подтверждать нажатие, если время DEBOUNCE истекло и Входная строка читает LOW.

Примечание: делать длинные вещи (например, печатать на SoftSerial или LCD) в контексте прерывания.

,