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

Генератор импульсов на NE555

Генератор импульсов на NE555 Генератор прямоугольных импульсов на основе популярной микросхемы NE..

42.30грн.

Стабилизатор напряжения 3,3 В 800 мА LM1117T-3.3

Стабилизатор напряжения 3,3 В 800 мА LM1117T-3.3

Стабилизатор напряжения в виде микросхемы с тремя ногамиИспользуется для стабилизации нестабилизиров..

19.54грн.

Контроллер WeMos D1 mini ESP8266

Контроллер WeMos D1 mini ESP8266

Очень маленькая и дешевая плата контроллера с WiFi связью на борту. Не может похвастаться множеством..

112.31грн.

Модуль 4 — Аналоговые сигналы: ADC, PWM и регулятор яркости

Модуль 4 — Аналоговые сигналы: ADC, PWM и регулятор яркости

Модуль 4 — Аналоговые сигналы (курс для начинающих) Цель модуля: изучить работу с аналоговы..

Модуль MP3-плеера GW

Модуль MP3-плеера GW

Полностью автономный mp3-плеер с питанием 5 В. Миниатюрный, имеет на борту кнопки управления. Читает..

89.24грн.