Одна кнопка — три команды: клик, длинное нажатие и двойной клик на Arduino UNO
В большинстве проектов на Arduino используются кнопки для ввода команд. Однако не всегда есть возможность подключить много кнопок: количество свободных пинов ограничено, а место на плате или корпусе устройства ценно. Решение — использовать одну кнопку для выполнения сразу нескольких действий. В этой статье мы подробно разберем, как реализовать три разных команды с помощью одной кнопки: обычный клик, длинное нажатие и двойной клик.
Необходимое оборудование и компоненты
- Микроконтроллер Arduino UNO
- Тактовая кнопка (обычная кнопка с фиксацией при нажатии)
- Резистор 10 кОм для подтяжки (если не используется встроенный pull-up)
- Макетная плата (breadboard)
- Соединительные провода (Dupont)
- USB-кабель для прошивки и отладки
Схема подключения и принцип работы
Кнопка подключается к одному из цифровых входов Arduino. Чтобы избежать ложных срабатываний, используется подтягивающий резистор (pull-up). В Arduino UNO есть встроенный резистор подтяжки, который можно включить программно.
Схема подключения:
| Элемент | Подключение |
|---|---|
| Кнопка (одна ножка) | GND |
| Кнопка (вторая ножка) | Цифровой пин Arduino (например, D2) |
Принцип работы простой:
- Если кнопка нажата и отпущена быстро — это короткий клик.
- Если кнопка удерживается более определённого времени (например, 1 секунды) — это длинное нажатие.
- Если дважды нажать кнопку за короткий промежуток (например, 400 мс) — это двойной клик.
Пример кода
// Пример для Arduino UNO
// Реализация клика, длинного нажатия и двойного клика
const int buttonPin = 2; // Пин кнопки
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
unsigned long lastClickTime = 0;
unsigned long longPressTime = 1000; // 1 секунда
unsigned long doubleClickGap = 400; // 0.4 сек для двойного клика
bool buttonState;
bool lastButtonState = HIGH;
bool longPressActive = false;
bool doubleClickWaiting = false;
bool doubleClickOnNextUp = false;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
bool reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
// Кнопка нажата
if ((millis() - lastClickTime) < doubleClickGap && !doubleClickOnNextUp) {
doubleClickOnNextUp = true;
} else {
doubleClickOnNextUp = false;
doubleClickWaiting = true;
lastClickTime = millis();
}
} else {
// Кнопка отпущена
if (doubleClickOnNextUp) {
Serial.println("Двойной клик");
doubleClickOnNextUp = false;
doubleClickWaiting = false;
} else if (longPressActive) {
Serial.println("Длинное нажатие");
longPressActive = false;
doubleClickWaiting = false;
} else if (doubleClickWaiting) {
Serial.println("Одиночный клик");
doubleClickWaiting = false;
}
}
}
}
if (buttonState == LOW && (millis() - lastClickTime > longPressTime) && !longPressActive) {
longPressActive = true;
}
lastButtonState = reading;
}
Объяснение кода
Код основан на обработке временных интервалов с помощью функции millis(). Это позволяет отслеживать:
- Разницу между нажатиями для определения двойного клика.
- Продолжительность удержания для фиксации длинного нажатия.
- Состояние кнопки (нажата/отпущена) с антидребезгом (debounce).
Вместо использования функции delay(), которая блокирует выполнение программы, применяется millis(). Это позволяет расширять проект и добавлять параллельные задачи (например, управление светодиодами, датчиками или передачей данных по UART).
Применение и расширение проекта
- Управление меню на дисплее (одна кнопка = навигация и выбор).
- Включение и выключение разных режимов устройства.
- Запуск таймера или секундомера.
- Управление музыкой или звуковыми сигналами.
- Снижение количества кнопок и экономия пинов Arduino.
- Создание компактных устройств с удобным интерфейсом.
Коммерческое предложение
Если вам нужно реализовать подобный проект с кнопками, сенсорными панелями или другими элементами управления, мы можем помочь. Мы занимаемся разработкой схем, программированием и изготовлением печатных плат под ваши задачи. Ознакомьтесь с портфолио и закажите разработку под ключ для бизнеса или хобби.
Заключение
Использование одной кнопки для трёх команд — это практичный способ оптимизации интерфейса. Такое решение экономит пины, уменьшает количество элементов и открывает новые возможности для управления. Принцип работы прост, а расширять проект можно бесконечно — от управления меню до сложных интерактивных систем.
Двигатель 12В с редуктором 10RPM
Коллекторный двигатель постоянного тока с сильным редуктором для использования в различной робототех..
517.43грн.
Arduino возврат более одной переменной из функции
Привет друзья! Из видео Arduino функции мы уже знаем, что в функцию можно передавать много переменны..
Держатель аккумулятора 3,7В типа 18650
Держатель для цилиндрических аккумуляторов типа 18650 на 3,7В..
32.03грн.
Коннектор JST 2,54мм в разборе на 2, 3, или 4 провода
Комплект для сборки 2-х, 3-х или 4-проводного быстроразборного коннектора..
7.41грн.
KiCad уроки рисования схем и разработки печатных плат
Вас приветствует сайт гикматик! Сегодня поговорим о мега-полезной и доступной программе KiCad. Пораб..





