Одна кнопка — три команди: клік, довге натискання та подвійний клік на 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 завдяки використанню однієї кнопки.
  • Створення компактних пристроїв з простим інтерфейсом.

Комерційна пропозиція

Якщо ви плануєте реалізувати подібний проєкт з кнопками, сенсорними панелями чи іншими елементами керування, ми можемо допомогти. Ми займаємося розробкою схем, програмуванням і виготовленням друкованих плат під ваші завдання. Ознайомтеся з портфоліо і замовте розробку під ключ для бізнесу або хобі.

Висновок

Використання однієї кнопки для трьох команд — це практичне рішення для оптимізації інтерфейсу. Такий підхід економить піни, зменшує кількість елементів і відкриває нові можливості для керування. Реалізація проста, а розширювати проєкт можна безмежно — від меню на дисплеї до складних інтерактивних систем.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Відправка даних у Google Sheets за таймером (ESP32 кожні 5 хвилин пише дані)

Відправка даних у Google Sheets за таймером (ESP32 кожні 5 хвилин пише дані)

ESP32 → Google Sheets: відправка даних у таблицю кожні 5 хвилин У цьому прикладі ESP32 автомати..

Потенціометр Robotale

Потенціометр Robotale

Двохканальний змінний резистор прямолінійної конструкціїОпір 10 кОмРозміри 90 х 20 мм..

111.67грн.

Датчик звуку

Датчик звуку

Датчик звуку (дискретний, з регулюванням чутливості)Інтелектуальний дискретний датчик звуку для сист..

49.61грн.

Модуль 4-х аналогових входів I2C на ADS1115 (Geekmatic)

Модуль 4-х аналогових входів I2C на ADS1115 (Geekmatic)

Модуль 4-х аналогових входів I2C на ADS1115 (Geekmatic) Компактний модуль для підключення 4-х а..

203.34грн.

Як правильно скласти технічне завдання для розробки електроніки

Як правильно скласти технічне завдання для розробки електроніки

Як правильно скласти технічне завдання для розробки електроніки Якщо ви плануєте розробку пристро..