sommeil-profond.ino

ESP32-S3 · Fichier : sommeil-profond.ino · Langage : Arduino · Usage : Réduire la consommation au sommeil profond minuté

En sommeil profond, le SoC consomme quelques microampères : réveil par minute ou par appui, l'autonomie d'une pile tient des mois. RTC_NOINIT_ATTR garde le compteur de réveils entre deux remises à zéro.

Matériel requis

Une carte ESP32-S3 (double cœur Xtensa avec instructions vectorielles, Wi-Fi + BLE 5, USB natif) type DevKitC-1, XIAO ou T-Display-S3, alimentée par USB. Aucun pour tester ; bouton sur GPIO0 pour réveiller manuellement (attention : GPIO0 est aussi la broche bootloader).

Branchement

Bouton GPIO0 vers GND. En montage sur batterie, retirer le pont USB-Série qui consomme plus que le SoC endormi.

Fonctionnement

esp_sleep_enable_timer_wakeup arme l'horloge RTC, ext0 surveille un niveau ; esp_deep_sleep_start coupe tout le reste. Au réveil le programme repart de setup() — les variables RAM sont perdues, sauf les attributs RTC. Dans l'Arduino IDE (paquet esp32), choisissez « ESP32S3 Dev Module », activez « USB CDC On Boot », puis Téléverser. Beaucoup de cartes placent un WS2812 sur GPIO48.

Pour aller plus loin

Réveiller sur un capteur (ext1 sur plusieurs broches), ou endormir entre deux lectures DHT du sketch dédié.

sommeil-profond.ino

// Sommeil profond : reveil toutes les 30 s ou sur GPIO0 (LOW).
// Le compteur de reveils est conserve en RTC memory (tenu sous tension).
RTC_NOINIT_ATTR int reveils;

void setup() {
  Serial.begin(115200);
  delay(150);                       // laisser le pont USB-serial s'ouvrir
  reveils++;
  Serial.printf("\nReveil n°%d — mesure, puis dodo 30 s\n", reveils);

  // (ici : lecture capteur, envoi radio, etc.)
  Serial.printf("heap libre avant dodo : %u\n", ESP.getFreeHeap());

  esp_sleep_enable_timer_wakeup(30ULL * 1000000);          // 30 s
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, 0);             // ou GPIO0 a LOW
  Serial.println("Entree en sommeil profond...");
  Serial.flush();
  delay(10);
  esp_deep_sleep_start();
}

void loop() {}   // jamais atteint : le deep sleep reinitialise tout

← Retour à la fiche