Аппаратный способ устранения эффекта дребезга заключается в следующем:
параллельно кнопке включают конденсатор, сглаживающий скачки напряжения и делающий процесс переключения более плавным. Обычно номинал конденсатора делают не слишком большим, порядка 0.1 мкФ (микрофарад), иначе он будет заряжаться слишком долго и время
переключения кнопки станет заметно больше.
Сглаживающий конденсатор заряжается до уровня HIGH почти мгновенно, а во время дребезга контактов разряжается, повышая уровень напряжения в цепи. Таким образом скачки напряжения значительно уменьшаются.
Теперь кнопка будет работать правильно, но схема все еще нуждается в доработке. Предположим, что во время написания программы, мы ошиблись и случайно определили вывод контроллера не как INPUT, а как OUTPUT. В этом случае через ножку контроллера потечет ток короткого замыкания, превышающий предельно допустимый и контроллер выйдет из строя.
Чтобы защитить контроллер, последовательно с кнопкой добавим токоограничительный резистор 1 кОм.
Рисунок 1. Электрическая принципиальная схема эксперимента
// инициализация констант #define LED 2 //определение константы LED с номером пина 2 #define BUTTON 12 //определение константы BUTTON с номером пина 12 // инициализация переменных int switchState = 0; // актуальный статус кнопки int oldSwitchState = 0; // статус последней проверки кнопки boolean lightsOn = false; // статус светодиода on = true или off = false void setup() { pinMode(BUTTON, INPUT); pinMode(LED, OUTPUT); } void loop() { switchState = digitalRead(BUTTON); if (switchState != oldSwitchState) { oldSwitchState = switchState; if (switchState == HIGH) { lightsOn = !lightsOn; } } if(lightsOn) { digitalWrite(LED, HIGH); // зажигаем светодиод } else { digitalWrite(LED, LOW); // гасим светодиод } }
В соответствие инструкции, дополним схему конденсатором С1 и резистором R3.
Программный код остается без изменений.
Запустим программу на выполнение, и на этот раз все работает как и задумано.