lettura switch a membrana problematico

Buon pomeriggio a tutti, vi spiego la problematica. Sto cercando di inserire un valore numerico tramite un switch a membrana per stamparlo a video e una volta premuto il tasto conferma (in questo caso D) memorizzarlo in una variabile globale. Sfortunatamente succede questo, se premo il tasto D viene rilevato ed esce dal while, nel caso invece di qualsiasi altro "tasto" la funzione getKey non preleva nulla. Secondo voi perché?

void settingsMenu(){
  String t="";
  while(customKeypad.getKey()!='D'){
    char key=customKeypad.getKey();
    Serial.println(key);
    if(isNumber(key)){
      t+=key;
    }
    
    lcdWrite("MIN temperature",t);
    delay(250);
  }
  tempMIN=t.toInt();
}
bool isNumber(char key){
  bool result= false;
  if(key=='0'||key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'){
    result=true;
    Serial.println("ok");
  }
  return result;
}

Ciao! Secondo me richiamare due volte la funzione getkey(), una nella condizione del while() e una nel corpo, potrebbe dare comportamenti non previsti.

Io farei un unica lettura

Modifica codice

void settingsMenu(){
  String t="";
  char key;
  while(key=customKeypad.getKey()!='D'){
    if(key != NO_KEY){
        Serial.println(key);
        if(isNumber(key)){
            t+=key;
        }
    
        lcdWrite("MIN temperature",t);
        delay(250);
     }//END IF
  }//END WHILE
  tempMIN=t.toInt();
}

ci ho provato ma in questo modo si presenta lo stesso problema solo che mi viene stampato il seguente:

16:03:15.731 -> 
16:03:16.031 -> 
16:03:16.302 -> 
16:03:16.572 -> 
16:03:16.840 -> 
16:03:17.145 -> 
16:03:17.421 -> 
16:03:17.692 -> 
16:03:17.962 -> 
16:03:18.232 -> 
16:03:18.531 ->

edit: copiandolo su Notepad++ sembra che il carattere restituito sia "Start of Header" il quale ignora l'espressione key!=NO_KEY

Posto la mia soluzione, essenzialmente ho usato una variabile bool per definire il ciclo di vita del while ed ho acquisito utilizzando la funzione waitForKey(). In questo modo una volta all’interno del while, il software attende la pressione di un tasto per poter andare avanti con l’esecuzione. Ringrazio torn24 per averci provato :-*

void settingsMenu()
{
  String t = "";
  bool flag = true; <----- FLAG
  lcdWrite("MIN temperature", String(tempMIN,DEC));
  while (flag == true){
    char key = customKeypad.waitForKey(); <------- ACQUISIZIONE

    if (isNumber(key)){
      t += key;
    }else if(key=='D'){
      flag=false;
    }
    lcdWrite("MIN temperature", t);
    delay(250);
  }
tempMIN = t.toInt();
}

bool isNumber(char key){
  bool result = false;
  if (key == '0' || key == '1' || key == '2' || key == '3' || key == '4' || key == '5' || key == '6' || key == '7' || key == '8' || key == '9'){
    result = true;
    Serial.println("ok");
  }
  return result;
}

Hai usato la funzione char key = customKeypad.waitForKey(); <------- ACQUISIZIONE, questo metodo ha un comportamento diverso, attende che si prema un tasto, è un metodo bloccante.
Di conseguenza è inutile un while() che ripete la lettura, perché il metodo stesso attende che venga premuto un tasto.

Domanda il codice che ti ho postato stampava su seriale i caratteri premuti?? Perché getkey() se non si preme un tasto dovrebbe leggere la costante NO_KEY.

torn24:
Hai usato la funzione char key = customKeypad.waitForKey(); <------- ACQUISIZIONE, questo metodo ha un comportamento diverso, attende che si prema un tasto, è un metodo bloccante.
Di conseguenza è inutile un while() che ripete la lettura, perché il metodo stesso attende che venga premuto un tasto.

il while mi serve per fare in modo che l’utente possa inserire il valore numerico di quante cifre desidera e confermare con la pressione del pulsante ‘D’.

torn24:
Domanda il codice che ti ho postato stampava su seriale i caratteri premuti?? Perché getkey() se non si preme un tasto dovrebbe leggere la costante NO_KEY.

stranamente l’espressione (key != NO_KEY) restituiva true anche in assenza di caratteri premuti, inoltre alla pressione del tasto comunque il valore relativo non veniva stampato