Parar la ejecución o finalizar un programa en Arduino

Puede ser que sea lleguemos a un punto en que por seguridad sea necesario parar la ejecución del programa o que simplemente deseemos “apagar” la placa. Para ello se puede llamar a las funciones abort() o exit(0). Que es prácticamente lo mismo ya que abort lo único que hace es llamar a exit(1). Esto tiene sentido en aplicaciones de ordenador donde exit(0) indica la finalización del programa correctamente mientras que cualquier parámetro distinto de 0 indica que ocurrió un error. En Arduino ese valor que se pasa es ignorado, aunque tenemos que añadirlo si no queremos errores de compilación.

Puesta en forma de código la función exit seria similar a esta:

void exit(int ignored){
  cli(); //desactiva las interrupciones
  while(1); //bucle infinito
}

Básicamente suspende la interrupciones y luego entra en un bucle infinito. Si por algún motivo queremos hacer nuestra propia función de stop es fácil imitarla:

void stop(){
  noInterrupts();
  while(1);
}

En caso de que se use el watchdog es necesario deshabilitarlo o reiniciará la placa.

void stop(){
  wdt_disable(); //solo si esta activado el watchdog
  noInterrupts();
  while(1);
}

Las funciones anteriores son recomendables para casos en que la parada se produce por un error grave y donde menos acciones se realicen mejor. Sin embargo si queremos “apagar” la placa podemos dormirla profundamente, no llegara al consumo cero pero si al mínimo.

#include <avr/sleep.h>

void stop(){
  set_sleep_mode( SLEEP_MODE_PWR_DOWN );
  sleep_enable();
  noInterrupts(); //nunca será despertada
  sleep_cpu();
}

Por supuesto en todos estos casos basta con dejar la placa sin alimentación para poder volver a usarla.