Es muy habitual usar pulsadores conectados a las entradas de Arduino, bien en configuración PULL UP o PULL DOWN.
Yo personalmente prefiero la PULL_UP, es más inmune al ruido en caso del que el pulsador esté lejos del Arduino, y te puedes ahorrar el resistor si configuras el pin como INPUT_PULLUP.
El problema de los pulsadores es que al apretarlos y soltarlos se producen multitud de conexiones-desconexiones muy rápidas que hacen que la entrada en cuestión oscile entre 0 y 5V varias veces. Estas oscilaciones pueden ser detectadas por el programa de control y hacer que se comporte como si hubiésemos pulsado el pulsador una decena de veces, cuando en realidad solo lo hemos hecho una vez.
A estas falsas pulsaciones que ocurren de forma inevitable al accionar un pulsador se les denomina rebotes, (en inglés bouncing) y a las distintas técnicas que se usan para eliminarlas se les llama antirrebote (debouncing en Ingés).
En la imagen de arriba se ve como la entrada oscila entre 0 y 5V muchas veces durante más de 2ms hasta que finalmente se estabiliza en 0V. A este periodo de tiempo en que la entrada está oscilando le llamaremos tiempo de rebote.
Para evitar el problema de los rebotes, basta con añadir un condensador de la capacidad adecuada en paralelo con el pulsador. La capacidad del condensador ha de elegirse de modo que su tiempo de carga t = 5RC sea mucho mayor que el tiempo de rebote (unas 20 veces)
Cuando el pulsador está abierto el condensador se carga despacio a través del resistor pull up o pull down empujando la entrada de Arduino a 5V o 0V respectivamente. Cuando se aprieta el pulsador, el condensador se cortocircuita y se descarga de forma instantánea al primer microcontacto, a rápida secuencia de microdesconexiones que forman el rebote no duran lo suficiente para cargar el condensador y el voltaje de la entrada permanece estable a 0V o 5V.
Si la capacidad del condensador es alta, la energía eléctrica almacenada en él también lo será, en este caso la potencia térmica que se disipa en los contactos del pulsador puede ser considerable y se corre el riesgo de deteriorarlos, por lo que hay que mantener la capacidad del condensador lo mas baja posible.
Ejemplo de cálculo
Supondremos que los microcontactos que queremos eliminar se producen 5ms antes y después del contacto total (como en el gráfico de arriba), como ya se ha dicho, para evitar la oscilación de la entrada, el tiempo de carga del condensador antirrebote ha de ser unas 20 veces mayor que el tiempo de rebote 20 x 5ms = 0,1s.
Sustitutendo en la fórmula un tiempo de carga de 0,1s, una resistencia de PULL UP de 20K, que es el valor mínimo en Arduino (depende del modelo de placa y el fabricante) tenemos:
t = 5 x R x C
0,1 = 5 x 20.000 x C.
C = 1E-6F = 1uF.
Este es un valor relativamente grande, por lo puede ser conveniente usar una resistencia externa de pull up con un valor superior a la de Arduino (por ejemplo 60K para obtener C = 0,3 uF) y así poder usar un condensador antirrebote más pequeño.