Único y doble clic en los botones multiplexados de Arduino

1

En mi proyecto arduino tengo 8 botones conectados a un multiplexor 4051. Sin embargo, me gustaría agregar funcionalidades de simple y doble clic a cada uno de estos botones, pero no puedo encontrar la manera de hacerlo.

Mi código para los botones en este momento se ve así:

for (int buttonCount = 0; buttonCount < 8; buttonCount++){
b0 = bitRead(buttonCount,0);
b1 = bitRead(buttonCount,1);
b2 = bitRead(buttonCount,2);

digitalWrite(10,b0);
digitalWrite(9,b1);
digitalWrite(8,b2);

buttonValue[buttonCount] = digitalRead(buttonPin);

if (buttonValue[buttonCount] == CLICK_SINGLECLICK && buttonValue[buttonCount] != lastButtonValue[buttonCount]) {
  Serial.println(buttonCount);
}

Cualquier ayuda sería muy apreciada!

    
pregunta LuisBento

2 respuestas

1

No estoy familiarizado con Arduino y las bibliotecas, pero en realidad no depende de eso de todos modos.

Al menos necesitarás un temporizador de algún tipo que se ejecute en segundo plano. Este temporizador "expira" después de la velocidad de doble clic deseada (tiempo entre dos clics). El temporizador se reinicia después de presionar cada botón.

Luego realice algunas verificaciones como esta (pseudo-código):

...
if (buttonHasBeenPressed) {
    if (timerIsExpired || (currentButton != previousButton)) {
        Print("Button has been clicked");
    } else {
        Print("Button has been DOUBLE clicked");             
    }

    ResetTimer(); 
}
...

Este es un disparo rápido, pero debería darle una idea de cómo enfocarlo.

EDITAR: Me acabo de dar cuenta de que en esta solución, un doble clic siempre estará precedido por un solo clic. Probablemente esto no sea lo que desea, por lo que tiene que hacer algunas comprobaciones adicionales.

    
respondido por el Rev1.0
0

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;
       }
    }
}
    
respondido por el PeterJ

Lea otras preguntas en las etiquetas