Come eseguire un riavvio dello sketch via software

Avere la possibilità di riavviare l’esecuzione del programma può risultare utile nei casi in cui ci sia l’esigenza di ripristinare la board a una condizione iniziale certa, soprattutto quando si trova in una posizione non accessibile o remota.
Supponiamo il caso di una Arduino Ethernet, o comunque con capacità di avere un collegamento ethernet o wifi, che si trova a lavorare in un posizione remota e che per qualsiasi motivo vogliamo seguire un riavvio della scheda per poter inizializzare nuovamente il programma che gira sulla scheda.
In questo caso possiamo usare una funzione, che se richiamata, permette di riavviare il programma come quando alimentiamo la scheda.

Riavviare Arduino Ethernet via software
Riavviare Arduino Ethernet via software

Sul sito Arduino.cc hè disponibile nella sezione guide, una utile funzione che permette appunto di riavviare la scheda. Il codice seguente permette di testare questa funzione affinché possiamo capirne il funzionamento e poterla applicare secondo le nostre esigenze:

int var = 0;

//Dichiarazione di funzione che punta all'indirizzo zero
void(* Riavvia)(void) = 0;

void setup()
{
  //inizializzo la seriale
  Serial.begin(9600);
  //avvio
  Serial.println("AVVIO");
  //attendo 1s
  delay(1000);

}

void loop()
{
  //incremento la variabile
  var++;
  //visualizzo sul serial monitor
  //il valore della variabile
  Serial.println(var);
  //attendo 5s
  Serial.println("Attesa");
  delay(5000);
  //reset via software
  Serial.println("Reset!!");
  Riavvia();

}

Il codice dichiara, prima del blocco setup, una funzione che in pratica è un puntatore a funzione che viene fatto puntare alla posizione zero (scusate il gioco di parole!!). Richiamare questa funzione permette ad Arduino di eseguire il codice se fosse stato appena stato resettato (anche se non vi è un vero e proprio reset hardware).
Ho inserito una variabile per verificare che il suo valore fosse, ad ogni riavvio, inizializzato a zero. I vari messaggi inviati al serial monitor permettono di dimostare e capire il funzionamento del codice.

Riavviare Arduino su richiesta

In questo codice di esempio viene eseguito il riavvio della scheda quando inviamo, tramite comunicazione seriale, usando il Serial Monitor, un particolare carattere:

String var = "";
 
//Dichiarazione di funzione che punta all'indirizzo zero
void(* Riavvia)(void) = 0;
 
void setup()
{
  Serial.begin(9600);
  Serial.println("AVVIO");
  delay(100);
}
 
void loop()
{
  //verifico la presenza di un dato sulla seriale
  if (Serial.available() > 0)
  {
    var = Serial.readString();
    //Invio la lettera R tramite Serial Monitor
    if (var == "R") //R
    {
    //reset software
    Serial.println("Riavvio...");
    delay(100);
    Riavvia();
    }
  }
 
 //Altro codice da eseguire...
 delay(10);
 
}

Quando progettiamo un circuito basato su microcontrollore che deve avere delle funzionalità per cui è possibile resettarlo in caso di mal funzionamenti, possiamo utilizzare le funzionalità del Watchdog timer o di un circuito di supervisione esterna.