miércoles, 7 de noviembre de 2012

Contador de pulsos con anti-rebote en Arduino

Debido a que los botones al presionarse sufren de transientes mecánicos antes de estabilizarse, es conveniente  utilizar funciones de antirrebote  que nos permitan tener lecturas más confiables del estado lógico de un botón. Lo que hace la función debounce() descrita en este programa es tomar una lectura 5 ms despues de ocurrido el primer flanco como se muestra en la imagen:
La función puede utilizarse tanto para eliminar rebotes de off-on como de on-off.

Programa:
// Rodolfo E. Escobar U.
// Facultad de Ciencias de la Electrónica, BUAP, México.

int conta = 0;  // Variable para el contador
boolean lastButton = LOW;    // Estado anterior 
boolean currentButton = LOW; // Estado actual 

void setup() 
{
  Serial.begin(9600);  // Inicia comunicación serial
  pinMode(8,INPUT);    //Pin 8 como una entrada (entrada de pulso)
}
 
 boolean debounce(boolean last) // Función antirebote
 {
   boolean current = digitalRead(8);
   if (last != current) // Se verifica haya ocurrido un cambio de estado
   {
     delay(5);
     current = digitalRead(8); //Se vuelve a leer el pin después de un delay
   }
   
   return current;
 }  

void loop() 
{           
 
  currentButton = debounce(lastButton); // Eliminación de rebote
  
  // Si hay cambio de estado en el botón
  if ( lastButton == LOW && currentButton == HIGH) 
  {
         conta++;               //Incrementa el contador
         Serial.println(conta); //Imprime el valor por consola
         delay (100);           // Retardo   
  }
  
    lastButton = currentButton; // Actualiza estado 
}
 
//Fin programa

2 comentarios:

Anónimo dijo...

Me ha sido de mucha utilidad, gracias.

Saludos desde España

Anónimo dijo...

Excelente funciona a la perfección!!!! Gracias