Cronotermostato Si Blocca random

Salve a tutti.

Finalmente ho messo in funzione il mio progetto e cioè un cronotermostato basato su “arduino mega” + “ethernet shield” che mi consente di gestire da remoto il riscaldamento di casa visualizzando anche parametri di umidità, pressioni e temperature.

Il tutto sembrava funzionare perfettamente finchè non ho preteso di tenerlo acceso in “continua” istallandolo in casa. Purtroppo il programma si blocca in modo random e quindi non presenta le necessarie caratteristiche di stabilità; nel senso che non posso certo accettare che mi si pianti su " caldaia accesa" per 24 ore di fila fintanto che non arrivo a casa a resettare…

Per trovare l’inghippo ho tolto tutta la parte di webserver e dei sensori aggiuntivi, lasciando solo il core del programma che gestisce orari e temperature interne ( anche se ho lasciato la scheda ethernet inserita…errore?).

Il codice sembra bloccarsi in punti diversi del listato per cui deve esserci un problema a monte che forse qualche buon occhio esperto potrebbe individure immediatamente.

In allegato il codice che sto facendo girare adesso:

Ringrazio e saluto

termoweb5.ino (9.36 KB)

Qualcuno di voi sa darmi qualche indicazione sul perchè un codice ricorsivo si blocca?

Come posso procedere per individuare i motivi del blocco?

Grazie a chi vorrà rispondere.

Se mi ricordo bene il termine ricorsivo, occhio che sei su un microcontrollore con poca ram.

Con ricorsivo intendo Ciclico, che ripete sempre le stesse operazioni nel void loop(); come è possibile che si blocchi random? ossia in punti diversi e in momenti diversi?

P.S. scusa l'ignoranza.

Luca

No, con ricorsivo si intende una funzione che richiama se stessa, classico esempio il calcolo del fattoriale:

long int factorial(int n)
{
    if (n >= 1)
        return n*factorial(n-1);
    else
        return 1;
}

... dato che ad ogni chiamata, lo stack e le variabili locali vengono salvate in SRAM ... capisci bene che è molto facile esaurirla se il ciclo si ripete troppe volte.

Guglielmo

Non credo sia il mio caso. In quali altri casi si satura la memoria ?

il non-uso della makro F() in tutti i print/println di testo.

Serial.println("error retrieving pressure measurement\n");
meglio Serial.println(F("error retrieving pressure measurement\n"));

cosí risparmi RAM perché il testo non viene memorizzato in RAM.

Ma secondo me questo non é la causa del problema.

Ciao Uwe

Usa un buon alimentatore stabilizzato con corrente sufficiente ad alimentare tutte le shield
Sostituisci tutti quegli INT con byte dove la variabile non supera il 255
Usa la funzione F per i serial.print dove non ci sono variabili da stampare
Prova a lasciarlo acceso per un paio di giorni senza collegare i pin a nessun relè o carichi vari.
Poi torna :slight_smile:

Obbedisco....

P.S. pablos quando sei così diretto e non ti in***zi sei un grande.

LOL

In ultima analisi, vi era un uso eccessivo della ram.

Buongiorno a tutti.

Allora....il problema sembra risolto in quanto ormai sono tre giorni che arduino flussa ininterrottamente.

Ho fatto come hai detto tu, pablos ; ho sostituito qualche "int" con " byte" laddove non servivano valori superiori a 255, ho sostituito i serial.print() con serial.print(F()) togliendone anche alcuni.... ma il problema credo proprio che stesse tutto nell' " ALIMENTAZIONE ".

Le capacità del "mega" credo proprio che siano sovrabbondanti rispetto all'impegno di memoria del programma attuale ( a fine compilazione mi sembra che la memoria sia impegnata solo al 20% ma non ricordo bene ).Successivamente oltre alle modifiche al programma, ho inserito un secondo alimentatore che alimenta il solo arduino mega (ho anche tolto la scheda ethernet che per il momento non viene utilizzata) e da quel momento il sistema non si è più spento.

A questo punto il sistema è composto da:

N°1 alimentatore da 8V 800mA su connettore di alimentazione del "mega".
N°1 alimentatore da 5V 1 A per gli accessori che sono:
a) n°2 OLED 64x128
b) n°1 modulo RTC per ora e data DS3231
c) n°1 modulo temperatura interna + pressione atmosferica BMP 180
d) n°1 modulo temperatura esterna + umidità DHT22
e) n°1 relè 5V di cui non conosco l'assorbimento.......

Inizialmente alimentavo tutto con il solo alimentatore da 5V 1A ....

Adesso devo inserire anche la scheda ethernet e tutta la parte di gestione webserver magari controllando l'assorbimento.........

Faccio Sapere

P.S.Grazie a Pablos che ha capito subito ma anche a gli altri.

AIUTO AIUTO

SI è di nuovo bloccato, ma questa volta ho visto, per caso, che succede quando premo un interruttore di una luce della sala.

Quindi è un disturbo che gira nella rete domestica e che mi pianta, non so come, arduino.

Come posso fare per schermare il sistema dai disturbi della rete?

Vi chiedo ancora un po' di pazienza.....

Saluti
Luca

Forse con un bel condensatore all'uscita degli alimentatori potrei risolvere il problema ma..... di che capacità?

Confermato, quando premo un interruttore che accende una certa lampada a led vedo sfarfallare uno o entrambi gli oled; spesso il programma passa oltre e, al giro successivo, ripulisce la schermata, a volte però si blocca il tutto.

Vorrei inserire un filtro fra alimentatori e scheda ma non ho idea di come dimensionarlo.

Un altro dubbio che ho riguarda alimentatori switching che ho impiegato; possono essere anche loro fonte di disturbo per l'arduino?

Ringrazio chi vorrà aiutare.

Luca