🛠 Deep sleep sur batterie avec réveil par GPIO16

ESP8266 (módulo ESP-12E) · avance · Schéma : IMG-esp8266-esp-12e-avance-1-esp8266-deep-sleep-batterie.svg — Module ESP-12E alimenté par régulateur LDO sur batterie LiPo, fil GPIO16 relié à RST pour le réveil, LED de test déconnectée, bouton de réveil externe optionnel.

Objetivos

Transformar el ESP8266-ESP-12E en un sensor alimentado por batería: en modo deep sleep, el chip consume del orden de decenas de microamperios frente a varias decenas de miliamperios en funcionamiento Wi-Fi, lo que permite autonomías de varios meses. El despertar lo asegura el temporizador RTC interno, y el cableado obligatorio GPIO16 → RST permite también un despertar externo (GPIO16 genera un impulso que reinicia el módulo a través del pin reset). Punto crucial: el deep sleep borra toda la RAM —ningún contador, ninguna variable sobrevive—; se utiliza la memoria RTC (RTC_SLOW_MEM) para conservar un estado entre despertares, y hay que reinicializarlo todo en cada arranque.

Material

Código completo

#include <ESP8266WiFi.h>

// Memoire RTC : survit au deep sleep (RAM classique : effacee !)
RTC_DATA_ATTR uint32_t compteur = 0;

extern "C" {
  #include "user_interface.h"
}

void setup {
  Serial.begin(115200);
  compteur++;
  Serial.printf("\nReveil n°%u  raison: %s\n", compteur,
                user_rtc_get_reset_reason == POWERON_RESET ? "mise sous tension" : "deep sleep");

  // --- Travail court : lecture capteur, mesure batterie ---
  uint32_t vbat = ESP.getVcc;                    // mV (si calibration AD0 faite)
  Serial.printf("Vcc=%u mV\n", vbat);

  // Optionnel : publier en Wi-Fi puis attendre 1 s que le paquet parte
  // WiFi.mode(WIFI_STA); WiFi.begin(SSID, PASS);
  // unsigned long t0 = millis;
  // while (WiFi.status != WL_CONNECTED && millis - t0 < 8000) delay(50);
  // ... publish MQTT ...
  // WiFi.forceSleepBegin;                        // radio off avant de dormir

  Serial.println("Endormissement 30 s (GPIO16 doit etre cablee a RST)");
  Serial.flush;
  delay(50);
  ESP.deepSleep(30 * 1000000ULL);                  // 30 s ; 0 = attendre un reveil externe
}

void loop {
  // Jamre atteint : deepSleep ne revient jamais
}

Verificación esperada

Desconecta y vuelve a conectar: el contador vuelve a empezar en 1 (la memoria RTC también se pierde sin alimentación), luego el módulo muestra «Reveil n°1» y duerme. Aproximadamente cada 30 segundos, aparece un nuevo despertar con el contador incrementado (2, 3, 4...) aunque no se haya tocado el módulo —prueba de que el temporizador RTC y el cable GPIO16→RST funcionan. Con el multímetro en serie con la batería, la corriente debe bajar a unos cientos de µA de media (sin contar el regulador de la placa de desarrollo). Con deepSleep(0), el módulo solo vuelve a despertar si conectas brevemente RST a masa.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales