Одна кнопка — три команды: клик, длинное нажатие и двойной клик на 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 x 2,5мм

Терминальный разъем питания папа 5,5 x 2,5мм

Разъем питания, который используется для перехода от стандартного разъема 5,5 x 2,5мм питания к..

31.56грн.

Электро насос прозрачный 12 В 100°С

Электро насос прозрачный 12 В 100°С

Насос работает на основе диафрагмы и может применяться для перекачки пищевых продуктовРасход жидкост..

269.59грн.

Светодиодная лента адресная WS2812B 1м 30led

Светодиодная лента адресная WS2812B 1м 30led

Трехцветная светодиодная адресная лента на основе адресных светодиодов WS2812B 30 светодиодо..

125.63грн.

Симистор BTA12-600B

Симистор BTA12-600B

Высоковольтный симистор.Максимальный ток нагрузки при полной синусоиде 12 АМаксимальный ток управляю..

15.42грн.

Датчик напряжения сети 220В

Датчик напряжения сети 220В

Гальванически изолированный датчик наличия напряжения в сети 220ВНапряжение питания логики 3 ... 5 В..

106.67грн.