Watchdog Timer (WDT) y Modos de Bajo Consumo (Sleep Modes)
En dispositivos embebidos y proyectos IoT autónomos que deben operar durante meses con una batería o instalarse en lugares inaccesibles, dos mecanismos son indispensables:
- Watchdog Timer (Perro Guardián): Protege el sistema reiniciándolo automáticamente ante cuelgues o bloqueos de software.
- Modos de Bajo Consumo (Sleep Modes): Apaga módulos internos del microcontrolador para reducir el consumo eléctrico de a menos de .
1. El Watchdog Timer (WDT) con <avr/wdt.h> #
El Watchdog Timer es un temporizador independiente que cuenta hacia atrás con su propio oscilador interno de .
- La aplicación debe "alimentar al perro guardián" periódicamente ejecutando
wdt_reset(). - Si el programa se bloquea en un bucle infinito, un fallo de memoria o ruido electromagnético y no ejecuta
wdt_reset()antes de que expire el tiempo configurado (ej. 2 segundos), el hardware del Watchdog fuerza un reinicio completo (Reset) del microcontrolador.
1#include <avr/wdt.h> 2 3void setup() { 4 Serial.begin(9600); 5 Serial.println("Sistema iniciado correctamente."); 6 7 // Activar Watchdog con timeout de 2 segundos 8 wdt_enable(WDTO_2S); 9} 10 11void loop() { 12 // Realizar operaciones normales... 13 delay(500); 14 15 // Alimentar al Watchdog (evita el reinicio) 16 wdt_reset(); 17}
2. Modos de Bajo Consumo (Sleep Modes) con <avr/sleep.h> #
El microcontrolador ATmega328P cuenta con 6 modos de suspensión. El más eficiente para ahorro extremo de batería es SLEEP_MODE_PWR_DOWN:
- Apaga: Reloj del oscilador de 16 MHz, CPU, ADC, Timers y periféricos.
- Mantiene activo: Interrupciones externas de hardware (Pines 2 y 3) y el Watchdog.
Ejemplo: Despertar Arduino con un Pulsador Externo #
1#include <avr/sleep.h> 2 3const int pinBoton = 2; // Pin de interrupción externa INT0 4const int pinLED = 13; 5 6void despertar() { 7 // ISR de despertar vacía (solo se utiliza para reactivar el reloj) 8} 9 10void setup() { 11 pinMode(pinLED, OUTPUT); 12 pinMode(pinBoton, INPUT_PULLUP); 13} 14 15void loop() { 16 // 1. Tarea activa: encender LED 1 segundo 17 digitalWrite(pinLED, HIGH); 18 delay(1000); 19 digitalWrite(pinLED, LOW); 20 21 // 2. Preparar interrupción para despertar con botón a nivel LOW 22 attachInterrupt(digitalPinToInterrupt(pinBoton), despertar, LOW); 23 24 // 3. Configurar modo de suspensión profunda (Power Down) 25 set_sleep_mode(SLEEP_MODE_PWR_DOWN); 26 sleep_enable(); 27 28 // 4. Entrar en modo suspensión (el microcontrolador se congela aquí) 29 sleep_cpu(); 30 31 // ─── EL PROGRAMA CONTINÚA AQUÍ AL DESPERTAR ─── 32 sleep_disable(); 33 detachInterrupt(digitalPinToInterrupt(pinBoton)); 34}
Resumen del tema
Conceptos clave #
- Watchdog Timer (WDT): circuito de seguridad con oscilador independiente que reinicia el microcontrolador si el código deja de ejecutar
wdt_reset(). - Constantes WDTO:
WDTO_15MS,WDTO_500MS,WDTO_2S,WDTO_8Sde la librería<avr/wdt.h>. SLEEP_MODE_PWR_DOWN: modo de reposo más profundo que reduce el consumo de corriente a microamperios apagando el reloj principal.- Fuentes de Despertar: interrupciones externas (
INT0/INT1en pines 2 y 3) o el propio temporizador Watchdog programado en modo interrupción.
Qué debes recordar #
Usa el Watchdog Timer para garantizar fiabilidad desatendida 24/7 y activa SLEEP_MODE_PWR_DOWN para prolongar la vida útil de dispositivos IoT alimentados con baterías.