🛠 Low-power : mode power-down et watchdog
Objectifs
Faire chuter la consommation du Nano classique au réveil près : mettre le ATmega328P en mode power-down (horloges stoppées, SRAM et registres sauvegardés) et le réveiller périodiquement par le watchdog indépendant (~8 s max). Technique de base de tout capteur sur pile bouton ou LiPo.
Matériel
- 1 × Arduino Nano classique (ATmega328P) — attention : le FTDI et le LED d'alim consomment en permanence sur la carte ; pour du vrai microampère, utiliser un 328P nu ou désactiver ces postes
- 1 × alimentation sur batterie et un micro-ampèremètre en série pour mesurer le gain
- >
Code complet
// Sommeil power-down + réveil watchdog ~8 s (ATmega328P)
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/power.h>
ISR(WDT_vect) { /* réveil : retour naturel en loop */ }
void setup {
pinMode(LED_BUILTIN, OUTPUT);
MCUCR = 0; // réveil 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
}
Vérification attendue
Le micro-ampèremètre montre des pics courts (l'impulsion LED de 100 ms) séparés de plateaux très bas : le MCU seul tombe de plusieurs milliampères actifs à quelques microampères en power-down. La LED clignote toutes les ~8 s, preuve que le watchdog réveille bien le sommeil. Retirer le code de sommeil fait immédiatement remonter le plateau de consommation.
Erreurs fréquentes
- Oublier de réarmer le watchdog à chaque cycle : au deuxième délai, le watchdog expire en mode reset et la carte redémarre en boucle.
- Compter sur la carte complète pour du microampère : FTDI alimenté, LED d'alim et régulateur consomment plus que le MCU endormi ; le gain réel se mesure sur le chip nu.
- Appeler Serial.print après le sommeil sans réactiver usart0 (power_usart0_enable) : la ligne série reste coupée, plus aucun message.
- Choisir un délai watchdog trop court : le pas minimal (~16 ms) ne justifie pas un réveil ; regrouper les mesures pour maximiser le temps endormi.
- >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
buzzer-melodie.inoArduinoservo-sweep.inoArduinoultrason-hcsr04.inoArduinolcd-i2c.inoArduinoeeprom-contre.inoArduinosommeil-watchdog.inoArduino