Одна кнопка — три команды: клик, длинное нажатие и двойной клик на 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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Светодиод ультраяркий 5мм

Светодиод ультраяркий 5мм

Сверхяркий светодиод диаметром 5 мм Корпус прозрачный у светодиодов разного цвета свечения. То есть..

5.75грн.

Муфта на шаговый двигатель 8x8x25мм

Муфта на шаговый двигатель 8x8x25мм

Данная муфта служит переходником между валами 8 мм и 8 мм. Тоесть имеет с обеих сторон отверстие диа..

61.62грн.

Модуль 3 — Работа с цифровыми сигналами: pull-up, pull-down и кнопка-переключатель

Модуль 3 — Работа с цифровыми сигналами: pull-up, pull-down и кнопка-переключатель

Модуль 3 — Работа с цифровыми сигналами (курс для начинающих) Цель модуля: понять, как рабо..

Измерение уровня шума Arduino Nano

Измерение уровня шума Arduino Nano

Понадобилось мне замерять фоновый уровень звука для проекта умного дома и оказалось, что это не прос..

Модуль MOSFET-транзистора N-channel

Модуль MOSFET-транзистора N-channel

Модуль (драйвер) силового MOSFET-транзистора для подключения мощной нагрузки на выход контролле..

48.22грн.