Detecta cuando se queda bloqueada tu ESP8266 o tu ESP32

Publicado el 24.11.2024 a las 20:53

Detecta cuando se queda bloqueada tu ESP8266 o tu ESP32

  1. Reiniciar con el Watchdog Timer (WDT)

  2. Verificar el motivo del reinicio

  3. Código

Detecta cuando se queda bloqueada tu ESP8266 o tu ESP32

Más vale prevenir que curar.

Si quieres ir al turrón clic aquí.


Tengo una aplicación que gestiona pistas de pádel.


No es sólo la gestión de reservas y los pagos de las pistas con tarjeta y Bizum.


También controla la apertura de puertas y el encendido/apagado de luces.


Uso una microcontroladora para actuar sobre los relés y contactores de las puertas y luces.


Todo va bien hasta que deja de ir.


Hace 1 mes, una de las controladoras se bloqueó.


Las puertas no se podían abrir y las luces no obedecían a la APP.


Decenas de quejas de los usuarios.


En este artículo te contaré cómo implementar un mecanismo que permita a tu microcontroladora detectar bloqueos y reiniciarse automáticamente.

Así evitarás que tus proyectos queden inservibles cuando algo sale mal.


Porque incluso las máquinas necesitan una forma de 'empezar de nuevo'.


La solución que te cuento es para placas con FreeRTOS como la ESP8266 y la ESP32.


Reiniciar con el Watchdog Timer (WDT)

El Watchdog Timer (WDT) es una herramienta integrada en la ESP32 que puede detectar cuando el programa principal no responde y reiniciar el microcontrolador.


Si el programa no llama a una función (esp_task_wdt_reset()) dentro del tiempo configurado, el microcontrolador se reinicia automáticamente.


La configuración la haces en el setup() y en el loop() llamas a esp_task_wdt_reset().


La configuración la hacemos con la función

esp_task_wdt_init(int timeout_seconds, bool panic);


  • timeout_seconds especifica el tiempo límite (timeout) en segundos. Este es el tiempo máximo que puede transcurrir sin que el watchdog reciba un "reset" ( esp_task_wdt_reset() o equivalente) antes de que se active. Si se alcanza este tiempo sin reiniciar el watchdog, se considera que la tarea está bloqueada y se toma una acción (reiniciar o generar un pánico).
  • panic es un flag que determina el comportamiento del sistema si el Watchdog detecta un bloqueo. Si eliges true, cuando ocurre un timeout se genera un panic handler. Esto produce un volcado de stack (stack trace) para depuración y reinicia automáticamente el microcontrolador. Con false al ocurrir un timeout, simplemente se reinicia el microcontrolador sin generar información adicional.

Verificar el motivo del reinicio

esp_reset_reason_t reason = esp_reset_reason();
Serial.println(reason);
        

Código

#include <esp_task_wdt.h>;

void setup()
{
  esp_task_wdt_init(10, true);
  esp_task_wdt_add(NULL); // El esp_task_wdt_add(NULL) registra la tarea actual (NULL refiere a la tarea del loop()).
  //Reinicia el temporizador WDT en cada iteración del loop con esp_task_wdt_reset().
}

void loop()
{
  // si el loop se bloquea y no se llama a esp_task_wdt_reset() dentro del intervalo de tiempo, el WDT reiniciará la ESP32.
  esp_task_wdt_reset();

  //aquí tu código
}

Hasta luego 🖖

fjmduran.com v 17.0.2