Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Corrige el contador para que cada pulsación se cuente una sola vez:

  • cuando reading sea diferente de lastReading, cuéntala si es una pulsación (LOW) y después espera 20 ms
  • sigue guardando lastReading al final de loop()

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;
}
quiz iconPonte a prueba

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