Дребезг контактов - явление, возникающее в электромеханических устройствах. Связано оно с тем, что контакты при замыкании короткое время многократно отскакивают друг от друга ввиду того, что им требуется время для зарядки. На графике выглядит оно так:
Как с этим бороться?
Можно выделить два способа: аппаратный и программный.
Программный способ подразумевает собой написание функции "АнтиДребезг". Эта функция будет при смене сигнала с 0 на 1 или наоборот будет производить дополнительную проверку через 12 миллисекунд. Если через 12 мс сигнал не изменится, значит смена сигнала произошла не из-за дребезга.
Напишем такую функцию. В нашем примере она будет проверять дребезг кнопки.
void debounce() {
// последнее состояние кнопки
lastFlash=digitalRead(ButtonPin) ;
delay(12);
if (digitalRead(ButtonPin)==lastFlash && lastFlash==1){
//допустим, будем запускать светодиод
digitalWrite(led, HIGH);
}
if( digitalRead(ButtonPin)==lastFlash && lastFlash==0 ){
// если кнопку наоборот отпустили
digitalWrite(led, LOW);
}
}
В функции мы проводили однократную проверку. Можно повторить данную проверку дважды или трижды по необходимости.
Это конечно все хорошо, но каждый раз вызывать функцию неудобно. К тому же, функция может подвести. Для этого придумали аппаратный способ.
Взглянем на схему. Мы просто связали две контактные рельсы кнопки конденсатором на 100мкф. Это подавило дребезг. Это ведь намного проще чем программное подавление. Впечатляет?
Если разобраться в матчасти, то мы собрали низкочастотный фильтр, применение которого намного шире, чем подавление дребезга кнопки.
Подпишись! Лайк! Спасибо!