problema con Switch Case

C'è anche la lettura del DHT22 che potrebbe rallentare/sfalsare i tempi. La lettura porta via almeno mezzo secondo, e credo sia effettuata in bitbang bloccando gli interrupt (chiedo conferma).

Se ad ogni ciclo di loop perdiamo mezzo secondo... tutti i millis del programma perdono di significato, oltre al fatto che già di suo millis su tempi così lunghi ha un errore rilevante se il clock non è quarzato.

Poi per tempi periodici la variabile tempo non andrebbe impostata al millis attuale (che potrebbe causare l'accumulo di un errore casuale ad ogni ciclo), ma incrementata della durata prevista (in modo che il riconoscimento avvenga sempre attorno al momento di timeout ideale).

Ora come ora per tempi lunghi (max 24 ore) userei un RTC anche non regolato usandolo come millis, in questo modo si ha sempre il tempo trascorso corretto con risoluzione di un secondo.

ahh , quanto sono principiante :cry:

Eccomi. Sono rientrato prima dal lavoro ed ho provato a togliere lcd e mettere i serial print . A livello logico il programma funziona e non salta i passaggi , quindi deduco che sia colpa del display. Essendo un coccio , e senza dover riscrivere tutto lo sketch , cosa devo mettere/modificare per poter leggere i vari dati su lcd ? Mi avete gia indirizzato ma , ripeto essendo un coccio mi ci vuole descritto tutto bene, qualcuno ha voglia/tempo da dedicarmi? Gia vi ringrazio.

Allora io comincerei nel mettere tutto ciò che aggiorna l'lcd (Posizione cursore, clear, scritture vere e proprie, ecc.) in una bella funzione, all'inizio per farla semplice puoi gestire valori e valori precedenti con variabili globali in modo da controllare che ci sia davvero qualcosa da aggiornare, poi in seguito potrai strutturare meglio il tutto.
Nel dettaglio io farei una cosa del tipo:

if(oldvalore1!=valore1 || oldvalore2!=valore2 || ...){
  ..aggiornamenti vari dell lcd...
  oldvalore1=valore1;
  oldvalore2=valore2;
  ...
}

So che può sembrare noioso ma visto che posizionando il cursore puoi aggiornare i soli dati necessari io all'interno dell'area di aggiornamento metterei un if per ciascun valore e tramite setPos ecc aggiornerei le sole aree necessarie
Poi nei vari punti dove leggi, assegni i vari valori aggiungerai la chiamata alla funzione di aggiornamento dell'lcd
Nel loop principale con una bella variabile che verifica con millis() come hai già fatto per altre funzionalità verifichi se sono passanti N secondi dall'ultimo aggiornamento (Es. 30 secondi), nel caso siano trascorsi richiami la solita funzione di aggiornamento dell'lcd, potrebbe servire per aggiornare data e ora se visualizzati.
A questo punto se non esageri con gli aggiornamenti (Es. se la temperatura la leggerei a intervalli con millis e mai ad ogni ciclo di loop ad esempio) non dovresti avere intoppi
[edit]
Resta il consiglio di dotarti di RTC, altrimenti ci sono ottime possibilità che le tue lievitazioni... passeranno di lievitazione o termineranno la lievitazione al fresco se nel progetto prevederei ad esempio il riscaldatore
[/edit]

Ho appena dato un occhiata tramite cell. Mi sa tanto che hai trovato un discepolo. Il modulo RTC ce l ho a casa. Devo vedere che tipo. Se aggiungo il modulo come verrebbe modificato lo sketch? La cella che ho gia pronta è realizzata sfruttando un congelatore verticale ,quindi il suo compressore per abbattere la temperatura, un sistema riscaldante a bassa tensione , una serie di ventole per estrazione aria se troppo umido e leggero ricircolo, un umidificatore ad ultrasuoni, illuminazione a led , il tutto con una capacità di 50 panielli. Devo assolutamente far funzionare questo programma, ho gente a cena prossimamente

Un passo alla volta, prima fai funzionare il programma e l'lcd quando dei a posto con le due componenti integra l'RTC.
Di fatto al posto di usare millis() per i tempi lunghi all'avvio del task leggi data e ora dall'rtc e li memorizzi in variabili, poi con la millis() verifichi ogni n secondi, ad esempio 30 così sfrutti il solito intervallo dell'eventuale aggornamento lcd, leggendo l'rtc se è trascorso il tempo necessario, 1 secondo, 4 o 24 ore poco importa il concetto è il solito di confrontare il valore precedente di millis con quello attuale.
Questo in linea generale, se il tuo rtc è un modello che prevede di impostare un allarme ad una data ora o dato un intervallo di tempo puoi anche demandare all'rtc di chiamare il micro con un interrupt evitando i controlli ma è una cosa complessa che difficilmente si riesce ad implementare in breve tempo, l'ho detto solo per dovere di cronaca :slight_smile:
Hai una bella cella, io non riesco a trovare il tempo di finire la mia molto piccola senza sistema raffreddante. Per il momento mantiene solo la temperatura e manco ho montato l'lcd ma come hai visto dalle mie rispose mi sono imbattuto nei medesimi problemi, programma impazzito ore di debug e il colpevole era il troppo refresh dell'lcd.
Avevo previsto cnh'io ventola di ricircolo e umidificatore ultrasuoni, in più avevo previsto due modalità, la prima in base al tempo e la seconda tramite rilevazione della lievitazione tramite sensore sharp (Molto utile ad esempio per i panettoni!) e avvisi tramite ethernet shield... ma è tutto nel cassetto

Goduria per i miei occhi leggere i tuoi post. Per il momento mi serve per i panetti di pizza e pane. Forse piu in la panettoni e altri lievitati. ..se conosci la confraternita della pizza li trovi foto del mio forno e un post con una cella pilota.

Su la confraternitadellapizza con il tasto cerca Biker72 , verrà fuori il post. Ciao

fabpolli:
Allora io comincerei nel mettere tutto ciò che aggiorna l'lcd (Posizione cursore, clear, scritture vere e proprie, ecc.) in una bella funzione, all'inizio per farla semplice puoi gestire valori e valori precedenti con variabili globali in modo da controllare che ci sia davvero qualcosa da aggiornare, poi in seguito potrai strutturare meglio il tutto.
Nel dettaglio io farei una cosa del tipo:

if(oldvalore1!=valore1 || oldvalore2!=valore2 || ...){

..aggiornamenti vari dell lcd...
  oldvalore1=valore1;
  oldvalore2=valore2;
  ...
}



So che può sembrare noioso ma visto che posizionando il cursore puoi aggiornare i soli dati necessari io all'interno dell'area di aggiornamento metterei un if per ciascun valore e tramite setPos ecc aggiornerei le sole aree necessarie
Poi nei vari punti dove leggi, assegni i vari valori aggiungerai la chiamata alla funzione di aggiornamento dell'lcd
Nel loop principale con una bella variabile che verifica con millis() come hai già fatto per altre funzionalità verifichi se sono passanti N secondi dall'ultimo aggiornamento (Es. 30 secondi), nel caso siano trascorsi richiami la solita funzione di aggiornamento dell'lcd, potrebbe servire per aggiornare data e ora se visualizzati.
A questo punto se non esageri con gli aggiornamenti (Es. se la temperatura la leggerei a intervalli con millis e mai ad ogni ciclo di loop ad esempio) non dovresti avere intoppi
[edit]
Resta il consiglio di dotarti di RTC, altrimenti ci sono ottime possibilità che le tue lievitazioni... passeranno di lievitazione o termineranno la lievitazione al fresco se nel progetto prevederei ad esempio il riscaldatore
[/edit]

Scusami, non ho capito , mi fai vedere dove e cosa mettere per iniziare?