Найти тему
ТехноБобёр

Многофункциональность кнопок. Работа с функциями в Arduino IDE.

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

Самым ярким примером является классический мобильный телефон. Кнопок у него мало, но с их помощью набираются и весь алфавит, и все цифры, и различные смайлики. Про перемещение по мени с настройками и говорить не приходится. Как такое достигается? Не так уж и сложно. Давайте соберем схему с 2 кнопками, с помощью которых будет осуществляться управление целым набором различных устройств: двумя светодиодами сервоприводом и бузером (звонком). Внешний вид итогового устройства представлены на рисунке.

Для схемы потребуется:

1. Контроллер

2. Макетная плата

3. Провода

4. Тактовая кнопка - 2шт.

5. Резистор 10 к0м - 2шт.

6. Резистор 240 Ом - 3 шт.

7. Серводвигатель

8. Светодиод красный

9. Светодиод зеленый

10. Бузер

Схема устройства.
Схема устройства.

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

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

- режим №2. Оба светодиода включены. При нажатии на кнопку №1 качалка серводвигателя поворачивается на угол 90 градусов и обратно. А при однократном нажатии на кнопку №2 будет проигрываться короткая мелодия.

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

-2

Стандартное начало программы подключается библиотека для сервопривода, определяется сервопривод, проводятся необходимо димые замены наименований (кнопка 1 на вывод 11, кнопка 2 на вывод 10, светодиод вывод 13, светодиод 2 на вывод 12, бузер на вывод 9), задаются необходимые переменные.

-3

В блоке void setup() задаются режимы работы контактов Ардуино, сервопривод подключается к выводу 7.

-4

Задается (определяется) функция reg1(), реализую- щая режим №1 работы кнопок и регистрирующая переход в режим №2, если кнопка №1 удерживается дольше 3-х секунд. В составе функции используются переменные state1 и state2, которым присваиваются результаты считывания состояния кнопок с помощью функции digitalRead(). Далее, если первая кнопка нажата (state1 == HIGH), выполняется набор команд:

- засекается время нажатия кнопки №1 с момента включения платы контроллера с помощью функции millis(), результат выполнения которой присваивается переменной time; - для проверки характера нажатия (длительное или короткое) запускается цикл while. Он многократно выполняется, пока нажата кнопка (state1 == HIGH), и проверяется, какое количество времени она нажата. Если время нажатия более 3-х секунд (определяется как разница между текущим количеством времени по функции millis() и тем, которое было засечено и записано в переменную time), то пользователь желает перейти в режим №2, а значит переменной regim присваивается значение 2, и на бузер выдается звуковой сигнал, указывающий на переход в другой режим. Если же нажатие короткое, то происходит выход из цикла, поскольку не выполняется условие, а значение переменной regim остается равным единице. Следовательно, выполняется действие, которое соответствует по алгоритму такому нажатию, т. е. включается светодиод на контакте 13 на 1 секунду. При нажатии на кнопку №2 на одну секунду включается светодиод, подключенный к контакту 12. На этом тело функции заканчивается.

Внимание! В скетче используется функция Millis(), которая ранее не использовалась. Millis () - эта функция возвращает значение в миллисекундах с момента запуска контроллера или с момента его перезагрузки.
Важно заметить, что контроллер будет считать время не бесконечно. Количество памяти для записи времени ограничено, поэтому когда значение времени подойдет к этому лимиту (через 50 дней), оно сбросится на ноль.
-5

Задается (определяется) функция reg2(), реализую- щая режим №2 работы кнопок и регистрирующая переход из режима №2 в режим №1, если кнопка №2 удерживается дольше 3-х секунд.

Вначале включаются оба светодиода, подключенные к контактам контроллера 12 и 13. Далее переменным state1 и state1 присваиваются результаты считывания состояний кнопок (нажаты или нет), после чего выполняется проверка условий для выполнения набора действий в зависимости от того, какая кнопка нажата. Если первая кнопка нажата (state1 == HIGH), то в режиме №2 она запускает процесс поворота качалки серводвигателя.

-6

После этого, если нажата кнопка №2 ( if (state2 == HIGH) ), проверяется нажата ли кратковременно или длительностью более 3 секунд. Проверка выполняется по тому же принципу, что и в функции void reg1(), описанной чуть выше, т. е. с помощью цикла while и дополнительного условия (if (millis() - time > 3000)). В результате, если это условие становится истинным, выполняются несколько действий: выполняется переход в режим №1 через присвоение переменной regim значения 1 и выключение светодиодов, работа которых уже не соответствует новому режиму. Одновременно с переходом в первый режим на бузер подается звуковой сигнал (tone(buzer, 3000, 1000)).

Если же режим не менялся и переменная regim по прежнему равна двум (if (regim == 2)), то получается, что при нажатии кнопки №2 из бузера будет издаваться звуковой сигнал. Обращаем внимание, что условие if (regim == 2) находится в фигурных скобках, относящихся к условию if (state2 == HIGH). На этом тело функции заканчивается.

-7

Основное тело скетча, которое является очень простым. Выполняется проверка двух условий: - если условие if (regim == 1) истинно, т. е. если

выполнен переход в режиме №1 или действия пользователя не связаны с переходом в режим №2, то производится вызов и выполнение функции reg1(), соответствующей режиму №1; - если истинно условие if (regim == 2), то производится вызов и выполнение функции reg2(), соответствующей режиму №2.

Программа тут: https://disk.yandex.ru/d/ptx0PwwNeC5xSQ