Sistema per riavviare un Arduino bloccato

Ciao a tutti,
vi chiedo aiuto per sistemare lo sketch che segue:
in pratica si tratta di un “watchdog” hardware, basato su un secondo arduino (o atTiny) che controlla se il primo arduino ha terminato un ciclo lungo al massimo 2 minuti (acquisizione dati da sensori, connessione tramite un gprs ad un server e invio dati) ed in caso contrario resetta il primo sistema mettendo in low il pin reset del primo arduino.

dato che deve essere a prova di bomba perche’ sara’ il sistema sara’ inaccessibile per lungo tempo, ho preferito far ripartire completamente il secondo arduino con la funzione void(* Riavvia)(void) = 0;.

l’unica modifica che potrei fare e’ quella di far comandare un rele’ che stacca la corrente invece del pin reset, ma vedremo dopo i test.

il sistema e’ in via di test ma dopo alcune modifiche che ho apportato mi restituisce degli errori che non riesco a togliere… un occhio allenato sicuramente puo’ aiutarmi…
GRAZIE! :slight_smile:

unsigned long TIME;

#define testPin = 8; // pin che controlla lo stato del MASTER
#define resetPin = 13; // pin che mantiene HIGH il pin RESET del MASTER
volatile int statoSistema = 0; // conta i cicli del MASTER
void(* Riavvia)(void) = 0; // funzione che riavvia il sistema
#define MAX_ATTESA 120000 // tempo massimo che il sistema deve attendere per stabilire se e' il MASTER e' bloccato

void setup()
{
  pinMode(resetPin, OUTPUT);
  pinMode(testPin, INPUT);
  digitalWrite(resetPin, HIGH); //imposto HIGH il pin che andra' collegato al RESET del MASTER
  
  //inizializzo la seriale
  Serial.begin(9600);
  //avvio
  Serial.println("AVVIO");
  //attendo 1s
  delay(1000);
}
 
void loop()
{
  //visualizzo sul serial monitor
  //il valore della variabile
  //Serial.print("TIME:");
  TIME = millis();
  //Serial.println(TIME);
  
  statoSistema = digitalRead(testPin);
  
  
    void statoSistema ();
    if (testPin == HIGH){
    testPin++;
    }
  
  
  if ( statoSistema > 0 || TIME < MAX_ATTESA ) { //se il testPin e' HIGH e TIME e' inferiore MAX_ATTESA
     Serial.print("Stato sistema ATTIVO");
     Serial.print("RESTART"); 
     delay(500);
     Riavvia();     //riavvio il sistema di controllo
   
} else if (TIME >= MAX_ATTESA+1) { //se il valore e' maggiore MAX_ATTESA
    
    Serial.print("Sistema fermo da ");
    Serial.print((TIME/1000)/60);
    Serial.println(" minuti");
    Serial.println("Sistema bloccato!! ...riavvio MASTER!");
    digitalWrite(resetPin, LOW); 
    delay(1000);
    Riavvia();
}

}

dimenticavo: il master alla fine del ciclo attiva un pin per 1s e indica al secondo arduino che il ciclo e' terminato.

almeno nelle mie intenzioni... :cold_sweat:

void(* Riavvia)(void) = 0; // funzione che riavvia il sistema

unsigned long TIME;
const byte testPin = 8; // pin che controlla lo stato del MASTER
const byte resetPin = 13; // pin che mantiene HIGH il pin RESET del MASTER
boolean statoSistema = LOW; 
const unsigned long MAX_ATTESA = 120000; // tempo massimo che il sistema deve attendere per stabilire se e' il MASTER e' bloccato
unsigned long counter; // conta i cicli del MASTER

void setup()
{
  delay(1000);
  pinMode(testPin, INPUT);
  pinMode(resetPin, OUTPUT);
  digitalWrite(resetPin, HIGH); //imposto HIGH il pin che andra' collegato al RESET del MASTER

  //inizializzo la seriale
  Serial.begin(9600);
  //avvio
  Serial.println("AVVIO");
  counter = 0;
}

void loop()
{
  //visualizzo sul serial monitor il valore della variabile
  //Serial.print("TIME:");
  TIME = millis();
  //Serial.println(TIME);

  statoSistema = digitalRead(testPin);
  if (statoSistema == HIGH) counter++;

  if ( counter > 0 || TIME < MAX_ATTESA ) { //se il testPin e' HIGH e TIME e' inferiore MAX_ATTESA
    Serial.print("Stato sistema ATTIVO");
    Serial.print("RESTART");
    delay(500);
    Riavvia();     //riavvio il sistema di controllo

  } else if (TIME >= MAX_ATTESA + 1) { //se il valore e' maggiore MAX_ATTESA

    Serial.print("Sistema fermo da ");
    Serial.print((TIME / 1000) / 60);
    Serial.println(" minuti");
    Serial.println("Sistema bloccato!! ...riavvio MASTER!");
    digitalWrite(resetPin, LOW);
    delay(1000);
    Riavvia();
  }
}

Così compila su IDE 1.6, ma non ho capito perché riavvi continuamente invece di usare il watchdog.

grazie mille paolop, il watchdog al massimo arriva a 8 secondi, a me invece servono almeno 4 minuti.

se si puo' fare con il watchdog comunque qualsiasi consiglio e' ben accetto!

Se il watchdog ha al massimo 8 secondi tu lo devi riarmare più spesso, parecchio spesso. A meno che l'Arduino non vada in sleep.