ho realizzato questo sketch prendendo spunto da un progetto che utilizza il framework Souliss e che utilizza la classe String, perfettamente funzionante.
Anche il mio funziona tutto regolarmente, con l'eccezione di alcuni blocchi del display in maniera random, la funzione touch non risponde per poi riprendere dopo alcuni secondi, ed ogni tanto, specie se e' acceso dopo diverse ore, non riceve il messaggio MQTT al primo tentativo.
Ho provato a cambiare tutto l'hardware ( display Nextion 3.2" e nodeMCU V3) ...ho cambiato il core dal compilatore (uso la versione 2.5.2), ho provato a commentare alcuni blocchi del codice, ad esempio quasi tutto quello dentro la funzione callback (ad eccezione del setpoint per testare l'input dal display) ho anche ricaricato gli sketch iniziali senza la logica MQTT, senza OTA .....ma nulla.
A intuito sembra un problema di comunicazione seriale, ho provato anche a cambiare il baudrate, ma non ci sono riuscito.
Vi sono grato per ogni aiuto
Davide
L'unica cosa che vedo ne programma che hai postato che possa causare blocchi rando per saturazione di memoria è la solita classe String che viene allocata dinamicamente ad ogni callback. Visto che sembra che tu la usi solo per controllare se è uguale ad alcune stringhe fisse ti suggerirei di rimuovere la String (intesa come classe) e fare dirattemente una strncmp per verificare se payload è uguale a ON, abbastanza indolore e veloce da verificare se fosse quello a causare i blocchi "random"
fabpolli:
L'unica cosa che vedo ne programma che hai postato che possa causare blocchi rando per saturazione di memoria è la solita classe String che viene allocata dinamicamente ad ogni callback. Visto che sembra che tu la usi solo per controllare se è uguale ad alcune stringhe fisse ti suggerirei di rimuovere la String (intesa come classe) e fare dirattemente una strncmp per verificare se payload è uguale a ON, abbastanza indolore e veloce da verificare se fosse quello a causare i blocchi "random"
ho cambiato:
if (topicString == "openhab/dst2/confort/command") {
con:
if(strcmp(topic,"openhab/dst2/confort/command")==0) {
e cosi' anche per tutte le altre all'interno della funzione callback. I comandi dal touch funzionano tutti, ma il problema si ripropone.
Intendevi cosi'?
Si intendevo quello, unitamente a rimuovere completamente in ogni dove l'uso di String. Se hai fatto anche questo allora, come peraltro supposto dalla tua affermazione che non arrivando messaggi quella parte di codice non poteva essere quella incriminata, il problema è altrove. Cosa fa questo progetto? Quando si blocca una specifica funzione era stata utilizzata in precedenza? E' ancora sul banco di lavoro o è installato?
Metti più dettagli che puoi così magari salta fuori la magagna (Es. usi un relé per aprire un cancelletto pedonale e la cablatura è molto vicina, ecc.)
Metti anche il codice completo attuale se vuoi che venga controllato.
La classe string l'ho rimossa solo all'interno della funzione callback, avevo capito cosi'.
Questo progetto e' un termostato, con tre modalità di input:
vocale (da GHome), MQTT (da openHab) e touch dal maledetto display
Il blocco avviene dopo un po che non viene utilizzato attraverso la modalità' touch, finché' si preme funziona. Non c'e' un tempo preciso ne una funzione particolare, tutto avviene in maniera random, si blocca anche solo accendendolo e non toccando nulla per un po. Oppure funziona tutto per ore, poi all'improvviso il touch ci saluta, per poi riprendere a funzionare dopo una manciata di secondi.
Gli altri input li riceve correttamente anche a display bloccato.
Vicino non ha nulla, tra l'altro e' nella stessa posizione in cui stava il vecchio progetto (sempre un nodeMCU ma con display oled e logica completamente differente) che ha sempre funzionato correttamente.
E' installato, ma lo posso rimuovere facilmente per i test su banco. Ho realizzato un pcb con quasi zero cablaggi (per evitare falsi contatti) e sia la schedina che il display sono su zoccolo.
Per scrupolo ho anche sostituito tutto l'hardware (display e scheda) e provato a compilare con un core differente (adesso ho installato la versione 2.5.2) ma nulla.
Allego l'ultimo codice caricato, grazie per l'aiuto
Ok adesso con il programma in mano posso dirti di più, usi String in ogni dove e inizializzando sempre stringhe nuove (Es. String("Ciao") ) e i blocchi random improvvisi potrebbero dipendere dall'uso di String.
Rimuovila in ogni punto e usa al suo posto array di char (stringhe classiche del C) con le relative funzioni per concatenarle, confrontarle, ecc.
Di metto alcuni link utili: itoa atoi strncpy strtok strlen strncat strncmp
epura il programma dallla classe String, ci sono buone possibilità che facendo quest'operazione oterrai la stabilità del progetto.
Poi veniamo alle stranezze, questa riga:
stato_rele = (digitalRead, relayPin);
è errata e non so neanche se compila correttamente, poi
String message = myNextion.listen(); {
elimina l'uso di String e poi come mai hai aperto la graffa??? secondo me dovresti rimuoverla
Tutte le stringhe ripetute (Es. "OFF", "ON") devinisci degli array di char costanti e usa quello, risparmierai memoria.
Per ora da una prima occhiata non vedo altro