🛠 Deep sleep sur batterie avec réveil par GPIO16

ESP8266 (module 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.

Objectifs

Transformer l'ESP8266-ESP-12E en capteur sur batterie : en deep sleep, la puce consomme de l'ordre de la dizaine de microampères contre plusieurs dizaines de milliampères en fonctionnement Wi-Fi, ce qui permet des autonomies de plusieurs mois. Le réveil est assuré par le timer RTC interne, et le câblage obligatoire GPIO16 → RST permet aussi un réveil externe (GPIO16 génère une impulsion qui relance le module via la broche reset). Point crucial : le deep sleep efface toute la RAM — aucun compteur, aucune variable ne survit ; on utilise la mémoire RTC (RTC_SLOW_MEM) pour conserver un état entre les réveils, et il faut tout réinitialiser à chaque démarrage.

Matériel

Code complet

#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 être cablee a RST)");
  Serial.flush;
  delay(50);
  ESP.deepSleep(30 * 1000000ULL);                  // 30 s ; 0 = attendre un réveil externe
}

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

Vérification attendue

Débranche/rebranche : le compteur repart à 1 (la mémoire RTC est aussi perdue sans alimentation), puis le module affiche « Reveil n°1 » et dort. Toutes les 30 secondes environ, un nouveau réveil s'affiche avec le compteur incrémenté (2, 3, 4...) alors que le module n'a pas été touché — preuve que le timer RTC et le fil GPIO16→RST fonctionnent. Au multimètre en série avec la batterie, le courant doit retomber à quelques centaines de µA en moyenne (hors régulateur de la carte de dev). Avec deepSleep(0), le module ne se réveille plus que si tu relies brièvement RST à la masse.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels