Eliminar el rebote de un botón
Parte de la sección Entradas del Journey de Arduino de Coddy. Lección 6 de 22.
El botón de esta lección es real, y el programa inicial es tu contador de la lección anterior. Ejecútalo y pulsa el botón una vez: el contador aumenta en más de uno.
Dentro de un botón, dos contactos metálicos se tocan. Cuando se juntan, rebotan: durante aproximadamente un milisegundo hacen contacto, se separan como un resorte y vuelven a hacer contacto. Al soltar el botón ocurre lo mismo. loop() lee el pin muchas veces durante ese milisegundo y cuenta cada rebote como una pulsación.
La solución se llama eliminación del rebote: cuando la lectura cambia, actúa una vez y luego espera unos 20 ms a que los contactos se estabilicen antes de volver a leer. Una persona no nota 20 ms.
if (reading != lastReading) {
if (reading == LOW) {
presses++;
Serial.println(presses);
}
delay(20);
}
lastReading = reading;Espera después de cada cambio, no solo después de una pulsación: al soltar también hay rebote, y cada rebote al subir parece una nueva pulsación.
Desafío
IntermedioCorrige el contador para que cada pulsación se cuente una sola vez:
- cuando
readingsea diferente delastReading, cuéntala si es una pulsación (LOW) y después espera 20 ms - sigue guardando
lastReadingal final deloop()
Pulsa Run, pulsa el botón unas cuantas veces y observa el contador; después, pulsa Check.
Pruébalo tú mismo
const int buttonPin = 2;
int presses = 0;
int lastReading = HIGH;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading == LOW && lastReading == HIGH) {
presses++;
Serial.println(presses);
}
lastReading = reading;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Entradas
Practica por tu cuenta: Playground de Arduino