🛠 Mode basse consommation : power-down et watchdog
Objetivos
Dormir el ATmega32U4 en modo power-down (consumo a nivel de microamperios en el MCU) y despertarlo cada segundo con el watchdog, mediante programación directa en C para AVR. Comprender las implicaciones de este modo en una placa: el USB se desconecta durante el sueño y el Monitor serie ya no muestra nada.
Material
- 1 Arduino Micro + cable micro-USB (o alimentación por Vin)
- El LED integrado (pin 13) como indicador de despertar
- Opcional: un amperímetro en serie para medir la corriente durante el sueño
Código completo
// Sommeil power-down + reveil par watchdog (~1 s), en AVR C direct.
// Attention : en power-down, l'USB CDC est mort ; pas de Serial pendant le sommeil.
#include <avr/sleep.h>
#include <avr/wdt.h>
volatile bool reveil = false;
ISR(WDT_vect) { // le watchdog reveille : travail minimal
reveil = true;
}
void dormir1s {
MCUSR &= ~(1 << WDRF); // effacer la raison de reset
wdt_reset;
WDTCSR |= (1 << WDCE) | (1 << WDE); // autoriser la modification
WDTCSR = (1 << WDP0) | (1 << WDP1) | (1 << WDIE); // ~1 s, mode interruption
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // mode le plus profond
sleep_enable;
sei;
sleep_cpu; // dort jusqu'au watchdog
sleep_disable;
}
void setup {
pinMode(LED_BUILTIN, OUTPUT);
wdt_disable;
}
void loop {
digitalWrite(LED_BUILTIN, HIGH); // temoin bref du reveil
delay(30);
digitalWrite(LED_BUILTIN, LOW);
dormir1s; // ~1 s de sommeil profond
}
Verificación esperada
El LED 13 parpadea brevemente cada segundo. Al insertar un amperímetro entre la fuente de alimentación y la placa, se observa una fuerte caída de la corriente durante el sueño en comparación con el estado de vigilia. > NO VERIFICADO: la ficha del proyecto no proporciona un valor oficial de consumo a nivel de la placa; las curvas del datasheet del 32U4 se refieren solo al MCU, no a la placa completa (regulador, LED incluidos).
Errores frecuentes
- Esperar mensajes serie durante el sueño: el 32U4 está dormido, el USB está desconectado; el Monitor muestra un error de puerto.
- Olvidar ejecutar sleep_disable o desarmar el watchdog en otro lugar: el comportamiento de despertar se vuelve incoherente.
- Configurar el watchdog en modo reset en lugar de modo interrupción (bit WDIE): la placa se reinicia en lugar de despertarse.
- Confiar en el despertar por USB: en power-down, es mejor usar una interrupción externa (pines 0, 1, 2, 3, 7) para un despertar mediante botón.
- Dejar pines en entrada flotante: consumen energía; configúrelos como salida en un estado estable o con pull-up antes de dormir.
Otros tutoriales para esta placa
- Faire clignoter la LED embarquée (et comprendre les LED TX/RX)
- Lire un bouton avec une résistance de pull-up interne
- Lire un capteur analogique sur le convertisseur 10 bits
- Transformer le Micro en clavier USB (HID) avec bouton de sécurité
- Pont Serial vers Serial1 : passerelle USB vers TTL
- Piloter un servo moteur avec le PWM et un potentiomètre
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinoclavier-auto-tape.inoArduinosouris-cercle.inoArduinotelecommande-media.inoArduinobouton-clic-souris.inoArduino