Conceitos
“BOUNCE”

Um botão possui um contacto mecânico e ao ser pressionado gera uma série de ruídos aleatórios a que chamamos picos (spikes). Ou seja tensão flutua entre a posição de desligado (Low) e a de ligado (High), podendo assumir qualquer um destes valores. a este fenômeno chamamos transitórios.
Este fenómeno transitório pode ser observado utilizando um osciloscópio digital.

A duração desses picos (spikes) é pequena, geralmente da ordem dos milisegundos, mas o efeito prático é o de que durante esses poucos milissegundos, uma leitura efetuada a esse botão pode ser interpretada como ele estando ligado ou desligado, devido aos ruídos aleatórios que são gerados pelo contato mecânico.

Mas para um microprocessador alguns milissegundos são uma eternidade, ou seja, por exemplo, após detectar que o botão foi acionado, mediante UMA ÚNICA LEITURA DO BOTÃO, o nosso programa pode executar as funções correspondentes e voltar ao mesmo ponto anterior da leitura do botão, EM MENOS DE 1 milissegundo !!!!
Assim, o efeito que temos é que em vez do nosso programa interpretar que apertamos o botão APENAS 1 VEZ, ele pode acabar por interpretar que apertamos o botão mais de 20 vezes de seguidas !!!!!
Claro que dependendo do programa, o resultado pode ser um desastre!
DEBOUNCING
Na verdade, o termo “DEBOUNCING” significa uma técnica que nos dê certeza de que o botão apertado apenas uma vez seja interpretado corretamente como apenas UM aperto de botão.
Por outro lado, se apertarmos o mesmo botão por 5 vezes seguidas em um segundo, o nosso programa tem de conseguir ler corretamente 5 apertos de botão !
Quando trabalhando com Interrupções, não devemos colocar delay nas rotinas de tratamento das interrupções. Então como podemos eliminar esta situação?
Fazendo o “debouncing” de Hardware
Antes:
Depois:

Aqui temos um circuito RC,o que gera uma constante de tempo data por T=R*C
Com R em KOhms, C em uF e T em segundos(s)
Assim, quando pressionado o botão, o sinal leva alguns milissegundos para estabilizar num valor lógico e o processador pode identificar corretamente se o botão foi apertado ou não……
Porém temos o problema de ser gerado um delay, o tempo para o circuito leva a reconhecer o sinal.
Por exemplo para os valores típicos de R = 10k Ohms, C = 10uF teriamos um T = .1s (delay de 0,1 s).
Para solucionar o problema criados por circuitos puramente RC, devemos colocar um inversor Shimitt Trigger para eliminar esse tempo extra necessário para reconhecimento de estado lógico.
O circuito ao lado simplesmente gera uma onda quadrada na saída, não dependendo do tempo que levamos a pressionar do botão.
Ideal para usar com microprocessadores rápidos.
Debouncing Software
Quando não temos problemas com Interrupções ou delay, podemos usar o “Debouncing” por software (ou simplesmente os dois em conjunto).
Abaixo fica um exemplo de código para este “Debouncing”.
int switchPin = 2; int ledPin = 13; boolean lastButton = LOW; //variável representando o último estado do botão boolean ledOn = false; //variável representando o estado do LED void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { Serial.println(digitalRead(switchPin)); if (digitalRead(switchPin) == HIGH && lastButton == LOW) { //se último estado do botão era "baixo" e a leitura atual do botão indica "alto" ledOn = !ledOn; //inverte estado do LED lastButton = HIGH; //coloca último estado do botão como "alto" } else //caso contrário: { //lastButton = LOW; //coloca último estado do botão como "baixo" lastButton = digitalRead(switchPin); //coloca o valor atual do botão na variável de último estado do botão } digitalWrite(ledPin, ledOn); //escreve o valor de estado do LED no pino referente }
Um pequeno programa simples mas muito eficaz.
Sites consultados:
https://arduinobymyself.blogspot.pt/2012/02/debouncing.html
http://eletronworld.com.br/eletronica/efeito-bounce/
http://arduinoifsul.blogspot.pt/2012/09/debounce.html
https://www.arduino.cc/en/Tutorial/Debounce

