🛠 Mode power-down, watchdog et journalisation EEPROM

Arduino Mega 2560 (Rev3) · avance · Schéma : IMG-mega-2560-avance-3-low-power-watchdog-eeprom.svg — cycle de veille de l’ATmega2560 : mesure, écriture dans l’EEPROM 4 Ko en mémoire tampon circulaire, mise en sommeil power-down, réveil par le watchdog

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales