🛠 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

Objectifs

Prolonger l'autonomie d'un enregistreur sur pile : endormir l'ATmega2560 en mode power-down (CPU, horloges et périphériques coupés) et le réveiller périodiquement par le watchdog, tout en journalisant les mesures dans les 4 Ko d'EEPROM de la Mega — quatre fois plus que sur un Uno — sous forme de mémoire tampon circulaire qui survit aux coupures d'alimentation.

Matériel

Mise en garde : la consommation au niveau de la carte n'est pas donnée par le constructeur, et le régulateur linéaire ainsi que la puce USB 16U2 consomment même quand l'ATmega dort. Les gains réels de courant concernent le microcontrôleur seul ; pour un produit basse consommation, il faut alimenter la puce directement.

Code complet

// 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;
}

Vérification attendue

Le moniteur série affiche un numéro de case toutes les ~2 secondes (le watchdog réveille bien le microcontrôleur). Après extinction/re-allumage, le compteur reprend où il s'était arrêté : la EEPROM a conservé le curseur et les mesures.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels