Ардуино длительность нажатия кнопки

Долгое нажатие на кнопку. Урок 10. Ардуино

Привет! Что еще можно сделать с кнопкой? Можно нажать, можно отпустить. Можно нажать много раз. А можно нажать и удерживать. Давайте запрограммируем долгое нажатие на кнопку и разные сценарии в зависимости от времени нажатия.

В предыдущем уроке мы уже написали скетч для мультиклика по кнопке. Сегодня мы улучшим эту программу и добавим возможность обработать долгое нажатие. Так что, посмотрите предыдущий урок, если вы пропустили их или уже забыли.

Чтобы выполнить этот урок нам понадобятся.

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • 4 резистора номиналом 220 Ом
  • RGB светодиод
  • Кнопка
  • Кабель USB

Схема и программа

Опять подключим кнопку к Ардуино по уже знакомой схеме. Используем стягивающий резистор. Но давайте сегодня добавим RGB светодиод и запрограммируем управление им.

Принципиальная схема подключения кнопки и RGB светодиода

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

Для одиночного нажатия сделаем функцию rgbRand Она будет включать случайный цвет на светодиоде.

Сделаем так, чтобы функция, которая обработает долгое нажатие будет создавать сияние светодиода разными цветами. И, наконец, если длительность клика будет больше 5 секунд, светодиод будет выключаться.

Долгое нажатие

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

Разумеется, добавим сценарий для удержания кнопки в функцию проверки клика.

Она будет вызывать обработчик события и передавать в него количество миллисекунд. То время, которое кнопка была нажата.

Теперь осталось только добавить обработчик и объявить необходимые переменные.

RGB светодиод

Несомненно, добавим в программу нужные для управления светодиодом переменные и функции. Настроим контакты Ардуино на вывод.

Функции для управления светодиодом будут следующие. Вы без проблем сможете изменить их по-своему, чтобы попрактиковаться.

И, не забудьте изменить функции вызова после обработки нажатий на кнопку.

Полный текст программы

Заключение

Сегодня мы дополнили программу управления кнопкой на Ардуино. Теперь наш скетч может обработать долгое нажатие на кнопку и выполнять разные функции в зависимости только лишь от длительности нажатия.

Источник

Arduino.ru

Длительность и количество нажатий кнопки….

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Подскажите, пожалуйста, как проще всего реализовать обработку нажатий кнопки по такому алгоритму:

— одно короткое (меньше 1 с.) – переключение первого выхода
— два коротких с интервалом до 500 мс — переключение второго
— один длинный (1 с или больше) — переключение третьего
— два длинных (1 с. или больше) с интервалом до 500 мс переключение четвертого

Знаю, что обработать несколько нажатий (без учета длительности) можно при помощи введения дополнительной переменной – об этом написано тут. А как обрабатывать с учетом длительности нажатия? Подскажите, пожалуйста, если не трудно! Заранее спасибо!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Считайте длительность нажатия кнопки и сравнивайте с эталоном (естественно плюс-минус не забудьте). Если длительность соответствует эталону, засчитываем нажатие как короткое или длинное и считаем паузу. Если пауза менее паузы завершения команды, считаем следующее нажатие и увеличиваем соответствующий счетчик. Потом опять паузу и так до тех пор пока пауза не превысит значение завершения команды.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Большое спасибо за подсказку. Код пока ещё не совтавил, но думаю, что понадобится использовать как минимум пять переменных.

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вы так над каждой переменной размышляете? Рано Вам еще. Делайте больше переменных, больше кода, потом исправляйте ошибки, анализируйте и упрощайте..

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Отвлекитесь от «двух-длинных-двух-коротких», стремитесь к универсальности. Я бы, например, «ловил» все нажатия кнопки подряд, сохраняя нажатия, и «вдвигая» их в какую-нибудь переменную — «0» для короткого нажатия, «1» для длинного.

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

Только переменную лучше двигать начиная не с нулевого значения, а с 00000001b, иначе не получится отличить, например, одно короткое нажатие от нескольких.

Во, напридумывал. Интересно, понятно что-нибудь? :)

Источник

Работа с кнопками

Кнопка является простейшим устройством, при помощи которого можно управлять ходом программы на микроконтроллере, но физически она выполняет очень простую функцию: замыкает и размыкает контакт. Кнопки бывают нескольких типов:

  • С фиксацией – кнопка остаётся нажатой после отпускания, без фиксации – отключается обратно.
  • Нормально разомкнутая (Normal Open, NO) – при нажатии замыкает контакты. Нормально замкнутая (Normal Closed, NC) – при нажатии размыкает контакты.
  • Тактовые кнопки – замыкают или размыкают контакт. У обычных тактовых кнопок ноги соединены вдоль через корпус (см. картинку ниже). Переключатели – обычно имеют три контакта, общий COM, нормально открытый NO и нормально закрытый NC. При отпущенной кнопке замкнута цепь COM-NC, при нажатой замыкается COM-NO.

Подключение и подтяжка

Из урока про цифровые пины вы помните, что микроконтроллер может считывать напряжение со своей ноги. Соответственно кнопка может подать на пин тот уровень, к которому подключена её вторая нога. В том же уроке мы обсуждали, что не подключенный никуда цифровой пин принимает наводки из воздуха, и считанное с него значение будет практически случайным. То есть подключив к пину 5V (сигнал высокого уровня) через кнопку, мы ничего не добьёмся: при нажатой кнопке на пине будет считываться четкий сигнал высокого уровня, а при отпущенной – случайное значение. Для решения этой проблемы существует такое понятие, как подтяжка (pull) пина. Подтяжка выполняется к земле (pull down) или питанию (pull up) микроконтроллера при помощи резистора. Подтяжка выполняется противоположно принимаемому сигналу, т.е. если нужно ловить высокий сигнал, подтяжка выполняется к земле, если ловить нужно сигнал земли – подтяжка выполняется к питанию. Вот два варианта подключения кнопки, с подтяжкой к VCC и GND соответственно: Как выбирается сопротивление резистора? Тут всё очень просто: при нажатии на кнопку через резистор потечёт ток, так как в любом случае замыкается цепь питание-земля. Чем выше ток, больше потери энергии и нагрев резистора, а это никому не нужно, поэтому сопротивление резистора подтяжки обычно выбирается в диапазоне 5-50 кОм. Если ставить больше – подтяжка может не обеспечить стабильный уровень сигнала на пине, а если ставить меньше – будут больше потери энергии в нагрев резистора: при сопротивлении в 1 ком через него потечёт ток величиной 5 В/1000 Ом = 5 мА, для сравнения плата Ардуино с МК в активном режиме потребляет 20-22 мА. Чаще всего для подтяжки используется резистор на 10 кОм. Как вы помните из урока о цифровых пинах, у МК AVR есть встроенные резисторы для всех GPIO, эти резисторы подключены к питанию (к VCC), то есть буквально дублируют первую схему из этого урока и позволяют не использовать внешний резистор. У микроконтроллеров другой архитектуры бывает подтяжка к GND, или вообще может не быть внутренней подтяжки. При использовании подтяжки к питанию мы получим инвертированный сигнал – функция digitalRead() вернёт 1 при отпущенной кнопке, и 0 при нажатой (при использовании нормально-разомкнутой кнопки). Давайте подключим кнопку на пин D3 (и GND):

Алгоритмы

Отработка нажатия

В большинстве реальных применений работать с текущим состоянием кнопки очень неудобно, например когда действие должно быть выполнено однократно при нажатии на кнопку, т.е. по клику. Чуть усложним конструкцию, добавив один флаг, который будет помнить состояние кнопки. Такая конструкция позволяет отслеживать нажатие и отпускание кнопки и реагировать на них однократно:

Дребезг контактов

Кнопка не идеальна, и контакт замыкается не сразу, какое-то время он “дребезжит”. Прогоняя данный алгоритм, система опрашивает кнопку и условия приблизительно за 6 мкс, то есть кнопка опрашивается 166’666 раз в секунду! Этого достаточно, чтобы получить несколько тысяч ложных срабатываний. Избавиться от дребезга контактов можно как аппаратно, так и программно: аппаратно задача решается при помощи RC цепи, то есть резистора (

1-10k) и конденсатора (

100nF). Выглядит это следующим образом:

Программно можно ввести простейший таймер нажатия, основанный на millis() , время гашения дребезга примем 100 миллисекунд. Вот так будет выглядеть код:

Рекомендуется конечно же использовать аппаратный способ, так как он не нагружает ядро лишними расчетами. В 99.99% проектов будет достаточно программного антидребезга, так то смело используйте конструкцию с millis() .

“Импульсное” удержание

В устройствах с управлением кнопкой очень часто бывает нужна возможность изменения значения как однократно кликом по кнопке, так и “автоматически” с тем же шагом – при удержании. Такой вариант реализуется очень просто, добавлением ещё одного условия в наш предыдущий алгоритм, а именно: если кнопка была нажата, но ещё не отпущена, и прошло времени больше, чем задано – условие вернёт true . В примере ниже периодичность “нажатий” при удержании настроена на 500 миллисекунд (2 раза в секунду):

Пользоваться таким кодом напрямую будет неудобно, поэтому можно “обернуть” его в класс (читай урок про классы и урок про написание библиотек).

Простейший класс кнопки

Вот так предыдущий пример можно сделать классом (мы делали это вот в этом уроке), положить его в отдельный файл (button.h) и пользоваться:

Другие возможности кнопки

Кнопка только с виду кажется простым устройством, дающим 0 и 1, но, подключив фантазию и время, можно придумать гораздо больше применений обычной кнопке. В моей библиотеке GyverButton реализовано очень много всяких интересных возможностей по работе с кнопкой, вот список:

  • Работа с нормально замкнутыми и нормально разомкнутыми кнопками
  • Работа с подключением PULL_UP и PULL_DOWN Опрос кнопки с программным антидребезгом контактов (настраиваемое время)
  • Отработка нажатия, удерживания, отпускания, клика по кнопке (+ настройка таймаутов)
  • Отработка одиночного, двойного и тройного нажатия (вынесено отдельно)
  • Отработка любого количества нажатий кнопки (функция возвращает количество нажатий)
  • Функция изменения значения переменной с заданным шагом и заданным интервалом по времени
  • Возможность работы с “виртуальными” кнопками (все возможности библиотеки используются для матричных и резистивных клавиатур)

Подробное описание библиотеки можно почитать в заголовочном файле на странице библиотеки, также там есть много примеров.

Аналоговые клавиатуры

Аналоговые клавиатуры – достаточно глубокая тема, достойная отдельного урока (у меня его пока что нет). Максимально подробный урок-исследование можно посмотреть на сайте Codius.

Видео


Источник

Уроки Ардуино. Индикатор времени нажатия кнопки.

Уроки Ардуино. Индикатор времени нажатия кнопки.

Это четвертый урок курса и здесь мы будем использовать только компоненты из предыдущих уроков. А значит владельцы любого из наборов серии «Дерзай» (« Базовый «, « Изучаем Arduino » и « Умный дом «) смогут его повторить. Уже на следующем уроке мы приступим к созданию первой игры на Arduino, а на уроке нам надо получить навыки по измерению времени нажатия кнопок. Они нам пригодятся при написании игры.

Мы создадим проект «Индикатор времени нажатия кнопки». Для данного проекта Вам понадобятся следующие детали, которые имеются в каждом из наборов Arduino :

  1. Arduino Uno;
  2. Кабель USB;
  3. Плата прототипирования;
  4. Провода «папа-папа» — 15 шт;
  5. Резисторы 220 Ом – 8 шт;
  6. Светодиоды – 8 шт;
  7. Кнопка – 2 шт;
  8. Резисторы 10 кОм – 2 шт;
  9. Потенциометр.

В качестве индикатора мы будем использовать шкалу из 8 светодиодов. Можно время нажатия кнопки измерять в секундах. Тогда для нажатия 1 секунда необходимо зажечь 1 светодиод, для времени нажатия 8 секунд – 8 светодиодов. Мы немного усложним задание и будем измерять время нажатия кнопки в условных единицах, например условная единица может принимать значение от 500 миллисекунд до 2 секунд. Значение условной единицы мы будем регулировать потенциометром, используя его в качестве аналогового датчика ( см. Урок 3 ).

В программе 2 режима:
Режим 0 — ожидание – ждем нажатия первой кнопки. Индикация на светодиодной шкале предыдущего измерения.
Режим 1 — измерение – начинается по нажатию первой кнопки (отображение уровня на шкале горящими светодиодами). При отжатии кнопки подсчет останавливается и переходим в режим 0.
Режим 2 — установка уровня условной единицы – устанавливаем потенциометром значение условной единицы (отображение уровня на шкале мигающими светодиодами).
Будем использовать две кнопки. Нажатие на вторую кнопку – переключение из режима измерения в режим установки условной единицы и обратно. Во время режима 2, измерения времени нажатия первой кнопки не происходит.
Собираем схему, показанную на рисунке 1.

Рисунок 1. Схема соединений

Теперь приступим к написанию скетча.
В основном цикле прораммы – проверка факта нажатия или отжатия кнопки. И установка по этим событиям режима работы программы (0, 1 или 2). Далее в основном цикле программы для режима 1 проверяем время нажатия, переводим его в показания шкалы и вызываем функцию setleds() для индикации. Для режима 2 проверяем показания потенциометра (значение на аналоговом входе A0) и переводим их в значение условной единицы, а также переводим их в показания шкалы, при этом индикация идет с миганием с периодичностью 500 мсек.
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 1

После загрузки жмем кнопку и наблюдаем увеличение значение на шкале светодиодов. В режиме 2 с помощью потенциометра устанавливаем значение условной единицы (скорость прироста значения времени нажатия) (см. рисунок 2,3).

Рисунок 2,3. Индикатор времени нажатия кнопки

На следующем уроке мы приступим к написанию игры на Arduino под названием ping-pong.

Источник

Adblock
detector