Анти дребезг для кнопок с разным назначением.

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

  1. Timon333

    Timon333 Нуб

    Всем привет.
    Хочу сделать простейшее меню на основе switch case,Три страницы, четыре кнопки. 1я и 2я кнопки листают меню, 3я и 4я уменьшают(выключают) или увеличивают(включают) параметр. С точки зрения написания кода мне все ясно, кроме одного - как реализовать анти дребезг?
    Вот здесь
    http://forum.amperka.ru/threads/Обработка-нажатия-кнопок.17613/
    мне посоветовали скетч для обработки трёх кнопок. Но как применить этот код для кнопок с разным функционалом, не пойму. В скетче, приведенном по ссылке, три кнопки просто меняют состояние параметра led. У меня же, необходимо по факту нажатия изменять минимум два параметра:
    например первые две кнопки листают меню и меняют параметр menu_position т.е. нажатие-
    menu_positiom++; //листаем вперед
    menu_positiom--; //листаем назад
    вторые две кнопки изменяют параметр volue т.е. нажатие-
    volue++ либо меняем состояние, например led = !led;
    volue-- либо меняем состояние, например led = !led;
    Сначала я хотел прописать эти команды, туда, где на приведенном выше скетче, меняется состояние led. Но как тогда программа поймет что при нажатии, скажем первой кнопки надо выполнить только операцию
    menu_positiom++;
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Твоя проблема в том, что ты мешаешь всё в кучу. Борьба с дребезгом никаким образом не должна быть связана с функциональностью кнопок, от слова совсем. Это нужно разделять.

    Сначала отсеките дребезг, а только потом уже чистый сигнал поступает на программу меню. Программе меню совершенно всё равно как ты там боролся с дребезгом, если ей пришёл сигнал от кнопки, значит сигнал подлинный.

    Попробуй так рассуждать и так делать.
     
    Daniil и DetSimen нравится это.
  3. Timon333

    Timon333 Нуб

    А если я создам свою функцию, которая будет заниматься подавлением дребезга и как результат будет возвращать например bool = true; затем выполняется операция в зависимости от того с какого пина пришел сигнал, и в конце сбрасываем флаг. Такая схема действий жизнеспособна?
     
  4. Timon333

    Timon333 Нуб

    Вот такой еще вариант:
    Код (C++):
    #define btnPin1 8
    #define btnPin2 9
    #define btnPin3 10
    #define btnPin3 11

    boolean btnFlag = 0;
    boolean btn;
    boolean led = 0;
    unsigned long lastPress;

    void setup() {
      pinMode(btnPin1, INPUT_PULLUP);
      pinMode(btnPin2, INPUT_PULLUP);
      pinMode(btnPin3, INPUT_PULLUP);
      pinMode(btnPin4, INPUT_PULLUP);
    }

    void loop() {
      for (int pin = 8; pin < 12; pin++)
      {
     
      btn = digitalRead(pin);
      switch (btnFlag)
      {
        case 0:
          if (!btn && millis() - lastPress >= 50)
          {
            lastPress = millis();
            btnFlag = 1;
         
          }
          break;
        case 1:
          if (btn && millis() - lastPress >= 50)
          {
            lastPress = millis();
            btnFlag = 0;
          }
          break;
      }
      }
    }
    но опять таки, как это объединить с моей конструкцией switsh case?
     
    Последнее редактирование: 23 мар 2019
  5. a1000

    a1000 Гуру

    Есть уже готовая библиотека OneButton.h Отрабатывает различные нажатия - и короткие, и длинные, и двойные, и автоповтор. Я цеплял на неё 4 кнопки, нормально работает. В ней ничего сложного, по примерах разберётесь.
     
    arkadyf нравится это.
  6. Timon333

    Timon333 Нуб

    У меня проблема в другом, как интегрировать анти дребезг в мое меню. Я понимаю работу скетча для например 3 кнопок и трех светодиодов. Но у меня другой случай, кнопки выполняют разные действия.
     
  7. a1000

    a1000 Гуру

    В приведенной библиотеке каждое нажатие отрабатывается отдельной функцией. Выставляйте в этих функциях флаги, а дальше уже анализируйте их комбинацию и прописывайте действия. Для лучшего понимания попробуйте нарисовать блок-схему алгоритма работы вашего скетча. Перевести потом это в код не составит труда.
     
  8. Timon333

    Timon333 Нуб

    Спасибо, сейчас попробую.
     
  9. Daniil

    Daniil Гуру

    откуда в когде появился цикл for? Подозреваю, что это вы начали модернизировать. Я бы так же пошел, но в таком случае нужно еще lastPress и btnFlag тоже сделать массивами.
     
  10. qwone

    qwone Гик

    #96 Но не жалуйтесь почему и как.
     
  11. Timon333

    Timon333 Нуб

    То есть lastPress и btnFlag также зациклить через for?
     
  12. qwone

    qwone Гик

    Да , каждая кнопка это свои переменные .Лучше всю кнопку упаковать в класс., а дальше ее размножать. Опять же учитываете, что человек не дятел. И если надо в меню увеличить на 10-20 значение, то стучать столько раз народ не любит.
     
    Daniil нравится это.
  13. a1000

    a1000 Гуру

    Ну так OneButton.h это и делает. И автоповтор при длительном нажатии там в наличии.
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Откуда ж мне знать как именно ты создашь функцию и что там будет за функция. Если интересует грамотная работа с дребезгом (и программно, и аппаратно), то вот, лучшее, что я видел - https://drive.google.com/open?id=0B9r7cRXQ4DU4TVJzQVhOMmtCc00
     
    Daniil и Belkin нравится это.
  15. qwone

    qwone Гик

    С одной стороны OneButton избыточен. Сильно много событий на одну кнопку увязано. С другой стороны не возможно менять обработчик кнопки на каждую ситуации. А ведь новый экран меню это изменение обработчиков кнопок.
     
  16. a1000

    a1000 Гуру

    Всё в руках пользователя. Не хочешь, к примеру, использовать длинное нажатие - не объявляй функцию и она не будет вызываться и т. д.
     
  17. qwone

    qwone Гик

    Все в руках пользователя. Хочешь кушай что есть, или вари сам. А по мне OneButton тяжеловата и горомоздка. И для использования лямды не предназначена.
     
    Daniil нравится это.
  18. Daniil

    Daniil Гуру

    Да.
    Тут открывается простор для фантазии, но рекламируемую выше библиотеку как вариант решения проблемы рассмотрел бы. (я люблю сам писать простые программы, поэтому библиотекой я бы не пользовался, но вам такого советовать не могу)
     
  19. Asper Daffy

    Asper Daffy Иксперд

    Точно? Ну, значит фтопку её!
     
  20. qwone

    qwone Гик

    Код (C++):
      void attachClick(callbackFunction newFunction);
      void attachDoubleClick(callbackFunction newFunction);
      void attachPress(
          callbackFunction newFunction); // DEPRECATED, replaced by longPressStart,
                                         // longPressStop and duringLongPress
      void attachLongPressStart(callbackFunction newFunction);
      void attachLongPressStop(callbackFunction newFunction);
      void attachDuringLongPress(callbackFunction newFunction);
    Можно для лямды использовать это. Но похоже. Это тоже неизвестно широким массам как и лямда-функция.