🛠 Low-power : power-down, watchdog et budget batterie
Objectifs
La vocation de la Pro Mini : l'installation semi-permanente sur pile (« intended for semi-permanent installation in objects or exhibitions »). On met l'ATmega328P en mode power-down (le plus profond de ses 5 modes d'économie d'énergie), on le réveille toutes les ~8 s par le watchdog indépendant, et on réveille aussi sur appui bouton via l'interruption externe INT0 (broche 2). On aborde le budget batterie : pas de puce USB sur la carte, donc pas de pont FTDI à nourrir — c'est tout l'intérêt du format face au Nano pour le même ATmega328P.
Matériel
- 1 × Arduino Pro Mini (le modèle 3,3 V/8 MHz se prête le mieux aux LiPo ; le régulateur accepte jusqu'à 12 V sur RAW)
- 1 × batterie LiPo 3,7 V sur RAW, ou 3,3 V régulé externe sur VCC
- 1 × micro-ampèremètre en série pour mesurer le gain réel
- 1 × bouton entre broche 2 (INT0) et la masse, pull-up interne
- >
Code complet
// Sommeil power-down + réveil watchdog ~8 s + bouton INT0 (broche 2)
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
ISR(WDT_vect) { /* réveil : retour naturel en loop */ }
ISR(INT0_vect) { /* réveil sur bouton, même chemin */ }
void setup {
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP); // INT0 : réveil sur appui
MCUSR &= ~(1 << WDRF);
wdt_reset;
WDTCSR |= (1 << WDCE) | (1 << WDE); // acces config watchdog
WDTCSR = (1 << WDIE) | (1 << WDP2) | (1 << WDP1); // IT, ~8 s
EICRA = (1 << ISC01); // INT0 sur front descendant
EIMSK = (1 << INT0);
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // ADC et BOD coupes dans ce mode
sei;
}
void loop {
digitalWrite(13, HIGH); // pouls de mesure
delay(50);
digitalWrite(13, LOW);
// ... ici : lecture capteur, mesure, envoi radio ...
wdt_reset;
WDTCSR |= (1 << WDCE) | (1 << WDE);
WDTCSR = (1 << WDIE) | (1 << WDP2) | (1 << WDP1); // rearme
sleep_enable;
sleep_cpu; // power-down jusqu'à WDT ou INT0
sleep_disable;
}
Vérification attendue
Le micro-ampèremètre montre des pics courts (l'impulsion LED de 50 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 ; un appui sur le bouton réveille immédiatement le cycle. 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, l'expiration passe en mode reset et la carte redémarre en boucle.
- Compter sur la carte complète pour du microampère : le régulateur linéaire embarqué et la LED d'alim consomment en permanence — le vrai gain se mesure en retirant la LED (ou sur un 328P nu au même brochage).
- Laisser Serial.begin actif : l'UART et ses buffers coûtent cher ; couper les périphériques inutilisés (power_adc_disable etc.) avant de dormir.
- Brown-out en fin de batterie : un seuil BOD mal calibré (ou des clones mal-fusibles) fait redémarrer la carte en boucle dès que la tension sous charge passe sous le seuil ; mesurer le plateau réel sous pic radio.
- Choisir un délai watchdog trop court : chaque réveil coûte de l'énergie ; regrouper les mesures et les envois pour maximiser le temps endormi.
- >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino