Arduino:Примеры/Debounce2

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Антидребезг2

Данный пример демонстрирует как программно бороться с дребезгом контактов.

Алгоритм:

  1. Вначале мы устанавливаем предыдущее и текущее состояние кнопки как LOW;
  2. Считываем состояние кнопки;
  3. Если текущее и предыдущее состояние кнопки отличаются, ждем 5 мс;
  4. Считываем состояние кнопки и делаем его текущим;
  5. Если предыдущее состояние кнопки было LOW, а текущее состояние HIGH, переключаем состояние светодиода;
  6. Сохраняем текущее состояние кнопки как предыдущее состояние;
  7. Повторяем цикл со 2 шага;

Необходимое оборудование

Цепь

Соедините 9 цифровой контакт Arduino с одной из ног резистор на 220 Ом, вторую ногу резистора соедините с анодом(длинная ножка) светодиода, катод(маленькая ножка) светодиода соедините с землей(GND). Соедините 2 цифровой контакт Arduino с одной из ног стягивающего резистора на 10 кОм и одним из контактов кнопки, вторую ногу резистора соедините с землей(GND). Второй контакт кнопки соедините с контактом 5V.

Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому 2-ой цифровой контакт будет по-прежнему подсоединен к «земле», и Arduino сочтет эту ситуацию как LOW. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя 2-ой цифровой и 5-вольтовый контакты, и Arduino сочтет эту ситуацию как HIGH.

Если отсоединить цифровой контакт ото всего, то светодиод примется хаотично мигать. Это значит, что выходное значение будет «плавающим», т.е. беспорядочно переключающимся из LOW в HIGH и наоборот. Именно поэтому в цепи и нужны стягивающие/подтягивающие резисторы.

Рис. 1. Плата Arduino с подключенной кнопкой и светодиодом.
Рис. 1. Плата Arduino с подключенной кнопкой и светодиодом.

Код

#define LED 9                                        //светодиод подключаем к 9 выводу
#define BUTTON 2                                     //кнопку подключаем ко 2 выводу

boolean lastButton = LOW;                            //переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW;                         //переменная для сохранения текущего состояния кнопки
boolean ledOn = false;                               //текущее состояние светодиода (вкл./выкл.)

void setup()
{
  pinMode (LED, OUTPUT);                             //конфигурируем контакт подключенный к светодиоду как выход
  pinMode (BUTTON, INPUT);                           //конфигурируем контакт подключенный к кнопке как вход(необязательно)
}

void loop()
{
  currentButton = debounce(lastButton);              //считываем состояние кнопки с применением "антидребезга"
  if (lastButton == LOW && currentButton == HIGH)    //если кнопка была нажата
  {
    ledOn = !ledOn;                                  //инвертируем значение переменной состояния светодиода
  }
  lastButton = currentButton;                        //сохраняем текущее состояние кнопки в предыдущее
  
  digitalWrite(LED, ledOn);                          //изменяем статус светодиода

}

/*
* Функция антидребезга
* принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
*/
boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);             //считываем состояние кнопки
  if (last != current)                               //если есть изменения
  {
    delay(5);                                        //ждем 5мс
    current = digitalRead(BUTTON);                   //считываем состояние кнопки
  }
  return current;                                    //возвращаем, считанное состояние кнопки
}

См.также

  1. pinMode()
  2. digitalWrite()
  3. digitalRead()
  4. if()
  5. millis()
  6. DigitalReadSerial
  7. Blink
  8. Button State Change

Внешние ссылки