les vencimos · offline

L12. Rebote: por qué un clic cuenta tres

El mundo entra (22–38%)

Maestro

El pulsador no cierra de una vez. El metal rebota y, en unos milisegundos, el pin ve varios cierres. Si cuentas flancos, un clic humano sale como tres o cuatro. No es que pulses mal. Es mecánica. El arreglo de hoy es esperar un poco tras el cambio. Más adelante se hará sin dormir el programa. Hoy vale la espera corta.

Cuando el contacto toca, vibra. digitalRead, que es rapidísimo, alcanza a ver HIGH, LOW, HIGH, LOW antes de que tu dedo «haya terminado». Un contador ingenuo suma cada paso. Por eso un clic cuenta tres.

El arreglo simple: cuando ves que el pin se ha apretado (LOW), esperas unos 30 milisegundos y miras otra vez. Si sigue LOW, era un clic de verdad. Esos 30 milisegundos son el debounce. delay aquí es corto y consciente. Sigue bloqueando, y hay que decirlo, pero 30 ms no se comen un gesto humano. Un delay de un segundo sí.

El sketch de abajo cuenta clics en una variable y enciende el LED 13 si el número es impar, para que veas el cambio sin Serial. Serial, ver el número en el ordenador, llega más tarde. Hoy la luz es el testigo: un clic la enciende, el siguiente la apaga, si el rebote está domado. Prueba también a quitar el delay, si te atreves, y mira cómo un solo dedo dispara varios cambios.

No uses interrupciones en esta lección. Existen y viven en la referencia de Software. Aquí el mecanismo es la espera corta, a la vista.

Montaje

un dedo, varios flancosespera 30 ms y lee otra vez
Un dedo cierra el contacto varias veces en unos milisegundos. El dibujo es ese temblor, no un segundo botón.

Pines de esta lección

Uno R3 · 5 V · mira la serigrafía, no la memoria2flanco30 mssegunda lectura13cambiaGNDmasa
Se mira el cambio de HIGH a LOW, se espera 30 ms, y se lee otra vez.

Por qué

El metal del pulsador no cierra de una vez. Rebota. En unos milisegundos el pin ve varios HIGH y LOW aunque tu dedo haya hecho un solo gesto. Si cuentas cada cambio, un pulso se convierte en tres o cinco. El LED que debía alternar se queda donde el azar lo dejó.

La cura de este curso es corta y bloqueante, a propósito: se detecta el paso de suelto a pulsado, se espera 30 ms, y se lee de nuevo. Si sigue LOW, se acepta el gesto. No es la cura fina de las interrupciones; esa vive en el módulo de Software. Aquí basta para un dedo humano.

Hace falta recordar la lectura anterior. Si solo miras el nivel, mientras el dedo sigue apretado el loop cuenta una vez por vuelta. El flanco, el momento del cambio, es lo que se cuenta. anterior se actualiza al final, siempre, no solo cuando cuentas.

30 ms no es sagrado. 20 también suele valer, 100 se nota perezoso. Si esperas un segundo, dejas de contar rebotes y empiezas a perder pulsaciones de verdad.

Práctica

  1. Carga el sketch del contador con la espera de 30 ms.
  2. Da un solo golpe seco. El LED 13 debe cambiar una vez, no quedarse igual.
  3. Da diez golpes despacio. El LED debe acabar como empezó, porque diez es par: cada dos golpes vuelve.
  4. Mantén apretado un segundo. El LED no debe seguir alternando él solo. Si lo hace, estás contando nivel, no flanco.
  5. Quita el delay(30) , carga, y da golpes parecidos. Anota si algún golpe no cambia o cambia de más.
  6. Vuelve a poner los 30 ms antes de seguir.
  7. No mires el contador por el monitor. El LED es el testigo.

Práctica en la página

Cada golpe cambia el LED una vez. Varios clics en 30 ms cuentan como uno. La simulación arranca encendida.

Ejemplos resueltos

Cuenta mientras lo tienes apretado

El if solo dice si ahora es LOW, sin mirar el anterior. Cada vuelta de loop suma uno mientras el dedo sigue. El LED parpadea a toda velocidad y el contador deja de significar golpes.

Se guarda anterior. Solo se cuenta cuando anterior era HIGH y ahora es LOW. Al soltar, anterior vuelve a HIGH y el próximo golpe puede contar.

La segunda lectura se olvidó

Hay delay(30) pero no se vuelve a leer el pin: se acepta el primer LOW, que a veces era un rebote de la suelta. De vez en cuando un golpe cambia dos veces.

Después de la espera se lee otra vez. Si ya no está LOW, era ruido y no se cuenta. Si sigue, era un dedo.

En la mesa

Cuenta en voz alta cada clic, no cada cambio del LED. Diez clics. Si el LED no ha cambiado diez veces, hay rebotes de más o clics que no cierran. Mira primero si el while o la memoria del estado anterior existen. Si cuentas nivel en vez de flanco, el LED baila mientras el dedo sigue abajo, y eso se oye distinto: muchos cambios en un solo clic. Ese sonido del ojo es el diagnóstico.

Quita los 30 ms, carga, y repite los diez clics con el mismo dedo y el mismo ritmo. Anota la diferencia en el papel, aunque sea la palabra peor. Vuelve a poner los 30 ms. Sin esa ida y vuelta, la espera es un número mágico. Con ella, es la cura que acabas de ver.

No subas la espera a medio segundo para que quede más bonito. Pulsa rápido dos veces. Si la segunda se pierde, te pasaste. 30 ms deja pasar un dedo humano y corta el metal. Ese es el compromiso de la lección, no el de las interrupciones, que están en Software y no se improvisan aquí.

Sketch

int contador = 0;
int anterior = HIGH;

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {
  int ahora = digitalRead(2);
  if (anterior == HIGH && ahora == LOW) {
    delay(30);
    if (digitalRead(2) == LOW) {
      contador = contador + 1;
      digitalWrite(13, contador % 2);
    }
  }
  anterior = digitalRead(2);
}

Ejercicio

Sube el contador con espera de 30 ms. Da diez clics lentos. El LED debe cambiar una vez por clic. Si salta de más, sube la espera a 50 ms y no a medio segundo.

Autoevaluación

1. ¿Por qué un solo clic puede contarse varias veces?

2. ¿Cuánto espera el arreglo simple de esta lección?

3. ¿Esta lección enseña interrupciones?