🛠 Low-power : power-down, watchdog et budget batterie
Objetivos
La vocación de la Pro Mini: la instalación semipermanente con batería («intended for semi-permanent installation in objects or exhibitions»). Ponemos el ATmega328P en modo power-down (el más profundo de sus 5 modos de ahorro de energía), lo despertamos cada ~8 s mediante el watchdog independiente, y también lo despertamos al pulsar un botón mediante la interrupción externa INT0 (pin 2). Abordamos el presupuesto de batería: no hay chip USB en la placa, por lo tanto no hay puente FTDI que alimentar — esta es toda la ventaja del formato frente al Nano para el mismo ATmega328P.
Material
- 1 × Arduino Pro Mini (el modelo de 3,3 V/8 MHz es el más adecuado para LiPo; el regulador acepta hasta 12 V en RAW)
- 1 × batería LiPo de 3,7 V en RAW, o 3,3 V regulados externos en VCC
- 1 × microamperímetro en serie para medir la ganancia real
- 1 × botón entre el pin 2 (INT0) y masa, con pull-up interno
- >
Código completo
// Sommeil power-down + reveil watchdog ~8 s + bouton INT0 (broche 2)
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
ISR(WDT_vect) { /* reveil : retour naturel en loop */ }
ISR(INT0_vect) { /* reveil sur bouton, meme chemin */ }
void setup {
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP); // INT0 : reveil 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'a WDT ou INT0
sleep_disable;
}
Verificación esperada
El microamperímetro muestra picos cortos (el impulso LED de 50 ms) separados por mesetas muy bajas: el MCU solo cae de varios miliamperios activos a unos pocos microamperios en power-down. El LED parpadea cada ~8 s, prueba de que el watchdog despierta correctamente el sueño; una pulsación del botón despierta inmediatamente el ciclo. Retirar el código de sueño hace que la meseta de consumo suba inmediatamente.
Errores frecuentes
- Olvidar rearmar el watchdog en cada ciclo: en el segundo retardo, la expiración pasa a modo reset y la placa se reinicia en bucle.
- Contar con la placa completa para microamperios: el regulador lineal integrado y la LED de alimentación consumen permanentemente — la verdadera ganancia se mide retirando el LED (o sobre un 328P desnudo con el mismo pinout).
- Dejar Serial.begin activo: la UART y sus buffers cuestan caro; desactive los periféricos no utilizados (power_adc_disable etc.) antes de dormir.
- Brown-out al final de la batería: un umbral BOD mal calibrado (o clones con fusibles mal programados) hace que la placa se reinicie en bucle en cuanto la tensión bajo carga baja por debajo del umbral; mida la meseta real bajo pico de radio.
- Elegir un retardo de watchdog demasiado corto: cada despertar cuesta energía; agrupe las mediciones y los envíos para maximizar el tiempo dormido.
- >
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino