Diferencia entre revisiones de «Debounce»

De ArduWiki
Saltar a: navegación, buscar
(Código)
(Código)
Línea 26: Línea 26:
 
}
 
}
 
void loop(){
 
void loop(){
   int lee = digitalRead(pin);
+
   int lee a digitalRead(pin);
   int lee = digitalRead(pin);
+
   ... falta
  int lee = digitalRead(pin);
 
  int lee = digitalRead(pin);
 
  int lee = digitalRead(pin);
 
  int lee = digitalRead(pin);
 
  int lee = digitalRead(pin);
 
 
 
 
   digitalWrite(LED_BUILTIN, led);
 
   digitalWrite(LED_BUILTIN, led);
 
   anterior = lee;
 
   anterior = lee;

Revisión del 00:38 21 jun 2018

Los pulsadores a menudo generan transiciones falsas de apertura/cierre de contactos cuando se presionan, debido a problemas mecánicos y físicos: estas transiciones se pueden leer como múltiples presiones en un tiempo muy corto engañando al programa.

Este ejemplo muestra cómo eliminar el rebote de una entrada, lo que significa verificar dos veces en un corto período de tiempo para asegurarse de que el botón esté definitivamente presionado. Sin reblandecimiento, presionar el botón una vez puede causar resultados impredecibles. Este boceto usa la funcion millis() para realizar un seguimiento del tiempo transcurrido desde que se presionó el botón.

Placa aplicable

Todas.

Circuito

Conecta un pulsador entre el pin 2 y GND.

Código

El siguiente boceto está basado en la versión de rebote de Limor Fried.

const int pin = 2;       //Pulsador
const byte para = 50;    //Tiempo de rebote
unsigned long hora = 0;  //Hora ultima vez que pulsaste
byte led = LOW;          //Estado actual del LED
byte actual;             //Estado actual del pulsador (buttonState)
byte anterior = LOW;     //Estado anterior del pulsador (lastButtonState)

void setup() {
   pinMode(pin, INPUT_PULLUP);
   pinMode(LED_BUILTIN, OUTPUT);
   digitalWrite(LED_BUILTIN, led);
}
void loop(){
   int lee a digitalRead(pin);
   ... falta
   digitalWrite(LED_BUILTIN, led);
   anterior = lee;
}

Comentarios

  • Cada vez que el pin de entrada pasa de HIGH a LOW, el LED prende o apaga según el caso. Hay un retraso mínimo entre los conmutadores para rebotar el circuito (es decir ignorar el ruido).
  • Al principio el pulsador esta libre por lo que pin 2 esta en HIGH y se guarda en lee. Luego el primer if() comprueba si hay cambio de estado (lee != anterior), como no hay lo salta. El segundo if() ya que hora=0 entra y pregunta si pulsador sigue igual (lee != actual) y luego de guardar nuevamente dicho estado y pregunta si el estado actual es LOW y como no lo es salta el cuarto if() y guarda la lectura en anterior.
  • Ahora presionamos pulsador y pin 2 se pone LOW y se guarda en lee. Luego el primer if() comprueba si hay cambio de estado y como si hay entra al if() y guarda hora. Luego va el siguiente if() y aun no paso el tiempo de para por lo que guarda anterior como LOW.
  • EL pulsador sigue presionado por lo que pin 2 sigue LOW por lo que salta el primer if(). Continua haciendo bucles hasta que se cumple para cuando entra al segundo if(). Entra al tercer if() y guarda actual entra al cuarto if() y cambia led.

Vea también