🛠 Low-power : power-down, watchdog et budget batterie

Arduino Pro Mini · avance · Schéma : IMG-pro-mini-avance-9-promini-low-power-batterie.svg — Arduino Pro Mini sur LiPo avec bouton de réveil sur INT0 (broche 2), cycle de réveil watchdog ~8 s en mode power-down de l'ATmega328P, micro-ampèremètre en série

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales