Здравствуйте, уважаемые читатели! В преддверии статьи об еще одной самоделке, теперь на основе платы Digispark ATtiny85, поговорим о элементе, без которого редко обходится какое-либо электронное устройство, а именно о кнопках. Разберемся в их устройстве, способах подключения к Ардуино, а так же напишем небольшой скетч для обработки нажатия на кнопку и установим готовую библиотеку, существенно упрощающую обработку различных типов нажатий на кнопку.
Основное назначение кнопки замкнуть или разомкнуть цепь, чтобы пропустить электрический сигнал.
По типу кнопки делятся – на нормально замкнутые и нормально разомкнутые, а так же с фиксацией нажатия и без фиксации. В данной статье речь пойдет о нормально разомкнутых кнопках, т.е. кнопках, которые замыкают нашу цепь при нажатии. В микроэлектронике такой тип кнопок является основным. Потому что, в сочетании с микроконтроллером, на одну такую кнопку можно повесить несколько обработчиков событий в зависимости от количества нажатий (одно нажатие, два нажатия подряд, три нажатия подряд и т.д.) и продолжительности нажатия. Кнопки же с фиксацией, по сути, хороши лишь для перевода устройства в какой-либо заранее заданный режим, в котором оно должно оставаться неограниченно долго, пока устройство в ручном режиме не будет выключено, либо переведено в другое состояние.
Для примера возьмем одну из самых распространенных кнопок, которая чаще всего присутствует в наборах Ардуино.
У данной кнопки 4 ножки. Каждая пара из 2х ближайших друг к другу ножек замыкает и размыкает цепь. Противоположные ножки соединены друг с другом.
Кнопка прекрасно размещается на макетной плате для отладки тестовых схем.
Соберем на макетной плате простую схему с кнопкой и светодиодом. Обратите внимание, к короткой ножке светодиода, уже припаян резистор на 220 Ом.
Для проверки работы кнопки заходим в Arduino IDE и открываем в примерах скетч Button.
В начале скетча дана инструкция, как подключить кнопку к микроконтроллеру.
Соберем на макетной плате схему, в которой одна ножка кнопки будет подключена к выходу 5В Ардуино, а вторая соединена со 2-м пином. Хоть 13 пин Arduino UNO связан с размещенным на плате светодиодом, добавим еще один светодиод на макетную плату. Короткая ножка которого, через резистор 220 Ом, будет соединена с минусом макетной платы, а длинная будет соединена с 13 пином Arduino UNO. Землю Ардуино соединяем с минусом макетной платы.
Если подтягивающий резистор на 10 кОм не подключить, то даже при отсутствии нажатия на кнопке светодиод все равно будет гореть.
Т.к. в отсутствии четкого логического сигнала (нуля или единицы), напряжение на входящем пину может быть любое. От нуля, вплоть до напряжения питания, что больше соответствует логической единице.
Добавляем к схеме резистор на 10 кОм. Соединяя одну его ножку с минусом макетной платы, а другую с пином, к которому подключена кнопка. В данном случае, с пином номер 2. Таким образом, мы гарантировано устанавливаем логический 0 на данном пину.
Светодиод выключается и включается только при нажатии на кнопку. При отпускании кнопки, светодиод гаснет.
На платах Ардуино (Arduino UNO, Arduino Mega, Arduino Nano) есть возможность использовать имеющееся на плате. Чтобы его активировать изменим код скетча. В функции setup () меняем инициализацию пина, связанного с кнопкой с INPUT на INPUT_PULLUP. В функции loop() инвертируем условие срабатывания условия нажатия на кнопку.
Это необходимо потому как в схеме, мы меняем подключение кнопки +5В на землю. Подтягивающий резистор с макетной платы можно убирать.
Загружаем обновленный скетч в Ардуино и видим, что всё прекрасно работает.
Двойное нажатие и удержание кнопки
Не будем останавливаться на простом нажатии, а добавим возможность обработки двойных нажатий и нажатия с удержанием кнопки. Можно написать для данных действий собственный код, но лучше не тратить на это время и взять готовую библиотеку. Я пользуюсь библиотекой OneButton, которую можно скачать по ссылке:
https://github.com/mathertel/OneButton
Добавляем библиотеку в Arduino IDE.
Для проверки функционала библиотеки можно использовать размещенный ниже скетч. Ссылка на него будет в конце статьи.
!решета! include <OneButton.h>
!решета! define BUTTON_PIN 4
/**
* Initialize a new OneButton instance for a button
* connected to digital pin 4 and GND, which is active low
* and uses the internal pull-up resistor.
*/
OneButton button = OneButton(
BUTTON_PIN, // Input pin for the button
true, // Button is active LOW
true // Enable internal pull-up resistor
);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// link the myClickFunction function to be called on a click event.
button.attachClick(myClickFunction);
// link the doubleclick function to be called on a doubleclick event.
button.attachDoubleClick(myDoubleClickFunction);
// link the doubleclick function to be called on a doubleclick event.
button.attachLongPressStart(myLongPressFunction);
//debouncing time. Default is 50 msec.
button.setDebounceTicks(40);
//Timeout used to distinguish single clicks from double clicks.
button.setClickTicks(800);
//Duration to hold a button to trigger a long press.
button.setPressTicks(1000);
}
void myClickFunction() {
Serial.println("click");
}
void myDoubleClickFunction() {
Serial.println("dblclick");
}
void myLongPressFunction() {
Serial.println("long press");
}
void loop() {
// put your main code here, to run repeatedly:
button.tick();
}
В самом начале скетча подключаем библиотеку и проводим инициализацию кнопки, которая у нас подключена к 4 пину. В параметрах создаваемого объекта-кнопки мы указываем пин к которому подключена кнопка и то, что мы используем внутренний резистор платы Ардуино. При подключении внешнего резистора, данный код будет отличаться. Примеры кода, для обоих случаев есть на странице библиотеки https://github.com/mathertel/OneButton.
В функции setup() мы проводим инициализацию серийного порта, куда будет выводиться информация о состоянии кнопки, назначаем функции на различные события кнопки и проводим некоторые настройки интервалов срабатывания для разных событий.
setDebounceTicks(40) – интервал игнорирования повторного нажатия кнопки, чтобы кнопка не срабатывала несколько раз за одно нажатие, т.е. компенсация дребезга контактов кнопки. Настраивается индивидуально, в зависимости от типа и состояния кнопки. По умолчанию 50 мс.
setClickTicks(800) - промежуток, отличающий двойное нажатие от одинарного. Т.е. в течение, какого промежутка времени в миллисекундах нужно два раза нажать на кнопку, чтобы оно считалось двойным нажатием, а не двумя одинарными. По-умолчанию 600 мс.
setPressTicks(1000) – время, после которого сработает событие долгого нажатия на кнопку. Тут всё настраивается по собственному вкусу. По-умолчанию 1000 мс.
В конце скетча размещены функции которые выводят в монитор порта информацию о статусе нажатия кнопки и функция loop() с обязательной строкой, в которой мы запускаем таймер, который и позволяет отслеживать различные варианты нажатия кнопки.
После компиляции и загрузки скетча в Ардуино, открываем монитор порта и при различных типах нажатия на кнопку, видим соответствующие сообщения.
В дальнейших своих проектах я буду часто использовать данную библиотеку для работы с кнопками, поэтому в этой статье решил остановиться на этом вопросе подробнее, чтобы не загромождать данной информацией текст будущих статей, а оставлять ссылку на этот материал.
Ссылка на скетч из статьи – https://yadi.sk/d/Ulj-JTaEJG3_hg
Ссылка на библиотеку OneButton - https://github.com/mathertel/OneButton
_________________________________________________________
Спасибо, что дочитали до конца! Если статья понравилась, нажмите, пожалуйста, соответствующую кнопку. Если интересна тематика электроники и различных электронных самоделок, подписывайтесь на канал. До встречи в новых статьях!