Usare pulsanti analogici e password!

Ciao a tutti, vorrei realizzare con il mio Arduino Uno una schermata di accesso con password, l'unico problema(forse) è che utilizzo dei pulsanti analogici, non possiedo un tastierino.
Volevo sapere se era possibile creare una password di soli 4 numeri usando 4 pulsanti analogici. Vi sarei molto grato se mi aiutaste in questa piccola impresa.
Grazie.

secondo me è possibile..basterebbe creare una variabile X..a ogni pulsante dai la possibilità di aumentare di n il valore di x e al raggiungimento di un valore predefinito Y permetti di visualizzare la schermata precedente..esemplificando

x=0
se premi i pulsanti nella sequenza 1,3,4,2 ottieni il valore 5
se li premi 2,4,1,3 ottieni 6

se 5 è il valore corretto accedi al livello successivo...spiegato alla "carlona" ma potrebbe essere un punto di partenza..spero per te :stuck_out_tongue:

Ciao, si sta pensando una cosa simile anche io.. vediamo cosa ne esce fuori :slight_smile: !
Nel frattempo se qualcuno ha realizzato qualcosa di simile in passato, gli sarei molto grato se potesse pubblicare la porzione di codice.

Grazie

Ciao.
Anche io pochi giorni fa ho sbattuto la testa per cercare di realizzare un progetto simile.
Il codice che ho scritto è questo:

//PSW CON PULSANTI//

//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 2;
const int second_button = 3;
const int third_button = 4;
const int fourth_button = 5;
//LED
const int first_led = 6;
const int second_led = 7;
const int third_led = 8;
const int fourth_led = 9;
//SEGNALE DI ABILITAZIONE
const int enable_signal = 10;
//LED DI FUNZIONAMENTO
const int on_led = 13;
//PIN COMUNICAZIONE SERIALE
const int serial = 11;
 
void setup () {
  pinMode (first_button, INPUT);   //primo pulsante
  pinMode (second_button, INPUT);   //secondo pulsante
  pinMode (third_button, INPUT);   //terzo pulsante
  pinMode (fourth_button, INPUT);   //quarto pulsante
  pinMode (first_led, OUTPUT);  //primo pulsante ok
  pinMode (second_led, OUTPUT);  //secondo pulsante ok nella giusta sequenza
  pinMode (third_led, OUTPUT);  //terzo pulsante ok nella giusta sequenza
  pinMode (fourth_led, OUTPUT);  //quarto pulsante ok nella giusta sequenza
  pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
  pinMode (on_led, OUTPUT); //led di funzionamento
}
 
void loop () {
digitalWrite(on_led, HIGH);

  //SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
  if (sequenza == 0) {
    if (digitalRead(second_button) == HIGH) {
      sequenza = 1;
      digitalWrite(first_led, HIGH);
      delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
  if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
    if (digitalRead(fourth_button) == HIGH) {
      sequenza = 2;
      digitalWrite(second_led, HIGH);
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
  if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
  if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
    if (digitalRead(first_button) == HIGH) {
      sequenza = 3;
      digitalWrite(third_led, HIGH);
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
  if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
  if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
    if (digitalRead(third_button) == HIGH) {
      sequenza = 0;    //RESETTO
      digitalWrite(fourth_led, HIGH);
      digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE     
      delay(1000);               //LO TENGO ATTIVO PER 1 SECONDO
      digitalWrite(enable_signal, LOW);  //LO DISATTIVO
      //RESETTO TUTTI I LED
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
      digitalWrite(third_led, LOW);
      digitalWrite(fourth_led, LOW);
    }
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
  if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
      digitalWrite(third_led, LOW);
  } 
}

Ho preso il sorgente da questo sito: agostinopolizzano.info - agostinopolizzano Resources and Information.
è lo ho successivamente modificato alle mie esigenze.
In questo esempio alla pressione di un pulsante si accende un led, nel caso la sequenza non corrisponde si spengono tutti e riparte il programma.
Nella seconda versione che ho scritto, invece dei led ho usato un display LCD che alla giusta sequenza stampa una stringa.
ecco il codice:

//PSW CON PULSANTI ED LCD 16*2//
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 10;
const int second_button = 9;
const int third_button = 8;
const int fourth_button = 7;
//LED
const int enable_signal = 6;
//LED DI FUNZIONAMENTO
const int on_led = 13;

 
void setup () {
  pinMode (first_button, INPUT);   //primo pulsante
  pinMode (second_button, INPUT);   //secondo pulsante
  pinMode (third_button, INPUT);   //terzo pulsante
  pinMode (fourth_button, INPUT);   //quarto pulsante
  pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
  pinMode (on_led, OUTPUT); //led di funzionamento
  lcd.begin(16, 2);
}
 
void loop () {
digitalWrite(on_led, HIGH);

  //SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
  if (sequenza == 0) {
    if (digitalRead(second_button) == HIGH) {
      sequenza = 1;
      lcd.print("2");
      delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
  if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
    if (digitalRead(fourth_button) == HIGH) {
      sequenza = 2;
      lcd.print("4");
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
  if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
      sequenza = 0;
      lcd.clear();
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
  if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
    if (digitalRead(first_button) == HIGH) {
      sequenza = 3;
      lcd.print("1");
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
  if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      lcd.clear();
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
  if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
    if (digitalRead(third_button) == HIGH) {
      sequenza = 0;    //RESETTO
      lcd.print("3");
      delay(1250);
      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("Psw Corretta");
      digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE     
      delay(4000);               //LO TENGO ATTIVO PER 5 SECONDI
      digitalWrite(enable_signal, LOW);  //LO DISATTIVO
      lcd.clear();
    }
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
  if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      lcd.clear();
  } 
}

Spero di esserti stato di aiuto.
Hertz.

Hertz:
Ciao.
Anche io pochi giorni fa ho sbattuto la testa per cercare di realizzare un progetto simile.
Il codice che ho scritto è questo:

//PSW CON PULSANTI//

//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 2;
const int second_button = 3;
const int third_button = 4;
const int fourth_button = 5;
//LED
const int first_led = 6;
const int second_led = 7;
const int third_led = 8;
const int fourth_led = 9;
//SEGNALE DI ABILITAZIONE
const int enable_signal = 10;
//LED DI FUNZIONAMENTO
const int on_led = 13;
//PIN COMUNICAZIONE SERIALE
const int serial = 11;

void setup () {
 pinMode (first_button, INPUT);   //primo pulsante
 pinMode (second_button, INPUT);   //secondo pulsante
 pinMode (third_button, INPUT);   //terzo pulsante
 pinMode (fourth_button, INPUT);   //quarto pulsante
 pinMode (first_led, OUTPUT);  //primo pulsante ok
 pinMode (second_led, OUTPUT);  //secondo pulsante ok nella giusta sequenza
 pinMode (third_led, OUTPUT);  //terzo pulsante ok nella giusta sequenza
 pinMode (fourth_led, OUTPUT);  //quarto pulsante ok nella giusta sequenza
 pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
 pinMode (on_led, OUTPUT); //led di funzionamento
}

void loop () {
digitalWrite(on_led, HIGH);

//SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
 if (sequenza == 0) {
   if (digitalRead(second_button) == HIGH) {
     sequenza = 1;
     digitalWrite(first_led, HIGH);
     delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
   }
 }
 //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
 if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
   if (digitalRead(fourth_button) == HIGH) {
     sequenza = 2;
     digitalWrite(second_led, HIGH);
     delay(1000);
   }
 }
 //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
 if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
     sequenza = 0;
     digitalWrite(first_led, LOW);
 }
 //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
 if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
   if (digitalRead(first_button) == HIGH) {
     sequenza = 3;
     digitalWrite(third_led, HIGH);
     delay(1000);
   }
 }
 //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
 if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
     sequenza = 0;
     digitalWrite(first_led, LOW);
     digitalWrite(second_led, LOW);
 }
 //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
 if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
   if (digitalRead(third_button) == HIGH) {
     sequenza = 0;    //RESETTO
     digitalWrite(fourth_led, HIGH);
     digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE    
     delay(1000);               //LO TENGO ATTIVO PER 1 SECONDO
     digitalWrite(enable_signal, LOW);  //LO DISATTIVO
     //RESETTO TUTTI I LED
     digitalWrite(first_led, LOW);
     digitalWrite(second_led, LOW);
     digitalWrite(third_led, LOW);
     digitalWrite(fourth_led, LOW);
   }
 }
 //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
 if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
     sequenza = 0;
     digitalWrite(first_led, LOW);
     digitalWrite(second_led, LOW);
     digitalWrite(third_led, LOW);
 }
}



Ho preso il sorgente da questo sito: http://www.agostinopolizzano.info/home/content/riconoscitore-di-sequenza-microcontrollore
è lo ho successivamente modificato alle mie esigenze.
In questo esempio alla pressione di un pulsante si accende un led, nel caso la sequenza non corrisponde si spengono tutti e riparte il programma.
Nella seconda versione che ho scritto, invece dei led ho usato un display LCD che alla giusta sequenza stampa una stringa.
ecco il codice:


//PSW CON PULSANTI ED LCD 16*2//
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 10;
const int second_button = 9;
const int third_button = 8;
const int fourth_button = 7;
//LED
const int enable_signal = 6;
//LED DI FUNZIONAMENTO
const int on_led = 13;

void setup () {
 pinMode (first_button, INPUT);   //primo pulsante
 pinMode (second_button, INPUT);   //secondo pulsante
 pinMode (third_button, INPUT);   //terzo pulsante
 pinMode (fourth_button, INPUT);   //quarto pulsante
 pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
 pinMode (on_led, OUTPUT); //led di funzionamento
 lcd.begin(16, 2);
}

void loop () {
digitalWrite(on_led, HIGH);

//SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
 if (sequenza == 0) {
   if (digitalRead(second_button) == HIGH) {
     sequenza = 1;
     lcd.print("2");
     delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
   }
 }
 //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
 if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
   if (digitalRead(fourth_button) == HIGH) {
     sequenza = 2;
     lcd.print("4");
     delay(1000);
   }
 }
 //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
 if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
     sequenza = 0;
     lcd.clear();
 }
 //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
 if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
   if (digitalRead(first_button) == HIGH) {
     sequenza = 3;
     lcd.print("1");
     delay(1000);
   }
 }
 //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
 if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
     sequenza = 0;
     lcd.clear();
 }
 //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
 if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
   if (digitalRead(third_button) == HIGH) {
     sequenza = 0;    //RESETTO
     lcd.print("3");
     delay(1250);
     lcd.clear();
     lcd.setCursor(2, 0);
     lcd.print("Psw Corretta");
     digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE    
     delay(4000);               //LO TENGO ATTIVO PER 5 SECONDI
     digitalWrite(enable_signal, LOW);  //LO DISATTIVO
     lcd.clear();
   }
 }
 //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
 if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
     sequenza = 0;
     lcd.clear();
 }
}



Spero di esserti stato di aiuto.
Hertz.

semplice ed efficace...in aggiunta puoi aggiungerci questo http://www.robot-italy.com/it/touch-shield.html
mi è venuto la voglia di farlo pure a me (non so per cosa lo userò ma lo userò :P)

Hertz:
Ciao.
Anche io pochi giorni fa ho sbattuto la testa per cercare di realizzare un progetto simile.
Il codice che ho scritto è questo etc.. etc..

Hertz era proprio quello che cercavo grazie mille.. l'ho già adattato con i miei pulsanti analogici, ora sto escogitando un modo per memorizzare facilemente la password tramite variabile con la possibilità di poterla settare da display.

Se riesci nel impresa fammi sapere, anche io ci stavo provando!

Anche se il codice è molto grezzo fa il suo lavoro.. ho creato un array chiamato

int PASSWORD[4]={1, 1, 1, 1};
int STATO=0;
int ERRORE=0;

Poi ho creato due variabili Errore e Stato perchè mi serviranno a capire se ho digitato il pulsante giusto

while(STATO <1 && ERRORE <1){
    lcd.setCursor(0,0);
    lcd.print("Password");
    if (get_key_pass() == PASSWORD[0])
    {
     STATO=STATO+1;
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[0]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     delay(200);
   }
    }
    while(STATO <2 && ERRORE < 2){
      if (get_key_pass() == PASSWORD[1])
    {
     STATO=STATO+1;
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[1]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     delay(200);
   }
      }
        while(STATO <3 && ERRORE < 3){
      if (get_key_pass() == PASSWORD[2])
    {
     STATO=STATO+1;
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[2]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     delay(200);
   }
      }
    while(STATO <4 && ERRORE < 4){
      if (get_key_pass() == PASSWORD[3])
    {
     STATO=STATO+1;
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[3]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     delay(200);
   }
      }
       while(STATO == 4)
     {
      lcd.setCursor(0,1);
      lcd.print("Accettata!");
      delay(1000);
      STATO=STATO-4;
      menuPrincipale();
      }
       while(ERRORE == 4)
      {     
      lcd.setCursor(0,1);
      lcd.print("Negato!");
      delay(1000);
      ERRORE=ERRORE-4;
      menuPrincipale();
      }

L'unico problema sta solo nel settare la password da Arduino, ho provato a sostituire un valore in questo modo

PASSWORD[1]="nome della variabile contenente il valore"; //[1] Sta per il secondo valore contentuto dentro l'array

Qualcuno saprebbe aiutarmi con gli array?Graziee

Mi pare che il tuo codice abbia un grosso problema di logica.
Non puoi fare il controllo ad ogni tasto premuto, in questo modo un potenziale malvivente te lo trova con pochi tentativi. Tu devi prima far inserire tutta la combinazione e poi solo dopo controllare se la sequenza è giusta. Altrimenti dai informazioni sulla password.

Comunque hai poche combinazioni, non è il massimo della sicurezza.

Il secondo problema che hai non l'ho capito.

Si in effetti non è il massimo, sto facendo tante prove.. in pratica vi spiego, i pulsanti quando non vengono premuti assumono valore "-1", quindi il ciclo "if" rileva subito i pulsante negativo e passa a quello successivo, ho provato ad inserire "isPressed" ma non attende il tocco del pulsante :frowning:

Ma non puoi usare dei normali pulsanti?

Purtroppo no mi servono solo quelli analogici

Immagino ci sarà un inizio procedura acquisizione password, giusto? Da lì, campioni 4 pressioni. Solo dopo la 4a fai il check della password.

Per chi fosse interessato dopo ore e ore seduto davanti sto benedetto codice, ho trovato la mia soluzione, un controllo tramite while e if.
Esamino singolarmente ogni valore del vettore nel mio caso dal primo (0) all'ultimo 4 (3)
Se ogni mia digitazione corrisponde al valore del pulsante (0,1,2,3), il controllo prosegue flaggando una variabile +1 "STATO",una variabile "ERRATO" e una variabile "CORRETTO"
Se alla fine del controllo ho più valori ERRATI, la procedura si ripete reinserendo la password, ovviamente prima svuoto le variabili e le porto a "0".
Se invece ottengo lo stesso valore della lunghezza della mia password cioè 4 nella variabile "CORRETTO" allora mi visualizzerà "Password Corretta" proseguendo con il programma.

Vi posto il codice se a qualcuno potrebbe servire.. vi ricordo che utilizzo solo pulsanti analogici e quindi nessun pulsante digitale.

//INIZIO FUNZIONE PASSWORD ---------------------------------------------------------------------------------------------------------  
 if (CORRETTO < 4){while(BT_1 == get_key_pass() || BT_2 == get_key_pass() || BT_3 == get_key_pass() || BT_4 == get_key_pass()){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Password");
    while(STATO == 0)//Verifica la prima digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[0])
    {
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    } 
    else if (get_key_pass() != PASSWORD[0]) 
    {
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 1) {break;}
  }
  
    while(STATO == 1)//Verifica la seconda digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[1])
    {
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    } 
    else if (get_key_pass() != PASSWORD[1]) 
    {
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 2) {break;}
  }
  while(STATO == 2)//Verifica la terza digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[2])
    {
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    } 
    else if (get_key_pass() != PASSWORD[2]) 
    {
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 3) {break;}
  }
  while(STATO == 3)//Verifica la quarta digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[3])
    {
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    } 
    else if (get_key_pass() != PASSWORD[3]) 
    {
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 4) {break;}
  }
  while(STATO == 4)//Verifica se la password è corretta o sbagliata
    {
     if (CORRETTO == 4)
    {
     lcd.setCursor(0,1);
     lcd.print("Password");
     lcd.setCursor(0,1);
     lcd.print("Corretta");
     delay(500);
     lcd.clear();
     break;
    } 
    else
    {
     lcd.setCursor(0,0);
     lcd.print("Password");
     lcd.setCursor(0,1);
     lcd.print("Sbagliata");
     CORRETTO=0;
     ERRORE=0;
     STATO=0;
     delay(500);  
     lcd.clear();
     break;
    }
  }}}
//FINE FUNZIONE PASSWORD ---------------------------------------------------------------------------------------------------------

Sicuramente il mio codice non è il massimo dal punto di vista logico, ma funziona senza imperfezioni almeno fino ad adesso.

Per l'inserimento di una nuova password, ho utilizzato quasi lo stesso codice solo che per ogni pulsante digitato assegna quel valore all'array di quella posizione specifica quindi

PASSWORD[0]=valore pulsante premuto;
PASSWORD[1]=valore pulsante premuto;
etc etc

Grazie a chi mi ha aiutato nell'impresa :slight_smile:

A me sembra complicato. Inoltre se vari la lunghezza della password sei costretto ad aggiungere un blocco di controllo.

Ti avevo suggerito di leggere prima l'inserimento di tutte le cifre che compongono la password e solo alla fine eseguire il controllo sulla sua validità.

leo72:
A me sembra complicato. Inoltre se vari la lunghezza della password sei costretto ad aggiungere un blocco di controllo.

Ti avevo suggerito di leggere prima l'inserimento di tutte le cifre che compongono la password e solo alla fine eseguire il controllo sulla sua validità.

Purtroppo sono principiante nella programmazione, ma se sai come fare accetto consigli..

La logica te l'avevo già esposta:
quando inizi la lettura della password, fai un ciclo e leggi tante pressioni dei pulsanti quante sono le cifre che compongono la tua password. A fine lettura, e solo allora, confronti la password inserita con quella memorizzata. Se sono uguali, prosegui.

A livello logico lo avevo pensato, ma non riesco.. non so come programmarlo.