🛠 Mode basse consommation : sleep profond et watchdog

Arduino Esplora — Fiche de carte · avance · Schéma : IMG-esplora-avance-3-esplora-low-power-watchdog.svg — Chronogramme du cycle de veille de l'Esplora : réveil par watchdog 1 s, lecture du capteur de température, décision buzzer, retour en power-down, avec le régulateur USB annoté.

Objectifs

Faire de l'Esplora un thermomètre-veilleur autonome : réveil toutes les secondes par le watchdog matériel, lecture du capteur de température via la bibliothèque, alerte buzzer si seuil dépassé, puis retour en SLEEP_MODE_PWR_DOWN (le mode le plus profond de l'ATmega32u4). Vous apprendrez à éteindre l'ADC et à désactiver les interruptions pendant le sommeil — et surtout les limites propres à cette carte : elle n'est alimentée QUE par USB (aucun jack documenté), donc le régulateur et le transceiver USB consomment en permanence.

Matériel

Code complet

/* 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'exécution ---
  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 (réveil watchdog)");
  if (t > 30) {
    Esplora.writeRGB(255, 0, 0);
    Esplora.tone(880, 300);
    delay(400);
  }
}

Vérification attendue

Le moniteur série affiche une ligne toutes les secondes environ. Serrez la carte : au-dessus de 30 °C, un bip et un flash rouge suivent le réveil. Entre deux réveils, le CPU est en power-down (le LED L clignote si votre croquis le fait — ici non). >

Erreurs fréquentes

  1. Oublier de retirer le flag de sommeil : sans sleep_disable au réveil, la moindre sleep_cpu future endort la carte pour toujours ; structurez toujours enable → sleep → disable.
  2. Watchdog en mode reset : sans la séquence WDTCSR ci-dessus (WDIE sans WDE), le dépassement redémarre la carte au lieu de la réveiller — le bootloader Caterina peut alors être relancé.
  3. Traiter dans l'ISR : lire le multiplexeur (temps d'établissement ~50 µs) dans une interruption bloque tout ; seul le drapeau doit être posé dans l'ISR.
  4. Attendre une autonomie batterie : l'Esplora n'a ni jack ni consigne d'alimentation externe documentée ; en nomade, prévoyez un câble batterie USB, et sachez que le sommeil ne coupe pas la consommation du régulateur amont.
  5. Le moniteur série « casse » la veille : sur certaines plateformes, garder le CDC ouvert empêche le sommeil profond complet ; testez sur batterie, câble débranché, pour mesurer le vrai comportement.

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels