Одна кнопка — три команды: клик, длинное нажатие и двойной клик на 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.
- Создание компактных устройств с удобным интерфейсом.
Коммерческое предложение
Если вам нужно реализовать подобный проект с кнопками, сенсорными панелями или другими элементами управления, мы можем помочь. Мы занимаемся разработкой схем, программированием и изготовлением печатных плат под ваши задачи. Ознакомьтесь с портфолио и закажите разработку под ключ для бизнеса или хобби.
Заключение
Использование одной кнопки для трёх команд — это практичный способ оптимизации интерфейса. Такое решение экономит пины, уменьшает количество элементов и открывает новые возможности для управления. Принцип работы прост, а расширять проект можно бесконечно — от управления меню до сложных интерактивных систем.
Светодиод ультраяркий 5мм
Сверхяркий светодиод диаметром 5 мм Корпус прозрачный у светодиодов разного цвета свечения. То есть..
5.75грн.
Муфта на шаговый двигатель 8x8x25мм
Данная муфта служит переходником между валами 8 мм и 8 мм. Тоесть имеет с обеих сторон отверстие диа..
61.62грн.
Модуль 3 — Работа с цифровыми сигналами: pull-up, pull-down и кнопка-переключатель
Модуль 3 — Работа с цифровыми сигналами (курс для начинающих) Цель модуля: понять, как рабо..
Измерение уровня шума Arduino Nano
Понадобилось мне замерять фоновый уровень звука для проекта умного дома и оказалось, что это не прос..
Модуль MOSFET-транзистора N-channel
Модуль (драйвер) силового MOSFET-транзистора для подключения мощной нагрузки на выход контролле..
48.22грн.





