Антидребезг

Тема в разделе "Arduino & Shields", создана пользователем Timon333, 31 янв 2019.

  1. Timon333

    Timon333 Нуб

    Доброго времени суток.
    Кто нибудь сможет объяснить простым языком, как в этом скетче работает антидребезг? Я уже весь мозг себе сломал. Раньше пользовался этой схемой антидребезга:
    http://wiki.amperka.ru/конспект-arduino:кнопочный-переключатель
    Там мне все понятно. Опрашиваем пин с кнопкой и если условие истина то ставим delay(), контакты успокаиваются и снова считываем.
    А вот другое решение антидребезга:

    if (butt == 1 && butt_flag == 0 && millis() - last_press > 50) //обработка нажатия

    если, к примеру, первые два условия истина, значение millis равно или больше 51, last_press равно 0 тогда 51 - 0 > 50, выражение - истина, выполняется код ниже. А где же пауза для успокоения контактов и повторное считывание кнопки?

    скетч взят здесь




    Код (C++):
    boolean butt_flag = 0;
    boolean butt;
    boolean led_flag = 0;
    unsigned long last_press;


    void setup() {
      pinMode(3, INPUT_PULLUP);
      Serial.begin(9600);
      pinMode(13, OUTPUT);
    }

    void loop() {
      butt = !digitalRead(3);
      if (butt == 1 && butt_flag == 0 && millis() - last_press > 50) //обработка нажатия
      {
        butt_flag = 1;
        Serial.println("Button was pressed");
        led_flag = !led_flag;
        digitalWrite(13, led_flag);
        last_press  = millis();
      }
      if (butt == 0 && butt_flag == 1 && millis() - last_press > 50) //обработка отпускания
      {
        butt_flag = 0;
        Serial.println("Button was released");
    last_press  = millis();
      }
    }
     
    Последнее редактирование: 31 янв 2019
  2. parovoZZ

    parovoZZ Гуру

    вот же она
     
  3. Timon333

    Timon333 Нуб

    Как же
    Как же это происходит? при нажатии кнопки (значение милис больше 50) срузу же выполняется код ниже...
     
  4. b707

    b707 Гуру

    обратите внимание, что значение с пина кнопки инвертировано. Поэтому при первом нажатии условие не выполнится.
    Но по моему. код ошибочный. Первый раз он выполняется вообще без нажатия при старте ардуины...
     
  5. Timon333

    Timon333 Нуб

    Кнопка подключена с подтяжкой при нажатии дает 0, поэтому сигнал переворачиваем, просто для удобства-нажал-1, отпустил-0
     
  6. qwone

    qwone Гик

    Код (C++):
    /**/
    const byte btnPin = 3;
    const byte ledPin = 13;

    boolean btn = false;
    boolean led = 0;
    unsigned long past;
    //----------------------------------
    void setup() {
      Serial.begin(9600);
      pinMode(btnPin, INPUT_PULLUP);
      pinMode(ledPin, OUTPUT);
    }

    void loop() {
      boolean tmp = digitalRead(btnPin);
      switch (btn) {
        case false:
          if (!tmp && millis() - past >= 50) {
            past = millis();
            btn = true;
            Serial.println("Button ON");
            led = !led;
            digitalWrite(ledPin, led);
          }
          break;
        case true:
          if (tmp && millis() - past >= 50) {
            past = millis();
            btn = false;
            Serial.println("Button OFF");
          }
          break;
      }
    }
     
    CYITEP_BAC9I нравится это.
  7. Timon333

    Timon333 Нуб

    все равно не понятно, как она работает...=(
     
  8. qwone

    qwone Гик

    Так научитесь читать код. А без этого здесь делать нечего.
     
  9. parovoZZ

    parovoZZ Гуру

    Надо учиться самому алгоритмы составлять, а не по помойкам шарахаться.
     
  10. SergeiL

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

    Ну да... Здесь погорячился
     
    CYITEP_BAC9I нравится это.
  11. Asper Daffy

    Asper Daffy Иксперд

    А чем это удобнее, чем "нажал - 0, отпустил - 1"?
     
  12. Timon333

    Timon333 Нуб

    прошу прощенья, а что Вы подразумеваете под помойками?
     
  13. Timon333

    Timon333 Нуб

    Лично для меня более понятно, когда при нажатии получаем 1.А так кому как больше нравится)
     
  14. parovoZZ

    parovoZZ Гуру

    Да все эти ютуб каналы и прочие абдурино статьи
     
  15. Timon333

    Timon333 Нуб

    Напишите, пожалуйста, ка эта строчка читается
    if(butt ==1&& butt_flag ==0&& millis()- last_press >50)
     
  16. parovoZZ

    parovoZZ Гуру

    Может, лучше с учебника начать? Сейчас даже на смартфонах приложения есть, где в форме заданий обучение идёт.
     
  17. Timon333

    Timon333 Нуб

    Как я это понимаю:
    если butt - истина и если butt_flag - истина и если millis()- last_press >50 (если в момент нажатия кнопки милис имела значение, к примеру, 1000) т.е. 1000 - 0 > 50 это тоже истина, значит выполняем код ниже.
     
  18. SergeiL

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

    Нет.:)
    Если ((butt РВАВНО единице) И (butt_flag РАВНО 0) И (текущее значение миллис МИНУС последнее значение миллис после нажатия БОЛЬШЕ 50))
     
  19. qwone

    qwone Гик

    Буквы читать научились, а слова из букв нет. Если кнопка в этом лупе нажата, а в прошлом лупе нет и когда время таймера истекло, то сделать следующую последовательность. Ну нельзя же быть блондинкой и помнить только последнее предложение. Скетч вы сами же привели.
     
  20. Timon333

    Timon333 Нуб

    т.е. если перефразировать концовку Вашего сообщения, вот эту вот часть last_press >50 можно назвать (грубо говоря) 50 миллисекунд с момента нажатия?
    Прошу прощения, я знаю, что я тугодум, но очень хочеться разобраться...=)