deep_sleep.c
Un nœud 802.15.4 sur pile dort 99,9 % du temps : le timer RTC réveille, le programme travaille une fraction de seconde et se rendort. RTC_NOINIT_ATTR conserve le compteur de réveils dans la mémoire RTC sous tension.
Matériel requis
Une carte ESP32-H2 (RISC-V 96 MHz, radio IEEE 802.15.4 uniquement — pas de Wi-Fi) type DevKitM-1, alimentée par USB. Aucun ; un multimètre en microampères entre batterie et GND pour vérifier la consommation (µA attendus).
Branchement
Aucun câblage. Sur batterie, alimentez directement le module : les régulateurs du DevKit dominent la consommation de sommeil.
Fonctionnement
esp_sleep_enable_timer_wakeup arme l'horloge RTC lente ; esp_deep_sleep_start coupe CPU, RAM et radio. Le réveil est une vraie remise à zéro — seuls les segments RTC et NOINIT survivent. Programmez avec ESP-IDF (idf.py set-target esp32h2) ; le port USB-Serial/JTAG (GPIO26/27) sert de console et de port de flash. Maintenez Boot + Reset pour le mode download si besoin.
Pour aller plus loin
Réveillez aussi sur un capteur (ext1 sur plusieurs broches), ou adaptez la période selon la qualité du réseau 802.15.4.
deep_sleep.c
// deep_sleep.c — reveil toutes les 60 s, compteur en RTC memory.
#include "esp_sleep.h"
#include "esp_rtc.h"
#include "driver/gpio.h"
#include "esp_log.h"
RTC_NOINIT_ATTR int nb_reveils; // survit au deep sleep
static const char *TAG = "dodo";
void app_main(void)
{
esp_log_level_set("*", ESP_LOG_INFO);
nb_reveils++;
ESP_LOGI(TAG, "Reveil n°%d — travail court puis 60 s de sommeil", nb_reveils);
// (lecture capteur + envoi 802.15.4 ici, en < 100 ms)
// Etteindre la radio et les peripheriques avant de dormir
ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(60ULL * 1000000ULL));
ESP_LOGI(TAG, "deep sleep maintenant (%u us)", (unsigned)(60e6));
fflush(stdout);
esp_deep_sleep_start();
// jamais atteint : au reveil, reprise complete de app_main
}