Эксперимент 5.2. Эмуляция кнопки с фиксацией

В предыдущем эксперименте мы столкнулись с явлением которое характерно для всех кнопок и выключателей - дребезг контактов. Это паразитное явление, которое вносит проблемы преимущественно в электронных схемах.
Дребезг контактов возникает при нажатии на кнопку и переключатель, он возникает из-за реальных вибраций контактной пластины при её перемещении. Любой переключатель устроен так, что у него есть подвижный и неподвижный контакт. Как видно из названия, подвижным называется тот, что соединен с толкателем или рычагом, на который уже нажимает человек или механизм при работе устройства.
Так как кнопки имеют механическое устройство, то от их качества зависит то, как точно они отрабатывают нажатия. При этом в любом случае полностью устранить явление дребезга нельзя. К чему он приводит?
Если клавиша управляет каким-то электронным устройством с цифровым входом, например, микроконтроллера, логического элемента и пр., то его вход распознает столько нажатий, сколько было импульсов послано в результате возникновения дребезга.
Пример осциллограммы дребезга контактов изображен на рисунке ниже: Чтобы устранить эффект дребезга контактов есть два способа программный и аппаратный.
Один из вариантов программного устранения дребезга, это после первого изменения состояния кнопки, установить паузу в несколько миллисекунд, для того чтобы контакт стабилизировался и дребезг был проигнорирован.

Схема эксперимента

Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части

Рисунок 1. Электрическая принципиальная схема эксперимента

Соберем эту схему: Рисунок 2. Монтажная схема эксперимента

Программный код эксперимента

Exp5
  1. // инициализация констант
  2.  
  3. #define LED 2 //определение константы LED с номером пина 2
  4. #define BUTTON 12 //определение константы BUTTON с номером пина 12
  5.  
  6. // инициализация переменных
  7. int switchState = 0; // актуальный статус кнопки
  8. int oldSwitchState = 0; // статус последней проверки кнопки
  9. boolean lightsOn = false; // статус светодиода on = true или off = false
  10.  
  11. void setup() {
  12. pinMode(BUTTON, INPUT);
  13. pinMode(LED, OUTPUT);
  14. }
  15.  
  16. void loop() {
  17. switchState = digitalRead(BUTTON);
  18. if (switchState != oldSwitchState) {
  19. oldSwitchState = switchState;
  20. if (switchState == HIGH) {
  21. lightsOn = !lightsOn;
  22. delay(20);
  23. }
  24. }
  25. if(lightsOn) {
  26. digitalWrite(LED, HIGH); // зажигаем светодиод
  27. }
  28. else {
  29. digitalWrite(LED, LOW); // гасим светодиод
  30. }
  31. }

Электрическая принципиальная схема и монтажная схема эксперимента остаются без изменений, в программном коде добавляется строка с функцией delay(20), которая приостанавливает выполнение программы на 20 миллисекунд для игнорирования дребезга контактов.
Аппаратный способ устранения дребезга рассмотрим в следующем эксперименте.