Cassaforte con Keypad, problema metodo .keyStateChanged()

Salve a tutti, brevemente spiego il problema :
Ho un keypad 4x3 con il quale dovrei fare un controllo per cassaforte, con output video su monitor seriale.
Il codice permetterebbe all'utente inoltre di cambiare la password e confermarla tenendo premuto per 3 secondi il tasto * , ma è proprio su questo che trovo problemi, infatti nonostante il codice mi sembri concettualmente corretto, non risponde come dovrebbe, ignorando il cambio di stato del pulsante da PRESSED -> HOLD.

Posto il codice :

#include <Keypad.h>

const byte COLS = 3;
const byte ROWS = 4;

char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[4] = {8,7,6,5};  //connect to the row pinouts of the keypad
byte colPins[3] = {4,3,2};  //connect to the col pinouts of the keypad

// Creo un oggetto di tipo Keypad , dove specifico : mappa_tasti, pin_righe, pin_colonne, Num_righe, Num_colonne

Keypad pad = Keypad( makeKeymap(keys), rowPins,colPins,ROWS,COLS);  

// Variabili globali
String password = "0000";
String pssw = String(); 
 


// Struttura

void setup(){
 pad.setHoldTime(2000);    // Dopo 2 secondi il tastopassa da PRESSED a HOLD
 pad.setDebounceTime(50);
 Serial.begin(9600);
 delay(1000);
 Serial.println(F("ready"));
}


void loop(){
  char car;
  serialClear();
  Serial.println("Salve, che vuoi fare?");
  Serial.println("1 - Apri");
  Serial.println("2 - Cambia Password");
  Serial.println("");
  
  switch (pad.waitForKey()) {
     case '1' : Serial.print("Inserisci la Password (# = annulla) : ");
                
                pssw = String();              // Pulisco il buffer
                while(pssw.length()!=4 && car!='#') {     // Testo la lughezza della password immessa
                  car = pad.waitForKey();     // wait bloccante in attesa del tasto
                  pssw = pssw + car;
                  Serial.print(car);
                }
                Serial.println();
                Serial.println();
                if(car!='#') {
                    if (password.equals(pssw)){
                        Serial.println("Ok, cassaforte aperta");
                    }else
                        Serial.println("Ops, password errata...");
                }else{
                    Serial.println("Operazione annullata..");
                }  
                break;
    
     case '2' : Serial.println("Inserisci la nuova password (# = annulla) : ");
                pssw = String();
                while(pssw.length()!=4 && car!='#') {     // Testo la lughezza della password immessa
                  car = pad.waitForKey();     // wait bloccante in attesa del tasto
                  pssw = pssw + car;
                  Serial.print('*');
                }
                Serial.print("Ok, la password inserita è : ");
                Serial.println(pssw);
                Serial.println("Se e' corretta tieni premuto per 3 secondi il tasto '*' (asterisco), altrimenti '#' (annulla)");
               
                // TESTARE SE IL TASTO * E' STATO PREMUTO...E VERIFICARE QUANDO VA' IN "HOLD"
                
                if(pad.waitForKey()=='*')
                {
                  while(!pad.keyStateChanged() ){
                    Serial.println("-");
                  }
                  if(pad.getState()==HOLD)
                    Serial.print("HOLD");
                }
                /*
                if(pad.getState()==HOLD){
                    Serial.println("Password modificata con successo");
                    password = pssw;
                }else{
                    Serial.println("Password non modificata...riprovare");
                }
                }
                else
                  Serial.println("Annullata....");
                  */
                break;
    }
  
}



void serialClear(){
  
  for (char i=0; i<10; i++){
    Serial.println();
  }
}

Tempo fa ho usato anch'io quella lib ma ora non rammento con esattezza tutte le sue funzioni, ma io farei semplicemente così:

if(pad.waitForKey()=='*') {
  tempo = millis();
  premuto = false;
  while(pad.WaitForKey()=='*') {
    if (millis() - tempo > 3000) {
      premuto = true;
      break;
    }
  }
  if (premuto) {
     ....
  }
}

premuto è vero solo e soltanto se tnieni pigiato il pulsante per 3 secondi, se lo rilasci prima del tempo, premuto risulta false.

Si, esatto, avevo già realizzato quella soluzione...ma sapendo del metodo keystatechanged() volevo usare quello....
Grazie mille!! :smiley:

Boh, ripeto non ricordo bene la lib (l'ho usata quasi un anno fa). Sicuramente per fare la stessa cosa ci sono tanti modi, non è che il mio sia meglio. E' il primo a cui ho pensato.

Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0