problema con arduino mega 2560 che si resetta impostando il watchdog

Buonasera a tutti,
nel mio codice ho settato il watchdog in maniera tale che se il loop dura più di 8 secondi, arduino esegue un interrupt e poi resetta.
Il fatto che il loop duri più di 8 secondi significa che si è bloccato da qualche parte.
In un giorno, nella media, esegue 2-3 reset, altri giorni nemmeno 1...
Com'è possibile capire quale stringa di codice sia "malfunzionante"?
Ho un codice di 2905 righe...

Non so se esistano "trucchi" per capire dove interviene il watchdog.
Se nel progetto usi la SD potresti provare a scrivere su un file le operazioni che esegui man mano che gira il loop() così dopo il riavvio puoi vedere dov'era arrivato.
A parte questo le solite domande di rito...

  • usi la classe String?
  • usi relè?
  • che arduino usi?
    Spiega un po' com'è fatto il progetto. E allega il codice, manca mai che qualcuno abbia voglia di leggersi 3k righe...

Ciao fratt,
ti ringrazio per la risposta.
rispondo alle tue domande:

usi la classe String?

L’unica cosa che si collega alla classe String è tramite la libreria HCRTC ed in particolare: HCRTC.GetDateString());

usi relè?

Si, tutti a stato solido per la 24Vac (elettrovalvole) e mosfet per la 12V (sempre elettrovalvole)

che arduino usi?

un arduino MEGA 2560.

  1. il primo problema è eliminare del tutto ogni collegamento alla classe String.

  2. stampare un comando in seriale (tramite bluetooth) e non riceverlo dal dispositivo ricevente (cellulare), può comportare un riempimento di “memoria” che causa il blocco?

  3. Stessa cosa potrebbe capitare con i trasmettitori/ricevitori radio? Perchè lo chiedo, perchè l’arduino comunica, ogni secondo un comando, con un altro arduino tramite radio e potrebbe capitare il caso in cui una persona passa e quel comando non ricevuto potrebbe causare il blocco di memoria…?

Comunque sia, allego il codice anche se spiegarlo per filo e per segno impiegherebbe pagine e pagine.

ORTO_SUPERIORE.ino (146 KB)

  1. è abbastanza noto che la String possa dare problemi. dirti se è la causa del problema è difficile...
    2+3) non ho mai usato il BT e sto cominciando solo adesso con gli HC12, quindi non ho grande esperienza. però non credo che al trasmettitore interessi se il ricevitore riceve o no.

sui relè non so se quelli a stato solido danno meno problemi di quelli normali, per questo aspetta qualcuno più ferrato sull'hardware.

il codice l'ho aperto... ma è veramente lungo, mi sono perso alla seconda funzione dopo il loop()...
cosa fa la HCRTC che non fa la RTCLib?

mi pare che quando il WD entra in funzione, prima di resettare salva in eeprom dei valori. se è così, potresti mettere una variabile a cui dai un valore fisso in ogni parte del programma. quando scatta il WD salvi anche quella e poi vai a vedere che valore ha.
altrimenti credo che l'unica soluzione sia disabilitare varie parti del programma e provare a riabilitarle una alla volta finché vedi quale è la che blocca.

ciao…così a colpo d’occhio…e magari sbaglio…ma delay() e watchdog non vanno tanto d’accordo…soprattutto se fai cose del tipo:

  //VERIFICA COMANDI BLE
  if (Serial3.available())
  {
    delay(15);
    inputSize = Serial3.available();
    for (int i = 0; i < inputSize; i++)
      comando[i] = Serial3.read();

poi hai anche dei delay(1000) in qualche punto.

altra cosa…per confrontare la stringa arrivata usa la:

int strcmp ( const char * str1, const char * str2 );

e non tutta quella sfilza di if.

fratt:
cosa fa la HCRTC che non fa la RTCLib?

la differenza è che modificava l’ora e la data secondo comandi in seriale, ma adesso ho levato la libreria RTCLib e faccio tutto con HCRTC.

non ho mai usato il BT…

ricercando ho trovato la funzione Serial.flush() e adesso svuoto il buffer quando non c’è comunicazione, non sia mai potrebbe causare qualche problema…

ORSO2001:
ciao…così a colpo d’occhio…e magari sbaglio…ma delay() e watchdog non vanno tanto d’accordo…soprattutto se fai cose del tipo:

  //VERIFICA COMANDI BLE

if (Serial3.available())
 {
   delay(15);
   inputSize = Serial3.available();
   for (int i = 0; i < inputSize; i++)
     comando[i] = Serial3.read();



poi hai anche dei delay(1000) in qualche punto.

diciamo che sostituire i delay sarebbe una cosa un po’ complessa…comunque, la somma di tutto i delay non arrivano all’over del WDT

altra cosa…per confrontare la stringa arrivata usa la:

int strcmp ( const char * str1, const char * str2 );

e non tutta quella sfilza di if.

Ok però ci sono comandi e comandi…mi spiego molto meglio:
il comando “pozzo on” è un comando manuale che attiva la pompa per il riempimento del serbatoio. Se questo comando è uguale, allora svolgi delle cose. Fin qui tutto normale e semplice con strcmp
il comando “rtc 1305” modifica l’ora alle 13:05, cosa che non potrei risolvere con strcmp…

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