controllo password keypad e lcd

salve a tutti, ho appena iniziato a scrivacchiare qualche sketch con arduino e avrei bisogno del vostro aiuto per risolvere un problemino e capire meglio come funziona questo splendido oggetto. premetto che ho cercato varie volte su google una soluzione e che ho cercato di risolvere da solo ma proprio non mi viene in mente nulla. uso arduino mega 2560 su windows 7 con ide versione 1.0.5 .

vi illustro il mio problema, sto cercando di scrivere un programmino che attraverso LCD e tastierino numerico chieda la password, ne controlli la correttezza e, se corretta stampa la parola "menu" e attende l'inserimento di un numero corrispondente ad una funzionalità del menu (per ora attiva solo quella del sensore di fiamma), mentre se errata stampa "password errata" e richiede la password. il mio problema è che una volta inserita la password corretta il programma richiama la funzione "menu" ma rilegge ogni nuovo carattere come se fosse l'immissione della password e quindi al 5 carattere chiede di inserire nuovamente la password.
allego il codice, se qualcosa non è chiaro vi prego di chiedere, grazie mille!

/* @name file Keypadlcd
|| @version 1.0.0
|| @original author Borgonovo Niccolò
|| @date 31 july 2013
||
|| @description
|| | Use of the matrix Keypad library in "checking password" and lcd print
|| | Used for checking password and print information on Rover station.
|| 
|| @circuit
|| | like lcd and keypad circuit
|| #
*/

// include the library code:
#include <LiquidCrystal.h>
#include <Keypad.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(40, 42, 41, 43, 44, 45);

//Variable

int fire;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','a'},
  {'4','5','6','b'},
  {'7','8','9','c'},
  {'*','0','#','d'}
};
byte rowPins[ROWS] = {25, 24, 23, 22}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {31, 30, 29, 28}; //connect to the column pinouts of the keypad
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
 
char password[5] = "b030";//password 
char tempPassword[5];
int tempPasswordIndex = 0;


//set up

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("Inserire Password");
  lcd.setCursor(0, 1);
  lcd.print("poi premere un tasto");
  lcd.setCursor(0, 2);
  lcd.print("per confermare");
  lcd.setCursor(0, 3);
  


}



void loop(){
 
   
  char key = keypad.getKey();
  
  if (key){
    tempPassword[tempPasswordIndex] = key; //reading password
    tempPasswordIndex++;
    lcd.print("*");
    if(tempPasswordIndex>4) //4 char for password
    {
      tempPasswordIndex = 0;
      if(checkPassword()) //if true...
      {
        lcd.clear();
        lcd.print("Password corretta");
        delay(1000);
        lcd.clear();
        lcd.print("Benvenuto Borgo !");
        delay(2000);        
        lcd.clear();
        lcd.print("Menu"); 
        menu();  // call "menu"
      }
      else  //if false...
      {
        lcd.clear();
        lcd.print("Password errata");
        delay(500);
        lcd.setCursor(0, 1);
        lcd.print("Inserire nuovamente");
        lcd.setCursor(0, 2);
        lcd.print("la Password");
      }
    }
  }
  delay(100);

  
}

 

 
 
boolean checkPassword() // checking password
{
  if(strncmp(password, tempPassword, 4) == 0)
  {
    return true;
  }
  else {   
  return false;
  }
}




void menu() // <-------------------------- NOT WORK
{
 
  
  char esci;
  

     
  char sceltamenu = keypad.getKey();
      
   lcd.print(" funzione menu");   
        
        //scelta menu
  switch (sceltamenu)  //<<------------- NOT WORK <------ stampa funzione menu, dopodichè rilegge ogni nuovo carattere come se fosse l'immissione della password
  {  
   
    
  case '0':  
   lcd.print("Non Disponibile"); 
  break;   
   
  case '1':  // flame sensor
        do{
          esci = keypad.getKey();
          lcd.print("Premere 1 per menu");
          fire=analogRead(5); // Signal wire(green one) connect to analog pin 5. Red one connect to VCC and black one connect to GND.
          if(fire<700){
            lcd.print("Fire");      
           }
          else{
            lcd.print("No Fire");      
          }      
          delay(1000);    // aspetta un secondo
        }while(esci=!1);              
    break;    
     
  case '2':  
    lcd.print("Non Disponibile"); 
    break;  
    
  case '3':  
    lcd.print("Non Disponibile");            
    break;  
  
  case '4':  
    lcd.print("Non Disponibile");            
    break;  
    
  case '5':  
    lcd.print("Non Disponibile");            
    break;  
  
  case '6':  
    lcd.print("Non Disponibile");            
    break;     
 
 case '7':  
    lcd.print("Non Disponibile");            
    break;  
    
 case '8':  
    lcd.print("Non Disponibile");            
    break;  
 
 case '9':  
    lcd.print("Non Disponibile");            
    break;  
 
 case 'a':  
    lcd.print("Non Disponibile");            
    break;  
 
 case 'b':  
    lcd.print("Non Disponibile");            
    break;  
 
 case 'c':  
    lcd.print("Non Disponibile");            
    break;  
 
 case 'd':  
    lcd.print("Non Disponibile");            
    break;  
 
 case '*':  
    lcd.print("Non Disponibile");            
    break;     
  } 
  
  
}

edit by mod: per favore includi il codice usando gli appositi tag

Il tuo errore è che non separi la lettura del codice dal resto.
Parti con lo sketch che è fuori dal menu ed in attesa della password.
Nel momento in cui premi un tasto, devi metterti a leggere tanti caratteri quanti compongono la password attuale. Poi fai un confronto e, se la password inserita è uguale a quella memorizzata, entri in un'altra porzione di codice che gestisce il menu.

grazie per la risposta e grazie per la correzione del post, non sapevo dove scrivere il codice. non ho ben capito cosa intendi con "non separi la lettura del codice dal resto"

Nel loop tu controlli continuamente se c'è un tasto premuto. Se lo trova, lo aggiungi a quelli letti. Quando hai letto tanti caratteri quanti sono quelli della password, provvedi a fare il controllo. Sia che poi la password sia corretta sia che non lo sia, continui con il loop a leggere caratteri e a memorizzarli per controntarli con la password.

Devi crearti un loop più snello che legga solo se è stato premuto un tasto.
Nel caso sia stato premuto un tasto, avvii una nuova routine (o un nuovo blocco di codice) in cui leggi tutti i caratteri della password e fai il confronto. Se è corretta, lanci una nuova routine (o un nuovo blocco di codice) in cui gestisci il menu.

quindi tu mi stai dicendo di tirar fuori la lettura della password dalla funzione loop giusto? ho provato a farlo ma non saprei dove metterla, in un altra funzione che chiamo "lettura" per esempio? o nel setup? in entrambi i casi non ha funzionato...

Ti avevo descritto tutto per benino nel post precedente :wink:

Comunque ti consiglio di cercare un esempio su internet con qualcosa tipo "password keypad arduino" e dare un'occhiata ad un pò di esempi (ne trovi una marea) per farti un'idea di come operare.

se ti può interessare, io ho fatto questo scketch per controllare l'apertura e la chiusura di una servo inserendo una password.