Debounce

Se alguém tiver uma manha legal de como fazer debounce me fala! Tô pesquisando outras soluções. Isso é o que eu fiz, mas não sei se é o mais correto e eficiente.

//uso o pino 2 da porta digital como interrupção, quando ele vai do negativo para o positivo a interrupção é executada e chama a função botao attachInterrupt(0, botao, RISING);

....

void botao() { if(pulseIn(2, HIGH)>20){ //com isso eu verifico se o botão ficou mais que 20 milisegundos apertado, o que indicaria que o botao realmente foi apertado e nao foi uma interferencia e faz o debounce impedindo que a rotina seja executada vairas vezes por mal contato. digitando=1; inicio_aux=DIR; } }

Acabei de pensar nisso aqui, será que é melhor?
Eu não cheguei a testar, mas estou ahcando que a primeira versão paraliza o processamento se a pessoa ficar com o dedo no botão.

void botao() {
long i=millis();
long j;

//verifica se ficou pelo menos 10 milisegundos com o botao acionado
while( (digitalRead(3)>0) && (i<(j-10)) ) {j=millis();}

//se depois da espera ainda estiver com o botao acionado entra na rotina
if(digitalRead(3)>0){
//faz o que tem que fazer
}
}

Me autorespondendo ;) Não funciona. Rotinas de tmpo não funcionam dentro de chamadas de interrupção. Aprendi isso ::)

O melhor resultado é essa rotina com amis ou menos esse valor: if(pulseIn(2, HIGH)>20000){

Cara, porque não usa esse library?

http://www.arduino.cc/playground/Code/Bounce

abraço