Debounce
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); }
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.