Publicado el 24.11.2024 a las 20:53
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.
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);
esp_reset_reason_t reason = esp_reset_reason(); Serial.println(reason);
#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 🖖