Domanda banale sulla gestione di un menù su LCD

Salve a tutti ragazzi, dunque vi espongo un mio dubbio che sta facendo riflettere...devo realizzare un "LCD informativo" che mi indichi i vari stati di sensori ecc, la schermata iniziale sarà soltanto con data, ora, temperatura e cose simili...nessun problema fin qui per gestire l'LCD lo reputo anche fin troppo semplice...è il menù che non mi convince...io ora vorrei poter utilizzare un pulsante per passare da una schermata all'altra... avevo pensato innanzitutto di dichiararmi un contatore di pressioni e quindi scrivere

int buttoncount=0

e poi nel loop scrivere così (evitando switch e case che ancora devo capirli bene :))

if(PinButtonState==HIGH && buttoncount==0){
buttoncount++;
getMenù1();
}
if(PinButtonState==HIGH && buttoncount==1){
buttoncount++;
getMenù2();
}
if(PinButtonState==HIGH && buttoncount==3){
buttoncount=0;
getMenù3();
}

fin qui è anche relativamente facile ma adesso vorrei che il programma nel caso in cui io andassi sull'altra schermata e non eseguissi nessuna operazione entro 5 secondi, mi ritorni a quella di default in automatico, ho provato ad utilizzare la funzione delay, ma blocca il programma e nel caso uno dei sensori variasse la lettura o un attuatore attivasse o disattivasse un carico l'LCD non me lo visualizzarebbe....come fare per fare eseguire in continuo i getMenu() per un tot di secondi?

Se vuoi evitare gli switch, allora riorganizza i tuoi if perché ripeti troppe operazioni. Basta controllare se il pulsante è premuto e poi incrementare la variabile. Solo dopo farai i controlli.

if (PinButtonState==HIGH) {
  if (buttoncount < 2) {
    buttoncount++;
  } else {
    buttoncount = 0;
  }
} 
if (buttoncount==0){
  getMenu1();
}
if (buttoncount==1){
  getMenu2();
}
if (buttoncount==2){
  getMenu3();
}

Per il secondo problema, devi racchiudere il blocco di codice della funzione a tempo all’interno di un while con l’uscita su un controllo fatto con millis. Esempio:

void getMenu1() {
  unsigned long timer = millis(); 
  do {
      -.....il tuo codice.....
  while (millis() - timer < 5000);
}

Nel momento in cui sono trascorsi 5000 ms, il while diventa falso ed esce.

Ok, perfetto..grazie 1000 anche per le correzioni riguardo gli if...stasera monto tutto su breadboard e provo a vedere...intanto grazie ancora di tutto. Un saluto

Se ti serve una gestione più completa potresti pensare di usare la libreria dell'utente Brunalti: MenWiz --> https://github.com/brunialti/MENWIZ Topic --> http://arduino.cc/forum/index.php?topic=99693.0

Ricordati il debounce del pulsante, altrimenti avrai una scarica di letture ad ogni pressione :wink:

Metti un qualcosa tipo questo:

if (digitalRead(pulsante) == HIGH) {
  delay(30);
  if (digitalRead(pulsante) == HIGH) {
    if (buttoncount < 2) {
      buttoncount++;
    } else {
      buttoncount = 0;
    }
  }
}

Grazie 1000 a tutti…Leo, l’antirimbalzo solitamente lo implemento sempre…l’ho tralasciato solo per far capire che percorso stavo seguendo, grazie comunque :slight_smile: un saluto :wink: