В жизни мы постоянно сталкиваемся с электронными устройствами, которые необходимо настроить, запрограммировать или просто ввести какую-либо информацию. При этом для выполнения подобных задач кнопок у устройства существенно меньше, чем параметров, которые требуется вводить. То есть с помощью различных режимов нажатия на кнопку должен достигаться разный результат.
Самым ярким примером является классический мобильный телефон. Кнопок у него мало, но с их помощью набираются и весь алфавит, и все цифры, и различные смайлики. Про перемещение по мени с настройками и говорить не приходится. Как такое достигается? Не так уж и сложно. Давайте соберем схему с 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 будет проигрываться короткая мелодия.
Одним из вариантов реализации такой многорежимности кнопок является вариант с использованием функций в программном коде. Теперь напишем скетч, который выполнит этот алгоритм. Справа от текста программы приведены подробные пояснения, объясняющие реализацию описанного алгоритма. Сама программа будет на диске по ссылке в конце статьи.
Стандартное начало программы подключается библиотека для сервопривода, определяется сервопривод, проводятся необходимо димые замены наименований (кнопка 1 на вывод 11, кнопка 2 на вывод 10, светодиод вывод 13, светодиод 2 на вывод 12, бузер на вывод 9), задаются необходимые переменные.
В блоке void setup() задаются режимы работы контактов Ардуино, сервопривод подключается к выводу 7.
Задается (определяется) функция 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 дней), оно сбросится на ноль.
Задается (определяется) функция reg2(), реализую- щая режим №2 работы кнопок и регистрирующая переход из режима №2 в режим №1, если кнопка №2 удерживается дольше 3-х секунд.
Вначале включаются оба светодиода, подключенные к контактам контроллера 12 и 13. Далее переменным state1 и state1 присваиваются результаты считывания состояний кнопок (нажаты или нет), после чего выполняется проверка условий для выполнения набора действий в зависимости от того, какая кнопка нажата. Если первая кнопка нажата (state1 == HIGH), то в режиме №2 она запускает процесс поворота качалки серводвигателя.
После этого, если нажата кнопка №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). На этом тело функции заканчивается.
Основное тело скетча, которое является очень простым. Выполняется проверка двух условий: - если условие if (regim == 1) истинно, т. е. если
выполнен переход в режиме №1 или действия пользователя не связаны с переходом в режим №2, то производится вызов и выполнение функции reg1(), соответствующей режиму №1; - если истинно условие if (regim == 2), то производится вызов и выполнение функции reg2(), соответствующей режиму №2.
Программа тут: https://disk.yandex.ru/d/ptx0PwwNeC5xSQ