deep_sleep.c
Un nodo 802.15.4 a pila duerme el 99,9 % del tiempo: el timer RTC lo despierta, el programa trabaja una fracción de segundo y vuelve a dormir. RTC_NOINIT_ATTR conserva el contador en memoria RTC alimentada.
Hardware necesario
Una placa ESP32-H2 (RISC-V a 96 MHz, radio IEEE 802.15.4 solo — sin Wi-Fi) tipo DevKitM-1, alimentada por USB. Ninguno; un polímetro en microamperios entre batería y GND para verificar el consumo de reposo.
Cableado
Sin cableado. A batería, alimente el módulo directamente: los reguladores del DevKit dominan el consumo en sueño.
Funcionamiento
esp_sleep_enable_timer_wakeup arma el reloj RTC lento; esp_deep_sleep_start corta CPU, RAM y radio. El despertar es un reinicio real: solo sobreviven los segmentos RTC y NOINIT. Prográmelo con ESP-IDF (idf.py set-target esp32h2); el puerto USB-Serial/JTAG (GPIO26/27) sirve de consola y puerto de flash. Mantenga Boot + Reset para modo download si hace falta.
Para ir más lejos
Despierte también con un sensor (ext1 en varios pines), o adapte el periodo a la calidad de la red 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
}