Как работает нажатие кнопки?

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем SkyWeb, 3 янв 2018.

  1. SkyWeb

    SkyWeb Нуб

    Всем привет! И всех с Новым годом.

    Подскажите пожалуйста:
    Я сделал чтобы при нажатии на кнопку включался светодиод, при повторном нажатии, выключался. Все работает но есть вопрос на который я не смог найти ответ.

    Код (C++):
    int but = 12;
    int led = 11;
    int curr_but = LOW;
    int prev_but = LOW;
    int st_led = LOW;

    void setup() {
      pinMode(but, INPUT);
      pinMode(led, OUTPUT);
    }

    void loop() {
      curr_but = digitalRead(but);
      delay(10);
      if (curr_but == HIGH && prev_but == LOW) {
          st_led = !st_led;
      }
      prev_but = curr_but;
      digitalWrite(led,st_led);
    }
    При первом нажатие:
    Текущее состояние - HIGH, предыдущее - LOW = условие верное, значит меняем состояние диода, и в переменную прошлого состояния записываем текущее.

    При втором нажатии:
    Текущее состояние - HIGH, предыдущее HIGH (мы его изменили в первом нажатие), почему тогда светодиод выключается? ведь условие st_led = !st_led; не должно срабатывать.

    Вот не могу понять как это работает. Объясните пожалуйста.
     
  2. Vvlad1973

    Vvlad1973 Нуб

    Обычная защита от дребезга. prev_but переопределяется при каждой итерации цикла. Нажали на кнопку - оно равно HIGH, отпустили - LOW.
     
  3. ostrov

    ostrov Гуру

    Сделайте задержку между опросами кнопки 50мс.
     
  4. Igor68

    Igor68 Гуру

    Да и добавьте всё-таки "флаг" прошлого состояния... если они идентичны, то ничего не делаем.
     
  5. ostrov

    ostrov Гуру

    Я думаю дело в дребезге. Программа отслеживает нажатие, флаг тут не нужен (вернее, он уже есть), но иногда за одно нажатие фактически их несколько. Сделайте задержку и будет вам счастье.
     
  6. SergeiL

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

    А цыклические буфера? Как же без них? :)
     
    Igor68 нравится это.
  7. ostrov

    ostrov Гуру

    Ну по сути и он там есть.
     
  8. Igor68

    Igor68 Гуру

    Нууууу в лес, так в лес! А вообще хотел на рыбалку! С праздником и...... не пейте больше меня:D