🛠 Sommeil profond et watchdog pour économiser la pile
Objetivos
Prolongar la autonomía de la pila de 110 mAh del SimpleSnap: poner el ATmega328P en modo power-down, despertarlo con el watchdog y desactivar el ADC antes de dormir. Aprovechamos para desmontar la trampa de los 8 MHz frente a los 16 MHz: un sketch configurado para 16 MHz hace que todo funcione el doble de rápido (delay incorrecto, UART desincronizado).
Material
- 1 LilyPad SimpleSnap (ATmega328P @ 8 MHz; F_CPU debe ser 8000000, placa «LilyPad Arduino»)
- Adaptador FTDI para cargar el programa y medir
- Multímetro en modo amperímetro entre la pila y la placa (opcional, para medir la corriente de reposo)
- >
Código completo
// 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
}
Verificación esperada
El LED emite un breve destello, luego la placa duerme durante unos 4 segundos; el patrón se repite indefinidamente. El amperímetro insertado entre la pila y la placa baja muy por debajo de la corriente en estado activo (LED encendido + CPU a 8 MHz). Si el ritmo parece el doble de rápido, F_CPU está en 16 MHz: vuelva a seleccionar la placa LilyPad y vuelva a cargar el programa.
Errores frecuentes
- Placa o fusibles a 16 MHz: delay y watchdog dos veces más cortos, UART desincronizado — la trampa n.º 1 de la línea LilyPad (8 MHz, frente a 16 MHz en Uno/Leonardo).
- Olvidar desactivar el ADC antes de dormir: el consumo en reposo se multiplica.
- Querer usar delay durante el sueño: los temporizadores están congelados en power-down; solo el watchdog (o una interrupción externa) despierta.
- Creer que la placa entera está dormida: el regulador/cargador MCP73831 también consume; la cifra del MCU desnudo del datasheet es un valor por defecto.
- Dejar un wdt_enable de un sketch anterior: la placa se reinicia en bucle; hacer wdt_disable en setup si es necesario.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinopwm-respiration.inoArduinoluxmetre-couture.inoArduinointerrupteur-tilt.inoArduinoservo-balayage.inoArduino