Неблокирующее увеличение нажатием одной кнопки

Я ищу способ увеличивать переменную на единицу при каждом нажатии кнопки. Текущий подход следующий:

    if (redButton.isPressed())
    {
        a++;
        delay(100);
    }

isPressed() просто возвращает true, если состояние вывода ВЫСОКОЕ.

delay(100) используется для компенсации небольшого времени нажатия кнопки. В противном случае a будет увеличиваться несколько раз за одно нажатие. Но это блокирующее поведение, моя программа больше ничего не может делать во время этой задержки.

Короче говоря, я хочу добавить метод в свой класс Button, чтобы определить, была ли кнопка "только что отпущена".

, 👍0

Обсуждение

Вы видели библиотеку Bounce2? https://github.com/thomasfredericks/Bounce2, @VE7JRO


1 ответ


Лучший ответ:

1

В вашем подходе нажатие кнопки будет обнаруживаться каждые 100 мс, если вы просто удерживаете кнопку нажатой. Таким образом, вы должны установить флаг при нажатии кнопки. Когда кнопка не нажата, пока установлен ваш флаг, это событие, которое вы ищете. Таким образом, вы можете обнаружить как нажатие кнопки, так и ее отпускание соответственно. Как упомянул @JRobert, между двумя вызовами такой подпрограммы все еще должно быть время, чтобы обеспечить некоторое устранение дребезга кнопок.

bool pressed_flag=false;
bool button_timestamp=millis();
uint16_t button_period=100;

if(millis()-button_timestamp>button_period){
  button_timestamp=millis();
  if(redButton.isPressed() && !pressed_flag){
    // кнопка только что была нажата
    // вы можете сделать что-то. здесь
    pressed_flag=true;
  }
  else if(!redButton.isPressed() && pressed_flag){
    // кнопка только что была отпущена
    // вы можете сделать что-то. здесь
    pressed_flag=false;
  }
}
,

Также используйте либо библиотеку таймеров, либо ручной код с помощью millis(), чтобы вернуться и проверить кнопку через некоторое время. Этот интервал защищает от вибрации или дребезга контактов (несколько входов для одного нажатия). Использование флага предотвращает «обнаружение» одного длительного нажатия кнопки несколько раз. И ваш код все равно не будет заблокирован., @JRobert

@JRobert теоретически мой код уже не блокирует. Но я согласен: это не включает в себя устранение дребезга, и моя процедура должна вызываться только в определенный период., @Sim Son

Согласен - не блокирует. Я просто хотел предложить добавить удаление болтовни к вашему уже подходящему решению. (И меня случайно поймали на отправке частично отредактированного комментария!):, @JRobert

@JRobert, ты абсолютно прав, я добавил то, что ты предложил!, @Sim Son