Как различить кратковременное нажатие кнопки от длинного?

Тема в разделе "Arduino & Shields", создана пользователем Suyano, 10 авг 2018.

  1. Suyano

    Suyano Нерд

    Доброго времени суток! Есть кнопка, кратковременное нажатие которой должно запускать одну часть кода, долговременное нажатие другую.

    Код (C++):
            if(auth == true) {
            if(btncheck == false) {
              if(digitalRead(BTN) == HIGH) {  
                btntimer = millis();
                btncheck = true;
              }
            }
            if((millis() - btntimer) >= 100 && btncheck == true) {
              if(digitalRead(BTN) == HIGH) {
                Serial.println("<320>"); // Кратковременное нажатие на кнопку
                btncheck = false;
              } else {
                btncheck = false;
              }
            }
          }
    Сейчас программа разлчичает только кратковременное нажатие. Как сделать так, чтобы на одной кнопке могло работать несколько режимов?
     
  2. считать время между нажатием и отпусканием
     
  3. b707

    b707 Гуру

    Различать нажатие и отпускание кнопки.
    В момент нажатия запоминать время, в момент отпускания опять засекать и сравнивать со временем нажатия и в зависимости от разницы делать одно или другое действие.
     
    Daniil и arkadyf нравится это.
  4. b707

    b707 Гуру

    что ж вы исправили-то? а я только написал коммент про ваш код...
     
  5. хорошо что эту ахинею никто больше не увидел).
     
  6. Suyano

    Suyano Нерд

    А как быть с дребезгом в этом случае?
     
  7. можно коротким нажатием считать что-нибудь около 100мс
     
  8. Suyano

    Suyano Нерд

    Вот
    Код (C++):
          if(btncheck == false) {
            if(digitalRead(BTN) == HIGH) {  
              btntimer = millis();
              newtimer = false;
              btncheck = true;
            }
          }
          if((millis() - btntimer) >= 100 && btncheck == true) {
            if(digitalRead(BTN) == HIGH && newtimer == false) {
              newtimer = true;
            } else {
              btncheck = false;
            }
            if(newtimer == true) {
              if((millis() - btntimer) >= 1000) {
                if(digitalRead(BTN) == LOW) {
                  Serial.println("BTN Switch Short"); // Короткое нажатие
                  btncheck = false; // Остановка таймера
                } else if((millis() - btntimer) >= 5000) {
                  if(digitalRead(BTN) == HIGH) {
                    Serial.println("BTN Switch Long"); // Длинное нажатие
                    btncheck = false; // Остановка таймера
                  }
                }          
              }
            }
          }
    Я правильно мыслю?
     
  9. SergeiL

    SergeiL Оракул Модератор

    На самом деле, после короткого нажатия на кнопку, нужно выполнять действие которое должно выполняться по короткому нажатию, Можно еще и пикнуть, если есть чем.

    А вот если кнопку удерживают и не отпускают, то, через какое-то время, нужно выполнить то действие которое
    Вы хотите выполнить по длинному нажатию.

    Иначе, получится, что действие по короткому нажатию, Вы будите выполнять по отпусканию кнопки, а это не комфортно, нет ощущений в момент срабатывания кнопки.
     
    Последнее редактирование: 10 авг 2018
    arkadyf и Suyano нравится это.
  10. Suyano

    Suyano Нерд

    Да, у меня есть светодиодная индикация.
     
  11. parovoZZ

    parovoZZ Гуру