Reset di Arduino via Software

Avere la possibilità di eseguire un Reset di Arduino via Software è utile per riportare il processore in una condizione conosciuta, soprattutto nel caso in cui il sistema è lontano, inaccessibile oppure controllato a distanza.

Ad esempio una stazione meteo remota autonoma (come questa) potrebbe avere la necessità di eseguire un reset magari se non riesce a comunicare con il server di raccolta dati oppure un apposito SMS da cellulare potrebbe richiederne il riavvio.

Un’altra esigenza potrebbe essere quella di eseguire un azzeramento di tutti i registri e riavviare il processore allo stato iniziale.

Oppure si potrebbe impostare un Watchdog (un guardiano) che sorvegli il tempo di ciclo del processore e se ne viene superata una soglia (ad esempio come in un loop infinito) esegua il reset di sistema.

Insomma i motivi sono innumerevoli per cui eseguire un reset software.

Vediamo in questo breve articolo una funzione (documentata anche sul sito ufficiale Arduino.cc) semplice da implementare e semplice da richiamare.

Per poterla utilizzare è sufficiente dichiarare in un punto qualsiasi prima della funzione setup() quanto segue:

//Dichiarazione della funzione di reset
//... si tratta di funzione che punta all'indirizzo zero!
void(* resetSoftware)(void) = 0;

In qualsiasi momento è possibile nel codice chiamarla semplicemente invocandone il nome (come una classica funzione):

void loop() {
...
...
resetSoftware(); // esegue il reset del processore
...
...
...
}

Possiamo ad esempio scrivere uno sketch che esegue il reset su richiesta esterna, ad esempio da seriale:

String var = "";
 
void(* resetSoftware)(void) = 0;
 
void setup()
{
  Serial.begin(9600);
  Serial.println("Avviamento Arduino");
  delay(10000); // attesa di 10 secondi
}
 
void loop() {
  // attende i dati sulla porta seriale
  if (Serial.available() > 0) {
    var = Serial.readString();
    //se sulla seriale arriva la stringa R
    if (var.equals("R")) {
    //reset software
    Serial.println("Riavvio Arduino con funzione software...");
    delay(1000); // attesa di un secondo
    resetSoftware(); // RIAVVIO!
    }
  }
}