🛠 Sommeil profond et watchdog pour économiser la pile
Objectifs
Prolonger l'autonomie de la pile 110 mAh du SimpleSnap : endormir l'ATmega328P en power-down, le réveiller avec le watchdog, couper l'ADC avant de dormir. On démonte au passage le piège 8 MHz contre 16 MHz : un sketch configuré pour 16 MHz fait tout tourner deux fois plus vite (delay faux, UART décalé).
Matériel
- 1 LilyPad SimpleSnap (ATmega328P @ 8 MHz ; F_CPU doit valoir 8000000, carte « LilyPad Arduino »)
- Adaptateur FTDI pour téléverser et mesurer
- Multimètre en ampèremètre entre la pile et la carte (optionnel, pour mesurer le courant de sommeil)
- >
Code complet
// Sommeil power-down + réveil watchdog (~4 s) — LilyPad ATmega328P @ 8 MHz
#include <avr/sleep.h>
#include <avr/wdt.h>
const uint8_t LED = 13;
ISR(WDT_vect) { /* simple réveil : le travail se fait dans loop */ }
void setup {
// F_CPU = 8000000 (carte « LilyPad Arduino ») : jamais 16 MHz ici !
pinMode(LED, OUTPUT);
ADCSRA &= ~_BV(ADEN); // ADC coupé : économie immédiate
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // mode le plus profond
wdt_reset;
MCUSR &= ~_BV(WDRF);
WDTCSR = _BV(WDCE) | _BV(WDE); // suite d'accès aux fuseaux watchdog
WDTCSR = _BV(WDIE) | _BV(WDP3) | _BV(WDP0); // 2^15 cycles / 8 MHz ≈ 4,1 s
}
void loop {
digitalWrite(LED, HIGH); // « battement de cœur » bref
delay(20);
digitalWrite(LED, LOW);
set_sleep_enable(true);
sleep_cpu; // dort jusqu'à l'expiration du watchdog
}
Vérification attendue
La LED fait un éclair bref, puis la carte dort environ 4 secondes ; le motif se répète indéfiniment. L'ampèremètre inséré entre la pile et la carte tombe très en dessous du courant éveillé (LED allumée + CPU à 8 MHz). Si le rythme semble deux fois trop rapide, F_CPU est à 16 MHz : re-sélectionner la carte LilyPad et retéléverser.
Erreurs fréquentes
- Carte ou fuseaux à 16 MHz : delay et watchdog deux fois trop courts, UART décalé — le piège n°1 de la ligne LilyPad (8 MHz, contre 16 MHz sur Uno/Leonardo).
- Oublier de désactiver l'ADC avant sleep : la consommation au repos est multipliée.
- Vouloir delay pendant le sommeil : les timers sont gelés en power-down ; seul le watchdog (ou une interruption externe) réveille.
- Croire la carte entière endormie : le régulateur/chargeur MCP73831 consomme aussi ; le chiffre MCU nu du datasheet est un minoré.
- Laisser un wdt_enable d'un précédent sketch : la carte redémarre en boucle ; faire wdt_disable en setup si besoin.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinoluxmetre-couture.inoArduinointerrupteur-tilt.inoArduinoservo-balayage.inoArduino