🛠 Low-power : mode power-down et watchdog
Objetivos
Reducir el consumo del Nano clásico durante el sueño profundo: poner el ATmega328P en modo power-down (relojes detenidos, SRAM y registros guardados) y despertarlo periódicamente mediante el watchdog independiente (~8 s máximo). Técnica básica de cualquier sensor alimentado por pila de botón o LiPo.
Material
- 1 × Arduino Nano clásico (ATmega328P) — atención: el FTDI y el LED de alimentación consumen permanentemente en la placa; para un consumo real en microamperios, utilizar un 328P desnudo o desactivar estos componentes
- 1 × alimentación por batería y un microamperímetro en serie para medir la mejora
- >
Código completo
// Sommeil power-down + reveil watchdog ~8 s (ATmega328P)
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/power.h>
ISR(WDT_vect) { /* reveil : retour naturel en loop */ }
void setup {
pinMode(LED_BUILTIN, OUTPUT);
MCUCR = 0; // reveil bas niveau
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable;
wdt_reset;
WDTCR = _BV(WDIE) | _BV(WDP3) | _BV(WDP0); // IT watchdog ~8 s
power_adc_disable; // coupe les peripheriques inutiles
power_timer1_disable;
power_usart0_disable;
}
void loop {
digitalWrite(LED_BUILTIN, HIGH); // pouls de 100 ms entre deux sommeils
delay(100);
digitalWrite(LED_BUILTIN, LOW);
wdt_reset;
WDTCR = _BV(WDIE) | _BV(WDP3) | _BV(WDP0); // rearme (bit WDTCE)
sleep_cpu; // power-down jusqu'au prochain WDT
}
Verificación esperada
El microamperímetro muestra picos cortos (el impulso del LED de 100 ms) separados por mesetas muy bajas: el MCU solo pasa de varios miliamperios activos a unos pocos microamperios en power-down. El LED parpadea cada ~8 s, lo que demuestra que el watchdog despierta correctamente el sueño. Eliminar el código de sueño hace que la meseta de consumo suba inmediatamente.
Errores frecuentes
- Olvidar rearmar el watchdog en cada ciclo: en el segundo retardo, el watchdog expira en modo reset y la placa se reinicia en bucle.
- Confiar en la placa completa para obtener microamperios: el FTDI alimentado, el LED de alimentación y el regulador consumen más que el MCU dormido; la mejora real se mide en el chip desnudo.
- Llamar a Serial.print después del sueño sin reactivar usart0 (power_usart0_enable): la línea serie permanece cortada, sin ningún mensaje.
- Elegir un retardo del watchdog demasiado corto: el paso mínimo (~16 ms) no justifica un despertar; agrupar las mediciones para maximizar el tiempo dormido.
- >
Otros tutoriales para esta placa
Ejemplos de código para esta placa
buzzer-melodie.inoArduinoservo-sweep.inoArduinoultrason-hcsr04.inoArduinolcd-i2c.inoArduinoeeprom-contre.inoArduinosommeil-watchdog.inoArduino