Si quieres filtrar por software:
1º Defines una variable con el estado del pulsador
Estado 1: Estado bajo, pulsador a nivel bajo
Estado 2: Estado bajo, pulsador a nivel alto
Estado 3: Estado alto, pulsador a nivel alto
Estado 4: Estado alto, pulsador a nivel bajo
2º Defines una variable de medida de tiempo en milisegundos.
Los estados 1 y 3 son estables. La medida de tiempo se asigna a cero
Los estados 2 y 4 son de transición. Tienes que medir cuanto tiempo se encuentra en ese estado y si supera un tiempo establecido, cambias el estado de 2 a 3 y de 4 a 1.
El cambio de estado entre 1 y 2 se produce al leer el nivel del pulsador.
Lo mejor es programarlo todo en una rutina y llamarla cada milisegundo:
unsigned long oldmillis;
unsigned char pulsador2;
setup() {
oldmillis = millis()+1;
}
loop() {
if (millis() >= oldmillis) {
oldmillis++;
teclado(); // Rutina de lectura del estado del teclado
}
// Resto del programa
if (pulsador2 == HIGH) {
....
}
...
}
En la función teclado se lee el pulsador y se actualiza el valor de la variable pulsador2 en consecuencia.
Esto te permite trabajar con el resto del programa sin que se paralice todo por la lectura del teclado.
Si quieres te comento cómo hacerlo con un RTOS muy sencillo que facilita las cosas.
Un saludo.