Найти в Дзене
Андрей Андреич

Короткое и длительное нажатие на кнопку в среде Arduino IDE.

В этой статье расскажу как с помощью одной кнопки выполнять два различных действия: одно при коротком нажатии на кнопку и второе при длительном удержании кнопки (нажатой более одной секунды или другого нужного вам времени). Подключения кнопки к Arduino. Прежде всего понадобиться собрать схему состоящею из кнопки, двух светодиодов и трех резисторов. Резисторы R2 и R3 нужны для ограничения тока, проходящего через светодиоды. Сопротивление R1 это резистор подтяжки, он необходим для того, что бы пин к которому подключена кнопка, не "висел в воздухе" и не ловил всевозможные наводки. В теории от этого резистора можно отказаться, использовав внутренний резистор Ардуино (команда: pinMode(12, INPUT_PULLUP); ) и замыкать его на землю кнопкой. Но, при таком подключении изменится логика работы программы: кнопка нажата на входе — 0, кнопка отпущена на входе +5V. Сейчас остановимся на первом варианте с использованием дополнительного резистора. Обработка короткого нажатия на кнопку. Прежде всего дади
Оглавление

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

Подключения кнопки к Arduino.

Прежде всего понадобиться собрать схему состоящею из кнопки, двух светодиодов и трех резисторов.

Рисунок №1. Схема.
Рисунок №1. Схема.
Рисунок №2. Схема в железе.
Рисунок №2. Схема в железе.

Резисторы R2 и R3 нужны для ограничения тока, проходящего через светодиоды. Сопротивление R1 это резистор подтяжки, он необходим для того, что бы пин к которому подключена кнопка, не "висел в воздухе" и не ловил всевозможные наводки. В теории от этого резистора можно отказаться, использовав внутренний резистор Ардуино (команда: pinMode(12, INPUT_PULLUP); ) и замыкать его на землю кнопкой.

Рисунок №3. Схема подключения кнопки без использования дополнительного резистора.
Рисунок №3. Схема подключения кнопки без использования дополнительного резистора.

Но, при таком подключении изменится логика работы программы: кнопка нажата на входе — 0, кнопка отпущена на входе +5V. Сейчас остановимся на первом варианте с использованием дополнительного резистора.

Обработка короткого нажатия на кнопку.

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

short_button_click.py
-5

Первая строка зажигает и гасит зеленый светодиод руководствуясь логической переменной Green_LED, которая хранит его состояние. Затем микроконтроллер считывает состояние кнопки: нажата или отпущена.

Далее мы имеем два условия. В первом условие выполняется код если кнопка нажата, но не была нажата до этого. Второе условие будет выполнено если отпустить кнопку.

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

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

Обработка длительного нажатия на кнопку.

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

long_button_press.py
-6

В начале кода добавлена строка зажигающая и гасящая красный светодиод. Затем, как и в случае с коротким нажатием на кнопку, считывается её состояние и при сохранении всех условий переменной press_flag присваивается единица (true).

Далее, если кнопку продолжают удерживать более 1 секунды, то происходит обработка события, наступающего при длительном удержании кнопки и присвоение переменной long_press_flag единицы.

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

В том случае если произведено долговременное нажатие на кнопку, то при её отпускании переменным press_flag и long_press_flag просто присваиваются false, так как код события уже выполнен в момент длительного нажатия на кнопку.

Теперь при кратковременном нажатии на кнопку будет загораться и гаснуть зелёный светодиод. А при длительном нажатии на кнопку — красный. Вместе с тем эти события будут происходить независимо друг от друга.

Далее для удобства копирования и использования приведен весь код без комментариев:

long_button_press_(no comments).py