Кнопка дребезг контактов при  нажатии.

Кнопка дребезг контактов при  нажатии.

Часто кнопки могут генерировать ложные срабатывания при нажатии из-за механических и физических проблем: эти переходы могут быть прочитаны как несколько нажатий в очень короткий промежуток времени и заставить  программу работать не правильно.
В этом примере показано, как устранить эту проблему, сделать проверку в короткий промежуток времени, чтобы убедиться, что кнопка действительно была нажата.
Без такой проверки нажатия кнопки однократное нажатие может вызвать непредсказуемые результаты.
В этой программе мы используется функция millis(), чтобы отслеживать время, прошедшее с момента нажатия кнопки. Про функцию millis() уже были статьи в моём блоге. Если хотите более подробно рассмотреть функцию смотрите видео урок или читайте в примерах.

Нам понадобятся:

  • Плата Arduino
  • Кнопка или выключатель
  • Резистор 10 кОм
  • Провода для подключения
  • Макетная плата


Подключение 

Чтобы создать подключение, соедините три провода с платой.
Первые два провода, красного и черного цвета, подсоедините к двум длинным вертикальным рядам по бокам макетной платы, чтобы получить доступ к питанию 5 вольт и земле.
Третий провод соедините с цифровым пином 2 и одной из ножек кнопки.
Другая ножка кнопки подключена через резистор с подтягивающим вниз(pull-down) эффектом (обычно 10 кОм) к земле.
Третья ножка кнопки подключена к 5 вольтам.

Когда кнопка не нажата, между двумя ножками кнопки нет соединения, поэтому пин подключен к земле (через резистор с подтягивающим вниз(pull-down) эффектом), и мы считываем LOW.
Когда кнопка нажата, она устанавливает соединение между своими двумя ножками, подключая пин к 5 вольтам, и мы считываем HIGH.

Схема подключения

Код

/*
  Дребезг контактов
  Каждый раз, когда сигнал на входе переходит с LOW на HIGH (например, при нажатии кнопки),
  сигнал на выходе меняется с LOW на HIGH или с HIGH на LOW. Есть минимальная задержка между переключениями,
  чтобы подавить дребезг контактов (то есть, чтобы игнорировать помехи).

  Схема:
  - Светодиод, подключенный от пина 13 к земле через резистор 220 Ом.
  - Кнопка, подключенная от пина 2 к +5V.
  - Резистор 10 кОм, подключенный от пина 2 к земле.

  - Примечание: на большинстве плат Arduino уже есть светодиод, подключенный к пину 13 на плате,
    поэтому для этого примера дополнительных компонентов не требуется.

*/

// Константы не будут меняться. Они используются здесь для задания номеров пинов:
const int buttonPin = 2;  // номер пина для кнопки
const int ledPin = 13;    // номер пина для светодиода

// Изменяющиеся переменные:
int ledState = HIGH;        // текущее состояние пина вывода
int buttonState;            // текущее считывание с пина ввода
int lastButtonState = LOW;  // предыдущее считывание с пина ввода

// Следующие переменные имеют тип unsigned long, так как время, измеряемое в
// миллисекундах, быстро становится большим числом, которое не помещается в int.
unsigned long lastDebounceTime = 0;  // последнее время переключения пина вывода
unsigned long debounceDelay = 50;    // время дребезга; увеличьте, если светодиод мигает

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // установить начальное состояние светодиода
  digitalWrite(ledPin, ledState);
}

void loop() {
  // считать состояние переключателя в локальную переменную:
  int reading = digitalRead(buttonPin);

  // проверить, нажата ли кнопка
  // (то есть, сигнал перешел с LOW на HIGH), и если прошло достаточно времени
  // с момента последнего нажатия, чтобы игнорировать помехи:

  // Если переключатель изменился из-за помех или нажатия:
  if (reading != lastButtonState) {
    // сбросить таймер дребезга
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // независимо от считывания, оно находится на этом уровне достаточно долго,
    // чтобы взять его как действительное текущее состояние:

    // если состояние кнопки изменилось:
    if (reading != buttonState) {
      buttonState = reading;

      // изменить состояние светодиода только при новом HIGH состоянии кнопки
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // установить состояние светодиода:
  digitalWrite(ledPin, ledState);

  // сохранить считывание. В следующий раз в цикле это будет lastButtonState:
  lastButtonState = reading;
}
 

Скетч ниже основан на версии debounce, предложенной Лимор Фрид (Limor Fried), но логика инвертирована по сравнению с ее примером.
В ее примере переключатель возвращает LOW в закрытом состоянии и HIGH в открытом.
Здесь переключатель возвращает HIGH при нажатии и LOW, когда не нажат.

5 примеров использования:

  1. Управление освещением: Вы можете использовать пример нажатия на кнопку для управления освещением в комнате. Пользователь может включать и выключать свет, нажимая на кнопку, и код поможет избежать ложных срабатываний.

  2. Замок с кодовым доступом: Создайте замок с кодовым доступом, где пользователь вводит комбинацию, используя кнопку. Этот код примера поможет обработать ввод пользователя точно и без ошибок.

  3. Таймер для приготовления пищи: Если вы создаете микроволновую печь или другое устройство для приготовления пищи, кнопка и декодирование могут использоваться для ввода времени приготовления.

  4. Управление роботом: В проектах с роботами кнопки могут использоваться для управления движением, включения и выключения функций и многого другого.

  5. Игровой контроллер: Создайте собственный игровой контроллер для компьютерных игр, используя кнопку  для точного управления персонажем или действиями в игре.

Надеюсь, эти примеры вдохновят вас на использование декодирования нажатий на кнопку в ваших проектах!

Дополнительные материалы по теме
Подключение кнопки к ардуино
TTP223 сенсорная кнопка
Резистивные кнопки
Управление одной кнопкой на ESP
Первая программа на Arduino. Aрдуино для начинающих
Digital Read Arduino
Управление светодиодами кнопкой на Ардуино
Кнопка, дребезг контактов при нажатии
input pullup arduino кнопка
Analog Read Arduino
Ардуино аналоговый вход Чтение аналогового напряжения