Watchdog: riavviare Arduino in caso di blocco

Il watchdog che letteralmente tradotto significa cane da guardia, è un timer che raggiunto un valore per il quale è stato settato genera un segnale che intercettato da Arduino esegue un riavvio dello sketch.

Molte volte ci ritroviamo con progetti che necessitano di un “controllo maggiore” e non possiamo permettere che il codice “si blocchi” o che si blocchi Arduino se volgiamo dirla così, quindi onde evitare che Arduino vada in blocco in uno stato di loop o deadlock possiamo intervenire con il watchdog.

I valori(tempi) possibili da settare al watchdog sono 10, che spaziano all’interno del seguente intervallo 15mS ÷ 8S.

Qui di seguito i tempi che possiamo settare (tramite relativa costante) sulla nostra Arduino :

  • 15 mS – WDTO_15MS
  • 32 mS – WDTO_32MS
  • 64 mS – WDTO_64MS
  • 125 mS – WDTO_125MS
  • 250 mS – WDTO_250MS
  • 500 mS – WDTO_500MS
  • 1 S – WDTO_1S
  • 2 S – WDTO_2S
  • 4 S – WDTO_4S
  • 8 S – WDTO_8S

Esempio pratico:

Stiamo controllando la temperatura del nostro terrario/acquario e dobbiamo mantenere una certa temperatura, quindi vogliamo evitare che Arduino vada in blocco, per garantire ciò, possiamo far uso del watchdog, quindi decidiamo che se i calcoli per la temperatura non vengano prodotti entro 8 sec. Arduino deve riavviare lo sketch.

Adesso vediamo un esempio facile facile (da notare l’include della libreria wdt):

#include <avr/wdt.h> // includiamo la libreria necessaria per il funzionamento del watchdog


void setup()
{
  // qui setto il pin di acquisizione della temperatura
  // ed il pin che andrà ad attivare il relè del cavetto/lampada riscaldante

  // attiviamo il Watchdog
  // nell'intervallo di tempo da noi scelto, in questo caso 8 secondi

  wdt_enable(WDTO_8S);
}


void loop()
{
  //acquisizione segnale temperatura
  //qui controllo se il caso o meno di attivare i riscaldamenti all’interno del nostro terrario

  /*****************************************************************************************************/

  //se a questo punto dello sketch non sono trascorsi gli 8 secondi posso resettare il watchdog
  //evitando così un riavvio inutile dello sketch

  wdt_reset();
}

Una breve analisi dello sketch:

Nella prima parte notiamo l’inclusione della libreria #include <avr/wdt.h> necessaria per il funzionamento del watchdog.
Successivamente settiamo il tempo massimo (nel range possibile) da noi deciso per eseguire l’acquisizione dei dati ed il relativo calcolo per la temperatura.
In fine facciamo un reset del timer del watchdog riportandolo di nuovo a zero, perché???? Perché se siamo arrivati fino all’istruzione di reset del watchdog “tutto quello che c’era prima” si è svolto entro gli 8 sec. e non abbiamo più interesse a quel punto di far riavviare Arduino. Se non lo facciamo il contatore interno continuerà ad incrementarsi fino al punto da generare l’evento che farà riavviare Arduino perché ha raggiunto il tempo di 8 sec. da noi stabilito.

A questo punto dovrebbe essere chiaro il funzionamento del watchdog…… se tutto fila liscio entro e non oltre il tempo prestabilito Arduino non verrà riavviato perché il timer sarà resettato “in tempo”, altrimenti verrà generato l’evento che ne determinerà un riavvio.

Una cosa da aggiungere a questo post, è che tutto questo avremmo potuto farlo anche senza usare la libreria, agendo direttamente sul registro del micro, potete documentarvi andando a leggere il datasheet dell’ATmega.

In fine sappiate che questo tipo di timer non deve necessariamente essere implementato all’interno del microcontrollore, può essere anche implementato tramite un circuito esterno, fatto ad esempio con un NE555, cosa che vedremo in futuro articolo.

Buon lavoro e alla prossima 😉