Как проще всего отследить нажатие одной клавиши от 5 секунд и выше? Надо чтоб подержал 5 секунд, зашел в настройки, там этой же клавишей выставил задержку в сек, задержал на 5 сек и вышел. Помогите с кодом плиз.
Я пока не за компом. Примерно так, сначала: Код (C++): unsigned long timerStart = millis(); Это запомнили время начала. Потом: Код (C++): if ((timerSart + 5000) <millis()) { // тут делаем что то если прошло более 5сек } else { // тут если менее } Еще можно завести переменную и инкременировать ее каждые, допустим, 100 мс при опросе кнопки, а потом проверить сколько там натикало. Больше или меньше 50 раз. Есть и другие способы.
Код (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); }
В руководстве пишут - Inside the attached function, delay() won't work and the value returned by millis() will not increment.
Доброго времени суток! Подскажите можно ли организовать отслеживание короткого и длительного нажатия кнопки используя библиотеку Bounce2.h. Задача организовать переключение устанавливаемых параметров часов и будильника. И этой же кнопкой, при длительном нажатии, устанавливать разрешение на работу будильника. С отслеживанием коротких нажатий проблем никаких! Да и длительное отследить тоже можно, установив к примеру interval(1000) . Но вот как сделать чтоб отслеживалось и то и это не совсем понятно(( Или проще не использовать библиотеку совсем???
Лучше без библиотеки. Выше я описал два способа как отличать, причем оба без delay, то есть не мешают другим задачам.
Для того что бы в программе не было глюк-работы надо всегда делать антидребез для любых механических кнопок. А вот после отработки дребезга можно анализировать долгие или короткие нажатия. У вас даже еще веселее. Вы пытаетесь отделить короткие от очень длинных. А это уже конфликт на алгоритмическом уровне. Что бы будете делать с нажатиями не достаточно длиными ,но уже не короткими.
Если опрашивать циклически через, например 50 мс и закидывать в кольцевой буфер глубиной два, то достаточно отслеживать 01 для старта и 10 для стопа.
Это и антидребезг и отличие времени нажатия любой длины с точностью периода итерации, обычно 50 - 100 мс. У меня на таком принципе работает куча приборов, именно с градацией длительности, коротко - направление, длинно - настройка, очень длинно - сброс. Работает давно и не глючит. Кнопки обычные тактовые с дребезгом до 20 мс.
Вернемся к вопросу ТС. Что такое 5 секунд времени. Это для пользователя долго и для процессора вечность. Если процессор будет только занят временем на отслеживания этих 5 секунд, то остальная работа зависнет. Это и приводит нас к работе паралельных подпрограм. И более углубленому изучению в программирования. Разумеется подпрограммы можно разводить на низком коде. При помощи прерываний. Кривой по мне этот метод. Разводить с помощью millis c жесткими выборками. Примитивно, хотя для новичков работает. Но я предпочитаю использовать millis c нежесткой выборкой и использовать большую абстракцию от железа.