Skip to Content

Watchdog y diseño a prueba de fallos para máquinas desatendidas

Una máquina desatendida no puede esperar a que alguien note que se ha congelado. Una bomba que sigue encendida porque el código se colgó es una inundación esperando a ocurrir. Esta lección cubre el temporizador watchdog y los hábitos de seguridad que lo acompañan.

Qué aprenderás

  • Explicar qué hace un watchdog y qué no arregla.
  • Armar un watchdog y alimentarlo desde loop().
  • Diseñar setup() para que las salidas arranquen en estado seguro tras cualquier reinicio.

Qué hace el watchdog

El watchdog es un temporizador de hardware que reinicia la placa salvo que tu código reinicie el propio temporizador antes de que caduque. Si un fallo provoca un bucle infinito o el código deja de llegar a la llamada de reset, el watchdog salta y reinicia la placa en lugar de dejarla congelada.

Un patrón mínimo de watchdog

#include <avr/wdt.h>

void setup() {
  // primero el estado seguro, siempre
  pinMode(Q0_0, OUTPUT);
  digitalWrite(Q0_0, LOW);
  wdt_enable(WDTO_2S);
}

void loop() {
  // tu lógica normal aquí

  wdt_reset();
}

wdt_enable(WDTO_2S) arma un watchdog de dos segundos. Si no se llama a wdt_reset() dentro de esa ventana, la placa se reinicia. Como el reset está al final de loop(), un cuelgue en cualquier punto anterior detiene los resets y provoca el reinicio.

Pruébalo primero en el banco. Cuando salta el watchdog, la CPU se reinicia y, con ella, tu programa: setup() vuelve a ejecutarse desde el principio. Ejecuta el ejercicio de abajo en tu propia placa y confirma el reinicio antes de depender de un watchdog en una máquina.

Pruébalo: provoca un reinicio a propósito

void loop() {
  Serial.println("alive");
  delay(500);
  wdt_reset();
  if (millis() > 10000) {
    while (true) {}   // cuelgue simulado: el watchdog debería reiniciar la placa
  }
}

Resultado esperado: el Monitor Serie imprime alive durante unos 10 segundos, luego la placa se reinicia y la secuencia empieza de nuevo.

Si falla: si tras el cuelgue el Monitor Serie no vuelve a imprimir alive, comprueba que el sketch incluye avr/wdt.h y arma el watchdog con wdt_enable() en setup(). Si la placa sigue sin reiniciarse, contacta con el soporte técnico de Industrial Shields.

Un reinicio es una recuperación, no una solución

Un reinicio por watchdog devuelve la placa al funcionamiento, no explica por qué se colgó. Registra el evento si puedes y trata los reinicios repetidos como un síntoma a investigar, no como una función que trabaja como se esperaba. Un complemento habitual es el contador en EEPROM de la lección anterior: incrementa un contador de reinicios al arrancar.

Salidas a prueba de fallos al reiniciar

Un reinicio vuelve a ejecutar setup(), así que las salidas quedan como las deje setup(). Diséñalo para dejarlas en estado seguro: motores parados, válvulas cerradas, alarmas en silencio, no como estuvieran antes del reinicio. No supongas que loop() volverá a ejecutarse a tiempo para corregir un valor por defecto inseguro. En la estación de bombeo, esto significa que el contactor de la bomba está siempre apagado hasta que la máquina de estados lo pide explícitamente.

Para profundizar

Siguiente lección: cuando te quedas sin terminales. Haz primero el cuestionario de abajo.

Rating
0 0

There are no comments for now.

to be the first to leave a comment.