Conta punti solo se premi 2 pulsanti in 2 secondi

Salve ragazzi,
stavo scrivendo questo sketch per arduino. In pratica ho due pulsanti, se li premo entrambi a distanza di meno 2 secondi l’uno dall’altro, allora incremento il contatore.
Quindi leggo i pin dei pulsanti e memorizzo il tempo in cui sono stati premuti, se sono entrambi stati premuti e se la differenza dei tempi è minore di 2 secondi, allora aumento il contatore dei punti.
Però ho un piccolo problema, a volte è come se non rispondesse, cioè premo entrambi (anche assieme o a distanza di nemmeno 1 sec) ma non mi incrementa il contatore.
Sapreste darmi qualche aiuto o qualche soluzione migliore?

#define blu1_pin 7
#define blu2_pin 8
#define pausa 2000
unsigned long blu1_tempo,blu2_tempo;
boolean blu1, blu2;
int punti;

void setup()
{
 Serial.begin(9600);
 blu1_tempo=0;
 blu2_tempo=0;
 blu1=1;
 blu2=1;
 punti=0;
}
void loop()
{
  if(digitalRead(blu1_pin)!=blu1 && millis()-blu1_tempo > pausa)
  {
    blu1=digitalRead(blu1_pin);
    if(blu1==0)
    blu1_tempo=millis();
  }
  
  if(digitalRead(blu2_pin)!=blu2 && millis()-blu2_tempo > pausa)
  {
    blu2=digitalRead(blu2_pin);
    if(blu2==0)
    blu2_tempo=millis();
  }

  if(blu1==0 && blu2==0 && 
  ((blu1_tempo-blu2_tempo )<pausa || (blu2_tempo-blu1_tempo)<pausa))
  {
    punti++;
    Serial.print(blu1);
    Serial.print("            ");
    Serial.print(blu1_tempo);
    Serial.print("       ");
    Serial.print(blu2);
    Serial.print("       ");
    Serial.print(blu2_tempo);
    Serial.print("\n");
    Serial.print("Blu +1");
    Serial.print("     ");
    Serial.print(punti);
    Serial.print("\n");
    blu1_tempo=blu2_tempo+=1500;
  }
}

Grazie.

Potreste aiutarmi con la soluzione? :\

Nessuno può aiutarmi? :\

Provando lo sketch con i pulsanti del circuito interessato, ho scoperto che il venditore mi ha venduto in realtà degli interruttori, anche se gli ho chiesto espressamente dei pulsanti e chiesto più volte se fossero pulsanti.
Quindi ho riadattato lo sketch in questo modo, che in realtà è anche più semplice (dovrei ringraziare il venditore forse? xD)

#define blu1_pin 7
#define blu2_pin 8
#define pausa 2000
unsigned long blu1_tempo,blu2_tempo, tempo;
boolean blu1, blu2, blu1_premuto, blu2_premuto, blu1_letto, blu2_letto;

void setup()
{
 Serial.begin(9600);
 pinMode(blu1_pin, INPUT);
 pinMode(blu2_pin, INPUT);
 blu1_tempo=0;
 blu2_tempo=0;
 blu1=digitalRead(blu1_pin);
 blu2=digitalRead(blu2_pin);
 blu1_premuto=false;
 blu2_premuto=false;

}
void loop()
{
  blu1_letto=digitalRead(blu1_pin);
  blu2_letto=digitalRead(blu2_pin);
  tempo=millis();
  
  if(blu1_letto!=blu1)
  {
    blu1=blu1_letto;
    blu1_tempo=tempo;
    blu1_premuto=true;
  }
  else
  blu1_premuto=false;
  
  if(blu2_letto!=blu2)
  {
    blu2=blu2_letto;
    blu2_tempo=tempo;
    blu2_premuto=true;
  }
  else
  blu2_premuto=false;

  if(blu1_premuto==true && blu2_premuto==true && ((blu1_tempo-blu2_tempo)<=pausa || (blu2_tempo-blu1_tempo)<=pausa))
  {

    Serial.print(blu1);
    Serial.print("            ");
    Serial.print(blu1_tempo);
    Serial.print("       ");
    Serial.print(blu2);
    Serial.print("       ");
    Serial.print(blu2_tempo);
    Serial.print("\n");
    Serial.print("Blu +1");
    Serial.print("     ");
    Serial.print("\n");
 }
}

Ma purtroppo ora non entra nemmeno nell’if finale (quello con i println).
Sono stremato =( .
Sapreste darmi qualche consiglio?

Uppare una discussione NON è consensito dal regolamento. Questo è un forum, non l’assistenza di una scuola di informatica :wink:

La soluzione al tuo problema necessita di 2 variabili per salvare il valore di millis quando vengono premuti i pulsanti e di 2 variabili di stato per sapere appunto se i pulsanti sono stati premuti. Però devi anche azzerare tutto quando sono passati 2 secondi dalla prima pressione, e questa è la cosa che mi pare tu non faccia.

Io farei così:

void loop() {
  if (digitalRead(PULS1)) {
    if !pulsante1) { //questo per evitare di registrare nuovamente l'evento
      pulsante1 = true;
      tempo_puls1 = millis();
    }
  }
  if (digitalRead(PULS2)) {
    if !pulsante2) { //questo per evitare di registrare nuovamente l'evento
      //puoi togliere questo if se non vuoi questo tipo di logica
      pulsante2 = true;
      tempo_puls2 = millis();
    }
  }
  if (pulsante1 && pulsante2) { //se e solo se entrambi i pulsanti sono stati premuti
    if (tempo_puls1 >= tempo_puls2) { //premuto prima puls2
      if ((tempo_puls1 - tempo_puls2) < 2000)) {
        ok = true;
      }
    } else { //premuto prima puls1
      if ((tempo_puls2 - tempo_puls1) < 2000)) {
        ok = true;
     }
   }
  }
  //controllo se sono passati più di 2 secondi dalla prima pressione
  tempo = millis();
  if (pulsante1) {
    if ((tempo - tempo_puls1) > 2000) {
      pulsante1 = false;
    }
  }
  if (pulsante2) {
    if ((tempo - tempo_puls2) > 2000) {
      pulsante2 = false;
    }
  }
  //ora controllo:
  if (ok) {
     ..... fai quel che devi
  }
}

Nota: codice NON provato, scritto sul forum e non nell’IDE. E’ uno spunto, potrebbe anche non compilare né funzionare :sweat_smile: