Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Debounce2

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

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


Ambox content.png Черновик


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

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

Алгоритм:

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

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

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

Цепь

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

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

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

Arduino uno debounce2.png

Код

  1. #define LED 9                                        //светодиод подключаем к 9 выводу
  2. #define BUTTON 2                                     //кнопку подключаем ко 2 выводу
  3.  
  4. boolean lastButton = LOW;                            //переменная для сохранения предыдущего состояния кнопки
  5. boolean currentButton = LOW;                         //переменная для сохранения текущего состояния кнопки
  6. boolean ledOn = false;                               //текущее состояние светодиода (вкл./выкл.)
  7.  
  8. void setup()
  9. {
  10.   pinMode (LED, OUTPUT);                             //конфигурируем контакт подключенный к светодиоду как выход
  11.   pinMode (BUTTON, INPUT);                           //конфигурируем контакт подключенный к кнопке как вход(необязательно)
  12. }
  13.  
  14. void loop()
  15. {
  16.   currentButton = debounce(lastButton);              //считываем состояние кнопки с применением "антидребезга"
  17.   if (lastButton == LOW && currentButton == HIGH)    //если кнопка была нажата
  18.   {
  19.     ledOn = !ledOn;                                  //инвертируем значение переменной состояния светодиода
  20.   }
  21.   lastButton = currentButton;                        //сохраняем текущее состояние кнопки в предыдущее
  22.  
  23.   digitalWrite(LED, ledOn);                          //изменяем статус светодиода
  24.  
  25. }
  26.  
  27. /*
  28. * Функция антидребезга
  29. * принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
  30. */
  31. boolean debounce(boolean last)
  32. {
  33.   boolean current = digitalRead(BUTTON);             //считываем состояние кнопки
  34.   if (last != current)                               //если есть изменения
  35.   {
  36.     delay(5);                                        //ждем 5мс
  37.     current = digitalRead(BUTTON);                   //считываем состояние кнопки
  38.   }
  39.   return current;                                    //возвращаем, считанное состояние кнопки
  40. }

См.также

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

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