Одна кнопка — три команди: клік, довге натискання та подвійний клік на 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Розумний дім 1. Постановка задачі.

Розумний дім 1. Постановка задачі.

Розумний дім 1. Постановка задачі. Кожна людина уявляє собі свій розумний дім у відповідності зі св..

Трансформатор струму 0-100А

Трансформатор струму 0-100А

Аналоговий датчик змінного струму силою до 100А. Це роз'ємний трансформатор струму з діаметром отвор..

268.69грн.

Arduino SIM800 GPRS HTTP GET запит

Arduino SIM800 GPRS HTTP GET запит

Привіт друзі! Ми з кожним разом знаємо все більш цікаві застосування GSM-модуля SIM800. На цей раз н..

Драйвер A4988. Як використовувати ENABLE, SLEEP та RESET

Драйвер A4988. Як використовувати ENABLE, SLEEP та RESET

Привіт друзі! Давайте обговоримо таке важливе питання під час роботи з драйвером A4988, як піни дозв..

Дискретний горизонтальний датчик рівня рідини (М15, 100В, 0.5А)

Дискретний горизонтальний датчик рівня рідини (М15, 100В, 0.5А)

Дискретний горизонтальний датчик рівня рідини призначений для контролю досягнення певного рівня ріди..

105.67грн.