Долгое нажатие клавиши

Тема в разделе "Arduino & Shields", создана пользователем ZVEN, 3 май 2017.

  1. ZVEN

    ZVEN Нерд

    Как проще всего отследить нажатие одной клавиши от 5 секунд и выше?
    Надо чтоб подержал 5 секунд, зашел в настройки, там этой же клавишей выставил задержку в сек, задержал на 5 сек и вышел.
    Помогите с кодом плиз.
     
  2. ostrov

    ostrov Гуру

    Засек факт нажатия, засек время, засек факт отжатия проверил время. Куда проще то?
     
  3. vvr

    vvr Инженерище

    да и куча библиотек есть с готовыми решениями по короткому и длительному нажатию кнопки
     
  4. ZVEN

    ZVEN Нерд

    Покажите плиз как засекать время, без библиотек лучше всего
     
  5. ostrov

    ostrov Гуру

    Я пока не за компом. Примерно так, сначала:
    Код (C++):
    unsigned long timerStart = millis();
    Это запомнили время начала. Потом:
    Код (C++):
    if ((timerSart + 5000) <millis()) {
    // тут делаем что то если прошло более 5сек
    } else {
    // тут если менее
    }
    Еще можно завести переменную и инкременировать ее каждые, допустим, 100 мс при опросе кнопки, а потом проверить сколько там натикало. Больше или меньше 50 раз.

    Есть и другие способы.
     
  6. serg_admin

    serg_admin Гик

    Код (C++):


    void myFun(void)
    {
      static uint32_t timer = millis();
      static uint8_t flag = false;
      if (digitalRead(2) && flag) //  Отпущена кнопка
      {
        flag = false;
        if ((millis() - timer) > 5000)
        {
           ...
        }
        else
        {
          ...
        }
      }
      else // Нажата кнопка
      {
         timer = millis();
         flag = true;
      }
    }

    void setup(void)
    {
      attachInterrupt(digitalPinToInterrupt(2), myFun, CHANGE);
    }
     
     
    Последнее редактирование: 3 май 2017
  7. ZAZ-965

    ZAZ-965 Гуру

    В руководстве пишут - Inside the attached function, delay() won't work and the value returned by millis() will not increment.
     
  8. serg_admin

    serg_admin Гик

    Ну да, пока мы внутри функции millis() не будет расти.
    Ну мы ведь там будем меньше миллисекунды?
     
  9. ostrov

    ostrov Гуру

    Антидребезг добавить еще не помешает.
     
    smile нравится это.
  10. serg_admin

    serg_admin Гик

    Мне кажется если ловим 5-ти секундные нажатия, то по сути это время включает атидребезг.
     
    smile нравится это.
  11. Eragon

    Eragon Нерд

    Доброго времени суток! Подскажите можно ли организовать отслеживание короткого и длительного нажатия кнопки используя библиотеку Bounce2.h. Задача организовать переключение устанавливаемых параметров часов и будильника. И этой же кнопкой, при длительном нажатии, устанавливать разрешение на работу будильника. С отслеживанием коротких нажатий проблем никаких! Да и длительное отследить тоже можно, установив к примеру interval(1000) . Но вот как сделать чтоб отслеживалось и то и это не совсем понятно(( Или проще не использовать библиотеку совсем???
     
  12. ostrov

    ostrov Гуру

    Как отслеживать что кнопка была нажата непрерывно. При этом отличать нажатие от дребезга.
     
  13. ostrov

    ostrov Гуру

    Лучше без библиотеки. Выше я описал два способа как отличать, причем оба без delay, то есть не мешают другим задачам.
     
  14. Eragon

    Eragon Нерд

    При таком раскладе антидребезг надо делать для коротких нажатий...
     
  15. qwone

    qwone Гик

    Для того что бы в программе не было глюк-работы надо всегда делать антидребез для любых механических кнопок. А вот после отработки дребезга можно анализировать долгие или короткие нажатия. У вас даже еще веселее. Вы пытаетесь отделить короткие от очень длинных. А это уже конфликт на алгоритмическом уровне. Что бы будете делать с нажатиями не достаточно длиными ,но уже не короткими.:rolleyes:
     
  16. ostrov

    ostrov Гуру

    Если опрашивать циклически через, например 50 мс и закидывать в кольцевой буфер глубиной два, то достаточно отслеживать 01 для старта и 10 для стопа.
     
  17. Eragon

    Eragon Нерд

    Если нажатие недостаточно длинное - значит считать его коротким:)
     
  18. Eragon

    Eragon Нерд

    Не совсем понятно каким образом это реализовать, учитывая ещё и дребезг:(
     
  19. ostrov

    ostrov Гуру

    Это и антидребезг и отличие времени нажатия любой длины с точностью периода итерации, обычно 50 - 100 мс. У меня на таком принципе работает куча приборов, именно с градацией длительности, коротко - направление, длинно - настройка, очень длинно - сброс. Работает давно и не глючит. Кнопки обычные тактовые с дребезгом до 20 мс.
     
  20. qwone

    qwone Гик

    Вернемся к вопросу ТС. Что такое 5 секунд времени. Это для пользователя долго и для процессора вечность. Если процессор будет только занят временем на отслеживания этих 5 секунд, то остальная работа зависнет. Это и приводит нас к работе паралельных подпрограм. И более углубленому изучению в программирования. Разумеется подпрограммы можно разводить на низком коде. При помощи прерываний. Кривой по мне этот метод. Разводить с помощью millis c жесткими выборками. Примитивно, хотя для новичков работает. Но я предпочитаю использовать millis c нежесткой выборкой и использовать большую абстракцию от железа.