Cuando hablamos de entradas digitales es muy importante tener en cuenta dos aspectos:
- El conexionado de los sensores digitales en configuración pull-up o pull-down, si es necesario.
- Lo que se denomina rebote (bounce, en inglés)
El primero de los puntos lo hemos tratado en otra entrada. Ahora vamos a hablar de qué es el efecto rebote
No olvidemos que las entradas digitales (niveles alto o bajo) son muy habituales en robótica educativa, en informática, en cualquier sistema automático, en definitiva, en nuestra civilización.
Hemos traducido a ceros y unos todo lo que hemos podido, para después hacer «un apaño» y volver a transformarlo en cosas «palpables», reales, es decir, analógicas.
La entrada digital por excelencia: el botón
Imaginemos que hemos conectado un botón y queremos contar las veces que lo estamos pulsando.
Recordemos que habremos conectado el botón en configuración de pull-down para que registre bien los ceros (no pulsado) y los 1 (pulsado). Si no hacemos esto, tendríamos un problema incluso peor que el del rebote.

En la electrónica aplicada a la robótica educativa, muchas veces es preciso tener una idea de cómo están funcionando las cosas. Para ello contamos con hojas de datos (datasheet) que nos proporcionan muchísima información. Pero en componentes tan sencillos como los botones, hay cosas que se dan por supuestas.
Cuando apretamos un botón, lo único que hacemos es conectar de trozos de cable, lo que puede cerrar el correspondiente circuito. Cuando soltamos, desconectamos. Pero desde el momento en que soltamos (o deseamos soltar) el botón, hasta que el contacto físico desaparece transcurren unos milisegundos. No tenemos la velocidad del rayo.
¿Cómo resolver el efecto rebote en las entradas digitales?
Iremos paso a paso, desde la solución más natural y «evidente» donde se verá en todo su esplendor el efecto rebote, hasta que al final éste quede resuelto.
Así, mostraremos en esta entrada la forma en que se lleva a cabo un proceso de depuración de programas. Aunque este es un ejemplo simple, es difícil que un programa funcione a la primera, por lo que estaremos permanentemente mejorándolo.
Vamos a partir de una configuración de pull-down en el montaje del botón, como hemos visto arriba. Cuando pulsamos, ponemos nivel alto en la entrada.
Además, veremos la solución en formato de bloques, utilizando visualino con el objeto de facilitar la lectura. Recordemos que visualino proporciona el código escrito, por si queremos después utilizar el entorno de desarrollo integrado de arduino.
Problema: contar el número de veces que pulsamos un botón
a) Si el mundo real fuera ideal
Leemos la entrada. Si es nivel alto, sumamos uno y así cada vez que pulse.

Fácil, pero incorrecto, el mundo no es real y cuando pulsamos el botón, mientras soltamos hay varios milisegundos en los que al ir retirándose el contacto, se producen falsas medidas, como si hubiéramos vuelto a pulsar.
Es el llamado efecto rebote, que debemos evitar: cada vez que pulsamos una vez, la entrada de nivel alto sigue activa el tiempo suficiente para que a cada ejecución de ciclo, sume 1. En el ejemplo mostrado, he pulsado una vez y ha sumado 45.
Además, si mantenemos pulsado el botón, estará sumando indefinidamente, aunque sea una única pulsación.
b) Primera mejora: esperamos un poco, para evitar el tiempo de rebote
Después de leer la entrada del botón, esperamos una cantidad de milisegundos «suficientes» para que en la siguiente lectura cuente uno más, pero solo si se vuelve a pulsar.
Veamos dos opciones:
Opción 1: (bastante mala, ¿por qué? -ver abajo-)

Opción 2: (mejor, aunque también incorrecta)

Ninguna de las dos opciones es buena. En ambos casos, si mantenemos pulsado el botón más de 200 milisegundos, seguirá sumando.
Además, en la primera opción, hemos sacado el retraso (esperar[ms]) de la condición, por lo que se va a estar ejecutando en cada ciclo y si pulsamos mientras está parado, la pulsación no se va a detectar.
La ventaja (opción 2) es que resulta muy intuitivo lo que se está haciendo y es fácil de entender e implementar y podría ser válido si estamos seguros de que el tiempo entre activaciones es superior al retraso que pongamos. Dicho sea de paso, 200 milisegundos es demasiado elevado, un valor más ajustado sería de 100-150 milisagundos. Un ejemplo lo tenemos en el péndulo que usamos para calcular el valor de la gravedad.
En general, debemos evitar los delay() (que es en código la instrucción esperar[ms]), ya que paran por completo la ejecución del programa.
c) Almacenando el estado del botón
En esta solución, almacenamos el estado del botón y solo sumamos cuando detectamos el paso de nivel alto a bajo.

Esta solución todavía presenta algunos problemas de rebote.
d) Estableciendo un tiempo de rebote
Debido a la importancia del efecto rebote, en el entorno IDE de arduino en la sección ejemplos ya está implementada la solución. Basta con ir a: Archivo -> Ejemplos -> 02.Digital -> Debounce
Basándome en este ejemplo (que enciende y apaga un LED con el mismo botón, lo podéis comprobar), he preparado la siguiente solución:

Otros lugares donde podemos encontrar el efecto rebote
Debido a la omnipresencia de los sensores digitales, este tipo de problemas es muy común.
Ya vimos, en el caso del péndulo físico, que pretendíamos contar las activaciones de un sensor de infrarrojos (entrada digital). En aquel momento, y con vistas a una mayor simplicidad aplicamos un retraso, que es la opción ineficiente pero más intuitiva.
Hace un tiempo realicé un experimento que consistía en hacer caer una bola desde cierta altura e intentar medir el tiempo de caída. Utilicé como sensor «de llegada» dos láminas de papel de aluminio. En el momento de hacer contacto, se debía leer el tiempo que había transcurrido. Por supuesto, solo interesaba el momento exacto del contacto, no los posibles milisegundos que podrían quedar conectadas las dos láminas antes de volver a soltarse. El tiempo es crítico, porque pocos milisegundos pueden variar significativamente el resultado del cálculo de la aceleración de la gravedad.
Hay un juego de habilidad muy conocido que trata de pasar un aro metálico a lo largo de un alambre sin tocarlo en ningún momento. Si se toca, suena un zumbador y pierdes. Es un caso típico en el que tienes que evitar el rebote, si deseas contar el número de veces que tocas el alambre. Solo hay que pensar que aro y cable no son más que otra versión de los contactos un botón y deben cablearse igual.