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();
}
}