🛠 Mode power-down, watchdog et journalisation EEPROM
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
- 1 × Arduino Mega 2560 + câble USB (pour les tests)
- 1 × capteur sur A0 (potentiomètre pour tester)
- Alimentation sur batterie ou jack 7–12 V pour les mesures d'autonomie
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
Serial.printaprèssleep_cpusans réinitialiser : l'UART reprend normalement, mais beaucoup oublientsleep_disableet le deuxième sommeil part avant la mesure.- Configurer le watchdog en mode reset : la carte redémarre au lieu de se réveiller, le tampon EEPROM survit mais la RAM est perdue.
- Écrire dans l'EEPROM à chaque boucle même quand la valeur ne change pas :
EEPROM.updateévite les écritures inutiles, précieux pour l'endurance. - Croire que la carte entière consomme moins de 100 µA : le 16U2 et le régulateur ne dorment pas avec l'ATmega.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinodouble-servo.inoArduinopont-uart.inoArduinopwm-respiration.inoArduinopotentiometre-plotter.inoArduino