Одна кнопка — три команди: клік, довге натискання та подвійний клік на 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
ESP32: цифрові входи та виходи (Digital Inputs & Outputs) з прикладами

ESP32: цифрові входи та виходи (Digital Inputs & Outputs) з прикладами

ESP32: цифрові входи та виходи Мікроконтролер ESP32 має десятки універсальних GPIO (General Purpo..

Роз'ємний конектор під гвинт на плату 2 контакти

Роз'ємний конектор під гвинт на плату 2 контакти

Подвійний роз'ємний гвинтовий конектор без повороту для монтажу на друковану плату.Використовується ..

25.96грн.

Arduino UNO як осцилограф

Arduino UNO як осцилограф

Контролери Arduino можна використовувати як найпростіший осцилограф, для спостерігання за швидко-змі..

ESP32 піаніно з фруктів

ESP32 піаніно з фруктів

Тема проекту: ESP32 піаніно з фруктів. Друзі, радий вас всіх сьогодні бачити знову. Хочу проде..

Модуль реле 4-канальний 12В 10А

Модуль реле 4-канальний 12В 10А

4-канальный модуль реле для підключення напряму до дискретного виходу контролера. Світлодіодна індик..

159.74грн.