Stabilire pulsanti in sequenza.

Ciao a tutti,
Ultimamente ho realizzato una piccola tastiera composta da 5 pulsanti, il mio intento era quello di avviare un relè all'inserimento di una sequenza specifica.
il codice l'ho realizzato e funziona, il problema è che se per esempio la sequenza è 2 2 3 3 1 indifferentemente che io parta dal primo o dall'ultimo pulsante il codice viene accettato.
io invece voglio che il codice venga decodificato seguendo una scala, pulsante 1, 2, 3, 4, 5

il codice è:

byte stato=1;
int LED_ROSSO = 8;
int LED_VERDE = 10;
int LED_BIANCO = 9;
int SW1 = 2;
int SW2 = 3;
int SW3 = 4;
int SW4 = 5;
int SW5 = 6;
int Buzzer = 12;
int a, b, c, d, e, code1, code2, code3, code4, code5, resetTimer = 0;

void setup() {
  
  pinMode (LED_BIANCO, OUTPUT);
  pinMode(LED_ROSSO, OUTPUT);
  pinMode(LED_VERDE, OUTPUT);
  pinMode(Buzzer, OUTPUT);

  pinMode(SW1, INPUT);
  digitalWrite(SW1, HIGH);

  pinMode(SW2, INPUT);
  digitalWrite(SW2, HIGH);

  pinMode(SW3, INPUT);
  digitalWrite(SW3, HIGH);

  pinMode(SW4, INPUT);
  digitalWrite(SW4, HIGH);

  pinMode(SW5, INPUT);
  digitalWrite(SW5, HIGH);

  
  Clr_Code();
}

void loop()
{

  // Button1 = 5 presses
  if (!digitalRead(SW1))
  {
    delay(50);
    if (!digitalRead(SW1))
    {
      
      Stand();
      Blink();
      a++;
      if (a == 2)
      {
        code1 = true;
      } else code1 = false;

      do {
      } while (!digitalRead(SW1));
    }
  }
// button 2
  if (!digitalRead(SW2))
  {
    delay(50);
    if (!digitalRead(SW2))
    {
      Stand();
      Blink();
      b++;
      if (b == 2)
      {
        code2 = true;
      } else code2 = false;

      do {
      } while (!digitalRead(SW2));
       
    }
  }
  
//button 3
  if (!digitalRead(SW3))
  {
    delay(50);
    if (!digitalRead(SW3))
    {
      Stand();
      Blink();
      c++;
      if (c == 1)
      {
        code3 = true;
      } else code3 = false;

      do {
      } while (!digitalRead(SW3));
    }
  }

//button 4
  if (!digitalRead(SW4))
  {
    delay(50);
    if (!digitalRead(SW4))
    {
      Stand();
      Blink();
      d++;
      if (d == 5)
      {
        code4 = true;
      } else code4 = false;

      do {
      } while (!digitalRead(SW4));
    }
  }

 
 // pulsante 5
  if (!digitalRead(SW5))
  {
    delay(50);
    if (!digitalRead(SW5))
    {
      
      Blink();
      Stand();
      e++;
      if (e == 3)
      {
        code5 = true;
      } else code5 = false;

      do {
        delay(50);
        resetTimer++;

        if (resetTimer > 50)
        {

          Clr_Code();

          break;
        }
      } while (!digitalRead(SW5));
      resetTimer = 0;
    }
  }

  if (code1 == true && code2 == true && code3 == true && code4 == true && code5 == true)
  {
    digitalWrite(LED_VERDE, HIGH);
    digitalWrite(LED_BIANCO, LOW);

    delay(5000);



    Clr_Code();
    digitalWrite(LED_VERDE, LOW);
  }
  else
  {
    digitalWrite(LED_VERDE, LOW);
  }
}

void Blink(void)
{
  digitalWrite(LED_ROSSO, HIGH);
  tone(Buzzer, 520, 150);
  delay(250);
  digitalWrite(LED_ROSSO, LOW);

}
void Stand (void)
{
  digitalWrite(LED_BIANCO, HIGH);
 


}

void Clr_Code (void) {
  a = 0;
  b = 0;
  c = 0;
  d = 0;
  e = 0;
  code1 = 0;
  code2 = 0;
  code3 = 0;
  code4 = 0;
  code5 = 0;
  resetTimer = 0;
}

spero di essere stato abbastanza chiaro :slight_smile: , grazie.

La sequenza che hai messo come esempio "22331" cosa significa:

2 pressioni sul pulsante 1 + 2 pressioni sul pulsante 2 + 3 pressioni sul pulsante 3 + 3 pressioni sul pulsante 4 + 1 pressione sul pulsante 5?

Oppure è la sequenza con cui vengono premuti i pulsanti:

P2 + P2 + P3 + P3 + P1?

Attilio

si esatto
2 pressioni sul pulsante 1
2 pressioni sul pulsante 2
3 pressioni sul pulsante 3
3 pressioni sul pulsante 4
1 pressione sul pulsante 5

l'unico problema è che se faccio la sequenza al contrario o casualmente il codice viene accettato lo stesso, la mia intenzione era quella di fare in modo che il codice venga accettato solo se si premono i pulsanti in sequenza.

Butto li un'idea:

Devi vincolare la lettura di un pulsante alla avvenuta pressione di quello precedente. Mi spiego meglio (forse :D).

Definisci dei flag dal pulsante 2 in poi (diciamo fp2, fp3, ....) e impostali a "false"
Il pulsante 1 è libero e se premuto imposta fp2=true
Il pulsante 2 viene letto solo se è stato premuto l'1 e quindi fp2=true. Il pulsante 2 imposta a sua volta a fp3=true.
Il pulsante 3 viene letto solo se fp3=true e imposta fp4=true che sblocca il pulsante 4 e così via.
L'ultimo pulsante mette tutti i flag a "false" in modo che la sequenza possa ripartire solo con la pressione di P1.

Spero di essere riuscito a spiegarmi.

Ciao

Attilio

Sketch per keypad, secret code, Password Lock, niente di più.
il tuo code sarà 11223334445
che tra l'altro hai già usato qui Aiuto fine progetto allarme/antifurto - Generale - Arduino Forum nel 2014 senza più rispondere

ma vedo che è una tua abitudine fare la domanda e poi sparire ... poco serious

Ciao,
se il codice da inserire è del tipo
P1, P3, P4, P5, P5, P1
la routine nel loop la farei così (tieni presente che l'ho scritta al lavoro col notepad, per cui possono esserci errori di sintassi... Ho messo i commento così puoi vedere l'algoritmo che ho pensato qui su due piedi... :smiley:

byte lockCode[6] = {1,3,4,5,5,1};
byte digitsCorrect = 0;
byte actualDigit = 0;

void loop()
{
    byte lockCodeLen = sizeof(lockCode);
    byte DigitPressed;
    
    if (!digitalRead(SW1)) 
        DigitPressed = 1;
    else if (!digitalRead(SW2)) 
        DigitPressed = 2;
    else if (!digitalRead(SW3)) 
        DigitPressed = 3;
    else if (!digitalRead(SW4)) 
        DigitPressed = 4;
    else if (!digitalRead(SW5)) 
        DigitPressed = 5;
    else
        DigitPressed = 0;
    
    //Se ho un pulsante premuto
    if (DigitPressed != 0)        
    {
        // Se il pulsante corrisponde al codice in posizione actualDigit
        if (DigitPressed == lockCode[actualDigit])
        {
            //  Incremento il numero di digit inseriti correttamente
            digitsCorrect++;
        }
        //Passo al digit successivo
        actualDigit++;
    }
    
    // Se ho inserito tuuti i digit richiesti
    if (actualDigit == lockCodeLen)
    {
        // Se il numero di digit corretti corrisponde al numero di digits del codice
        if(digitsCorrect == lockCodeLen)
        {
            //Codice corretto
        }
        else
        {
            //Codice errato
        }
        
        //Ok, ho iserito tuuti i digits, per cui azzero le mie variabili per il controllo del codice e son opronto per una ltro inserimento
        actualDigit = 0;
        digitsCorrect = 0;
    }
    
    do
    {
        // Attendo il rilascio del pulsante per andare avanti
    }
    while ( (!digitalRead(SW1)) ||
            (!digitalRead(SW2)) ||
            (!digitalRead(SW3)) ||
            (!digitalRead(SW4)) ||
            (!digitalRead(SW5)) );
}

Grazie a tutti per le risposte alla fine mi sono comperato una tastiera normale e ho programmato quella con un mio vecchio codice.
ho messo da parte i pulsanti che ho creato su basetta millefori per il momento :confused: , dovrò studiarmi meglio il codice, purtroppo non ho molto tempo a disposizione :frowning: