Nextion display la comunicazione si blocca

Buonasera a tutti.
Ho un problema randomico con un nextion display collegato ad arduino Mega.
Ho un menù con varie pagine, tutte vanno bene tranne una. La pagina dove viene mostrata data, ora e temperatura.
Ho collegato un modulo RTC per sapere l'orario, il modulo è il DS3231 che prevede anche un sensore di temperatura.

void loop(void)
{
  if (ActualPage == 6)
  {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval)
    {
      // save the last time you updated the temperature
      previousMillis = currentMillis;
      updateTemperature();
      updateTime();
    }
  }
  nexLoop(nex_Listen_List);
}

Come vedete nel loop c'è poco e niente. La pagina 6 è quella relativa al time e alla temperatura. Ho deciso di aggiornare i valori ogni 10 secondi.
le variabili per il timer non bloccante le ho inizializate così:

unsigned long previousMillis = 0;       
// Interval used to update the temperature and time
const long interval = 10000;

Le due routine che fanno l'aggiornamento dei dati sono le seguenti:

void updateTime()
{
  //Update Time
  t61.setText(rtc.getTimeStr(FORMAT_SHORT));
  // Update Date
  t62.setText(rtc.getDateStr());
  //Update Day-of-Week
  t63.setText(rtc.getDOWStr());
}

void updateTemperature()
{
  float tempNumber = 0;
  char tempDisplayed[5] = {0};
  
  tempNumber =  rtc.getTemp();  
  //convert a float to a char array dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);
  dtostrf(tempNumber, 4, 1, tempDisplayed);
  t64.setText(tempDisplayed);
}

Se navigo tra le pagine tutto funziona. Vado nella pagina del time vedo tutto correttamente, i valori cambiano la comunicazione c'è. Ma randomicamente dopo qualche ora se resto in questa pagina tutto si blocca. Il display è frizzato e il tasto per uscire non risponde.
Spengo e riaccendo e tutto torna a funzionare.

L'unico dubbio è sul timer non bloccante che si attiva ogni 10 secondi... è possibile che in una determinata situazione si impalli saturando la seriale? c'è qualcosa che non ho scritto correttamente?
Quando si impalla, l'ora resta frizzata nel momento del blocco.
Ul altra cosa che non mi spiego è questa. quando entro nella pagina 6 visualizzo per un attimo un orario e una temperatura diversa dall'attuale. sempre la stessa. poi i dati si aggiornano con quelli correnti.
questi valori da dove vengono? Le variabili non dovrebbero mantenere l'ultimo valore acquisito?
Se avete idee perché io non so proprio cosa pensare :confused:
grazie a tutti!

Dai pezzi di codice che hai postato non sembrano esserci particolari problemi che mi saltano all’occhio, quello che mi viene da suggerire è di mettere dei messaggi di debug sul monitor seriale, usando una mega il display dovrebbe essere collegato alla seriale 1, in modo da capire se il blocco è del display o di Arduino. Se il blocco è del display ogni 10 secondi sul monitor seriale continuerai a vedere passare gli aggiornamenti, altrimenti anche quelli si bloccheranno.
Per quanto riguarda l’aggiornamento dei dati sul display al cambio pagina se i vari campi che ospitano i valori sono globali per il display e quello che vedi all’accesso della pagina è il valore che hai scritto nel suo IDE è un problema di refresh suo e difficilmente potrai porvi rimedio, come workaround potresti indicare delle stringhe vuote nell’IDE Nextion nei vari campi così quando accedi alla pagina non vedi nulla e poi arrivano i valori. Se invece i vari campi non sono globali penso che non si aggiorni il valore finché non sei nella pagina e Arduino invia i valori

Non con9oscendo la libreria che usi potrebbe dipendere dai metodi che usi per farti restituire la data ecc. che se creano un oggetto della classe String potrebbero causare il problema. Mi è venuta in mente una piccola ottimizzazione, che magari non risolve il problema ma comunque essendo un ottimizzazione male non fa. Lavorando con i display è sempre bene aggiornare i dati solo quanto strettamente necessario quindi visto che la data e il giorno della settimana non varia ogni 10 secondi e forse anche la temperatura ti propongo di inserire delle variabili che permettano di decidere se inviare l'aggiornamento oppure no, ne serve una per dato con il tipo di dato coerente poi prima di inviare fai un controlle del tip:

dataCorrente = rtc.getDateStr();
if(dataInviata!=dataCorrente)
{
t62.setText(dataCorrente);
}

Se controlli la libreria che usi per l'RTC e vedi che quei metodi restituiscono una String allora molto probabile che sia loro la colpa dei blocchi dopo un certo periodo di attività, se è così cerca dei metodi nella libreria che restituiscono i dati che ti servono in un formato differente e pensa tu da codice a metterli assieme, ti faccio un esempio inventato per chiarire meglio:

String dataCorrente = rtc.getDateStr(); //Solito problema della classe String che cercando sul forum viene spiegato molte volte, da rimuovere
byte giornoCorrente = rtc.getDate();
byte meseCorrente = rtc.getMonth()+1;
int annoCorrente = rtc.getYear();
char dataDaInviare[11];
char bufferTmp[5];
itoa(giornoCorrente , bufferTmp, 10);
strncpy(dataDaInviare, bufferTmp, 2);
strncat(dataDaInviare, '/', 1);
itoa(meseCorrente , bufferTmp, 10);
strncat(dataDaInviare, bufferTmp, 2);
strncat(dataDaInviare, '/', 1);
itoa(annoCorrente , bufferTmp, 10);
strncat(dataDaInviare, bufferTmp, 4);
t62.setText(dataDaInviare);

Il codice è inventato di sana pianta quindi sarà da verificare, ecc. ma è per chiarire il concetto

Grazie per la risposta.
Ho verificato che i blocchi capitano in maniera del tutto casuale. dopo 5 ore o magari appena entro nella pagina incriminata. comunque sempre e solo in quella pagina quindi immagino che il problema sia legato al modulo RTC.
Ho anche verificato che resettando solo il display il problema rimane. nel senso che il software sul display funziona ma la comunicazione con Arduino è impallata.
avevo letto del problema delle stringhe da qualche parte... provo a cercare meglio e faccio alcune prove. se risolvo vi scrivo quello che ho fatto. altrimenti torno a stressarvi di nuovo :slight_smile:
Grazie per il momento.

robotronico:
avevo letto del problema delle stringhe da qualche parte... provo a cercare meglio ...

Basta che leggi il thread in testa alla sezione Software ... QUESTO !

Guglielmo