🛠 Mode basse consommation : sleep profond et watchdog
Objetivos
Convertir la Esplora en un termómetro autónomo con vigilancia: despertar cada segundo mediante el watchdog de hardware, lectura del sensor de temperatura a través de la biblioteca, alerta por buzzer si se supera el umbral, y luego volver a SLEEP_MODE_PWR_DOWN (el modo de ahorro de energía más profundo del ATmega32u4). Aprenderás a apagar el ADC y a desactivar las interrupciones durante el sueño — y sobre todo los límites propios de esta placa: solo se alimenta por USB (no hay jack documentado), por lo que el regulador y el transceptor USB consumen constantemente.
Material
- Arduino Esplora + cable micro-USB (o batería USB tipo power bank para un montaje portátil).
- Biblioteca Esplora; avr/sleep.h, avr/wdt.h (core).
- Ningún componente externo.
Código completo
/* Veilleur de temperature en sommeil profond.
Reveil 1 s (watchdog) -> lecture capteur -> bip si > 30 degres -> re-dormir.
Attention : sur Esplora, seule l'alimentation USB est documentee ; le
courant de la carte en veille reste domine par le regulateur/USB, pas par
l'ATmega32u4 seul. */
#include <Esplora.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
volatile bool reveille = false;
ISR(WDT_vect) {
reveille = true; // simple drapeau : le traitement se fait dans la loop
}
void dormir {
Esplora.writeRGB(0, 0, 0); // tout eteint avant de dormir
Esplora.noTone;
ADCSRA &= ~(1 << ADEN); // ADC off (conseille avant sleep)
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable;
MCUCR |= (1 << BODSE) | (1 << BODS); // eteind BOD (2 cycles)
MCUCR = (1 << BODS);
sei;
sleep_cpu; // ici on dort jusqu'au watchdog
// --- reprise d'execution ---
cli;
sleep_disable;
ADCSRA |= (1 << ADEN);
}
void setup {
// Watchdog en mode interruption seule : 1 s
wdt_reset;
WDTCSR = (1 << WDCE) | (1 << WDE);
WDTCSR = (1 << WDIE) | (1 << WDP2); // 1 s, interruption sans reset
Serial.begin(9600);
}
void loop {
dormir;
if (!reveille) return;
reveille = false;
int t = Esplora.readTemperature(DEGREES_C);
Serial.print("T="); Serial.print(t); Serial.println("C (reveil watchdog)");
if (t > 30) {
Esplora.writeRGB(255, 0, 0);
Esplora.tone(880, 300);
delay(400);
}
}
Verificación esperada
El monitor serie muestra una línea aproximadamente cada segundo. Aprieta la placa: por encima de 30 °C, un pitido y un destello rojo siguen al despertar. Entre dos despertares, la CPU está en power-down (el LED L parpadea si tu sketch lo hace — aquí no). >
Errores frecuentes
- Olvidar retirar la bandera de sueño: sin
sleep_disableal despertar, cualquiersleep_cpufutura dormirá la placa para siempre; estructura siempre enable → sleep → disable. - Watchdog en modo reset: sin la secuencia WDTCSR anterior (WDIE sin WDE), el desbordamiento reinicia la placa en lugar de despertarla — el bootloader Caterina puede entonces reiniciarse.
- Procesar en la ISR: leer el multiplexor (tiempo de establecimiento ~50 µs) dentro de una interrupción bloquea todo; solo se debe establecer la bandera en la ISR.
- Esperar una autonomía con batería: la Esplora no tiene jack ni especificación de alimentación externa documentada; para uso portátil, prevé un cable de batería USB, y ten en cuenta que el sueño no corta el consumo del regulador previo.
- El monitor serie «rompe» el sueño: en algunas plataformas, mantener el CDC abierto impide el sueño profundo completo; prueba con batería y cable desconectado para medir el comportamiento real.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
joystick-couleur.inoArduinojeu-boutons.inoArduinoslider-luminosite.inoArduinothermometre-couleur.inoArduinosonometre.inoArduinoaccelerometre-tilt.inoArduino