🛠 Mode power-down, watchdog et journalisation EEPROM
Objetivos
Prolongar la autonomía de un registrador a pilas: poner el ATmega2560 en modo power-down (CPU, relojes y periféricos apagados) y despertarlo periódicamente mediante el watchdog, mientras se registran las mediciones en los 4 KB de EEPROM de la Mega —cuatro veces más que en un Uno— en forma de memoria búfer circular que sobrevive a los cortes de alimentación.
Material
- 1 × Arduino Mega 2560 + cable USB (para las pruebas)
- 1 × sensor en A0 (potenciómetro para probar)
- Alimentación mediante batería o jack de 7–12 V para las mediciones de autonomía
Advertencia: el consumo a nivel de la placa no lo proporciona el fabricante, y el regulador lineal así como el chip USB 16U2 consumen incluso cuando el ATmega está dormido. Las ganancias reales de corriente afectan únicamente al microcontrolador; para un producto de bajo consumo, hay que alimentar el chip directamente.
Código completo
// Sommeil power-down + watchdog + journal EEPROM circulaire
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <EEPROM.h>
const uint16_t N_REC = 1024; // 2 octets/rec -> 2 Ko dédiés
uint16_t slot = 0;
ISR(WDT_vect) { /* réveil seul : rien à faire ici */ }
void setup {
Serial.begin(115200);
slot = EEPROM.read(0); slot |= EEPROM.read(1) << 8;
if (slot >= N_REC) slot = 0; // curseur de réécriture
// Watchdog : 2 s, mode interruption (pas de reset)
MCUSR &= ~(1 << WDRF);
WDTCSR |= (1 << WDCE) | (1 << WDE);
WDTCSR = (1 << WDIE) | (1 << WDP1) | (1 << WDP2); // ~2 s
}
void loop {
uint16_t v = analogRead(A0);
EEPROM.update(2 + 2 * slot, (uint8_t)(v & 0xFF));
EEPROM.update(3 + 2 * slot, (uint8_t)(v >> 8));
slot = (slot + 1) % N_REC;
EEPROM.update(0, (uint8_t)(slot & 0xFF));
EEPROM.update(1, (uint8_t)(slot >> 8));
Serial.print(F("slot ")); Serial.println(slot);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable;
sleep_cpu; // dort jusqu'au réveil watchdog
sleep_disable;
}
Verificación esperada
El monitor serie muestra un número de casilla cada ~2 segundos (el watchdog despierta correctamente el microcontrolador). Tras apagar y volver a encender, el contador continúa donde se detuvo: la EEPROM ha conservado el cursor y las mediciones.
Errores frecuentes
Serial.printdespués desleep_cpusin reinicializar: la UART se recupera normalmente, pero muchos olvidansleep_disabley el segundo sueño comienza antes de la medición.- Configurar el watchdog en modo reset: la placa se reinicia en lugar de despertarse, el búfer EEPROM sobrevive pero la RAM se pierde.
- Escribir en la EEPROM en cada bucle aunque el valor no cambie:
EEPROM.updateevita escrituras innecesarias, algo valioso para la resistencia. - Creer que la placa entera consume menos de 100 µA: el 16U2 y el regulador no duermen junto con el ATmega.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinodouble-servo.inoArduinopont-uart.inoArduinopwm-respiration.inoArduinopotentiometre-plotter.inoArduino