Одна кнопка — три команди: клік, довге натискання та подвійний клік на 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 завдяки використанню однієї кнопки.
- Створення компактних пристроїв з простим інтерфейсом.
Комерційна пропозиція
Якщо ви плануєте реалізувати подібний проєкт з кнопками, сенсорними панелями чи іншими елементами керування, ми можемо допомогти. Ми займаємося розробкою схем, програмуванням і виготовленням друкованих плат під ваші завдання. Ознайомтеся з портфоліо і замовте розробку під ключ для бізнесу або хобі.
Висновок
Використання однієї кнопки для трьох команд — це практичне рішення для оптимізації інтерфейсу. Такий підхід економить піни, зменшує кількість елементів і відкриває нові можливості для керування. Реалізація проста, а розширювати проєкт можна безмежно — від меню на дисплеї до складних інтерактивних систем.
Розумний дім 1. Постановка задачі.
Розумний дім 1. Постановка задачі. Кожна людина уявляє собі свій розумний дім у відповідності зі св..
Трансформатор струму 0-100А
Аналоговий датчик змінного струму силою до 100А. Це роз'ємний трансформатор струму з діаметром отвор..
268.69грн.
Arduino SIM800 GPRS HTTP GET запит
Привіт друзі! Ми з кожним разом знаємо все більш цікаві застосування GSM-модуля SIM800. На цей раз н..
Драйвер A4988. Як використовувати ENABLE, SLEEP та RESET
Привіт друзі! Давайте обговоримо таке важливе питання під час роботи з драйвером A4988, як піни дозв..
Дискретний горизонтальний датчик рівня рідини (М15, 100В, 0.5А)
Дискретний горизонтальний датчик рівня рідини призначений для контролю досягнення певного рівня ріди..
105.67грн.




