Este es un código no probado que puede darle algunas ideas. Dado que probablemente querrá un poco de rebote incluso con una sola pulsación, el enfoque es seguir cambiando ocho lecturas a través de un byte para tener un registro de las últimas 8 lecturas. Luego, cuando se establece MSB, cuenta el número de veces en esas muestras que ocurren 2-4 en una fila y las trata como un clic, dos de estas ocurrencias se tratan como un doble clic.
Es posible que necesite jugar con la frecuencia de muestreo y esos números para adaptarse a su dispositivo de entrada, y como se mencionó, no se ha probado, pero puede darle una idea de cómo hacerlo.
int readButton(int button) {
b0 = bitRead(button,0);
b1 = bitRead(button,1);
b2 = bitRead(button,2);
digitalWrite(10,b0);
digitalWrite(9,b1);
digitalWrite(8,b2);
if (digitalRead(buttonPin) == HIGH)
return 1;
else
return 0;
}
// Perform following in timer or at a fixed interval
// Keep a list of the last 8 button states, LSB is most recent
for (int buttonCount = 0; buttonCount < 8; buttonCount++) {
buttonValue[buttonCount] <<= 1;
buttonValue[buttonCount] |= readButton(buttonCount);
if (buttonValue[buttonCount] & 0x80) {
int onCount = 0, clickCount = 0;
for (int bitPos = 0; bitPos < 8; bitPos++) {
if (buttonValue[buttonCount] << bitPos & 1)
onCount++;
else {
// Treat 2-4 readings in a row as a click
if ((onCount >= 2) && (onCount <= 4))
clickCount++;
onCount = 0;
}
}
if (clickCount > 0)
{
if (clickCount == 1)
singleClick(buttonCount);
else
doubleClick(buttonCount);
buttonValue[buttonCount] = 0;
}
}
}