🛠 Sommeil profond et réveil par watchdog
Objetivos
Reducir el consumo de la Nano Every para un sensor alimentado por pila: dormir el núcleo en SLEEP_MODE_PWR_DOWN y despertarlo periódicamente gracias al watchdog del ATmega4809. En esta familia, el watchdog provoca por defecto un reinicio: aprovechamos este reset como una alarma, distinguiendo un reinicio por watchdog de un arranque normal.
Material
- 1 × Arduino Nano Every
- Alimentación externa (pila/LiPo vía VIN) para medir la ganancia real — el módulo puente USB sigue consumiendo mientras el USB esté conectado
- Opcional: microamperímetro o módulo de medición de consumo
Código completo
// Sommeil profond, reveil ~1 s via watchdog (reset comme alarme)
#include <avr/sleep.h>
#include <avr/wdt.h>
void setup {
pinMode(LED_BUILTIN, OUTPUT);
wdt_reset;
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // mode le plus profond
sleep_disable; // armement a la volee
wdt_enable(WDTO_1S); // delai 1 s
}
void loop {
digitalToggle(LED_BUILTIN); // signal d'activite brève
delay(50);
wdt_reset; // eviter le reset immediat
sleep_enable;
sleep_cpu; // dort jusqu'au reset WDT
// A ce point : le watchdog a reinitialise la carte, setup tourne
// a nouveau avant de revenir ici.
}
Verificación esperada
El LED 13 parpadea brevemente cada segundo. Entre dos parpadeos, el núcleo está apagado: con alimentación por pila y USB desconectado, un microamperímetro debe mostrar un promedio muy inferior al modo activo (la ganancia exacta depende del modo y de los periféricos que hayan quedado activos).
Errores frecuentes
> NO VERIFICADO: corrientes de consumo exactas por modo de sueño en la placa Nano Every (no se ha recuperado ningún dato oficial) — medir en su propio montaje.
- Medir la ganancia con el USB conectado: el módulo puente serie y su regulador consumen permanentemente; sin alimentación en VIN y con el cable desconectado, la medición no tiene sentido.
- Olvidar el
wdt_resetperiódico: el watchdog reinicia la placa en plena actividad en lugar de servir como reloj. - Confundir los modelos: en el 328P se sale del sueño por interrupción del watchdog; en la familia 4809 el comportamiento por defecto es el reset — estructure el código en «tarea corta → sueño».
- Esperar que
millissiga contando: durante el sueño profundo, el conteo de Arduino se detiene; tras el despertar, vuelva a usar el reloj RTC externo si necesita horas exactas. - Periféricos dejados alimentados (LED parpadeante de un módulo, sensor en modo calentamiento): arruinan el presupuesto de energía más rápido que el propio núcleo.
- En caso de reset inexplicado, verifique el registro de causas de reset antes de sospechar del código.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
multi-serie.inoArduinoadc-filtre.inoArduinointerrupt-bouton.inoArduinonvm-consignes.inoArduinosommeil-every.inoArduinowatchdog-secours.inoArduino