tenere premuto un pulsante

Ciao a tutti,
ho bisogno di una mano a scrivere una parte del mio codice.
vi spiego brevemente quello che voglio fare: ho tutto il mio progetto di un termostato, in una LCD visualizzo la temperatura letta, vorrei che tramite un pulsante quando lo tengo premuto venga cambiato ciò che visualizzo e appena lo rilascio ritorna a visualizzare la temperatura.
per il momento l'ho sistemato in questo modo:

while (digitalRead(Pmenu) == HIGH) {
    if (prevState == 0) {
      lcd.clear();
      lcd.home();
      lcd.print("Set Temp");
    }
    lcd.setCursor(3, 1);
    lcd.print(globalTemperature);
    lcd.print(grado);
    lcd.print("C");
    prevState = 1;
  }

e prima nel corso del loop prima di scrivere la temperatura ho inserito:

    prevState = 0;
    lcd.clear();
    lcd.setCursor(1, 0); ...ecc...

però facendo in questo modo se lo tengo premuto un lungo ho dei problemi di riavvio della scheda.
qualcuno ha idea come possa sistemare le linee di codice sopra riportate?

Evita il while e più in generale qualsiasi implementazione "bloccante"-

Potresti usare una semplice variabile indicativa dello stato attuale in funzione del quale visualizza menu A, menu B o quanti ne vuoi tu.

quindi dici di fare un grande if nel loop, se è premuto mi visualizza un menù se non lo è mi visualizza la temperatura?

Secondo me dovresti inserire un ritardo nel l'aggiornamento dell' LCD. Così com'è ora stai inondando l'lcd. Anzi ho notato ora che non stai facendo nessuna lettura quindi potresti stampare una sola volta.

Cerca ed usa la libreria Onebutton.

@enrico03 ci sono moltissimi modi per fare quel che chiedi.

A titolo di esempio avevo un progetto tinkercad molto simile alla tua esigenza e l'ho modificato secondo le tue specifiche.

Il principio di funzionamento è quello di evitare del tutto algoritmi bloccanti (come il while) e chiamare le funzioni che aggiornano il display solo quando realmente necessario per evitare il fastidioso blink dell'LCD dovuto all'istruzione clear().

Dal vecchio progetto ho lasciato l'array di puntatori a funzione e commentato il pezzo di codice che incrementava l'indice dell'array alla pressione del pulsante.

Se preferisci ovviamente puoi chiamare direttamente le funzioni senza usare l'array (screensactualScreen; -> diventa screen1(); oppure screen2(); ), ma ovviamente avrai bisogno di un if oppure di uno switch/case per valutare il valore di actualScreen e agire di conseguenza.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.