Comment réveiller un ESP8266 en mode Deep-Sleep avec un détecteur de mouvement PIR, contacteur, radar micro-ondes

mini-tuto

#1

L’ESP8266 et ESP8266EX (modèles 2018) disposent d’un mode de mise en veille prolongée qui permet de faire fonctionner le module sur pile ou batterie. En mode Deep-Sleep, la consommation n’excède pas 20µA.

Activer le mode Deep-Sleep de l’ESP8266 et ESP8266EX

Pour activer le mode Deep-Sleep, il faut relier les broches D0 et RST à l’aide d’un Jumper ou d’une diode. L’utilisation d’une diode évite de provoquer un Reset en cas d’erreur de programmation.

Code Arduino pour mettre en veille prolongée et réveiller régulièrement l’ESP8266

Ensuite, il faut modifier le code pour activer la mise en veille prolongée. On demande la mise en veille avec la commande ESP.deepsleep(durée,mode). La durée doit être indiquée en micro-secondes. Par exemple pour réveiller le modules toutes les 10 secondes, on indiquera 10*1000000. Le second paramètre permet de spécifier si on doit allumer le modem WiFi au moment du réveil. Par défaut, il est activé. Les modes disponibles :

  • RF_CAL ou RF_DEFAULT
  • RF_NO_CAL, aucun étalonnage du signal WiFi. N’apporte rien de plus
  • RF_DISABLED, le modem WiFi est éteint

Quelques exemples

  • ESP.deepsleep(0), met en veille le module jusqu’à ce qu’il soit réveillé par un pic sur la broche RST
  • ESP.deepsleep(5 * 1000000), réveille le module toutes les 5 secondes
  • ESP.deepsleep(5000000, RF_DISABLED), réveille le module toutes les 5 secondes sans ré-activer le modem WiFi

Réveiller l’ESP8266 à l’aide d’un détecteur de mouvement infrarouge

On peut réveiller l’ESP8266 à n’importe quel moment en envoyant une impulsion sur la broche RST (RESET). On pourra par exemple récupérer le front montant d’un capteur de mouvement pour provoquer le réveil du module à l’aide d’un transistor NPN (2N2222 ou BC457 par exemple)

En cas de redémarrage multiple (rebond)

Il est possible que certains capteurs provoquent des rebonds. Dans ce cas, il est possible d’installer un condensateur de 1µF qui permet de filtrer les signaux parasites et ainsi d’éviter les redémarrages multiples du module. Le circuit a été présenté par Tomsim sur Stackoverflow. La résistance de rappel est optionnelle. La valeur des résistances ne semble pas très importante.

Le circuit fonctionne également avec un radar de proximité par micro-ondes de type RCWL-0516

Exemple de code Arduino

Voici un petit exemple qui permet de créer un petit système d’alarme WiFi. Dès son réveil, le module ESP8266 se connecte au réseau WiFi et au broker MQTT indiqué. L’état du capteur est mis à jour durant 1 seconde puis le mode retourne en Deep-Sleep jusqu’à la prochaine détection de mouvement.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#include <Ticker.h>
Ticker ticker;

#define NB_TRYWIFI    10

const char* ssid = "xxxx";
const char* password = "xxxx";
const char* mqtt_server = "xxx.xxx.xxx.xxx";

WiFiClient espClient;
PubSubClient client(espClient);

void tick()
{
  //toggle state
  int state = digitalRead(BUILTIN_LED);  // get the current state of GPIO1 pin
  digitalWrite(BUILTIN_LED, !state);     // set pin to the opposite state
}

void sendMQTTMessage(){
  if (!client.connected()) {
    reconnect();
  }
  client.publish("DeepSleepDemo/PIR", "1");
  delay(1000);
  client.publish("DeepSleepDemo/PIR", "0");
}


void setup() {
  int start = millis();
  // Fait clignoter la LED intégré durant la connexion au réseau WiFi - Blink Bleu Led during WiFi connexion
  pinMode(BUILTIN_LED, OUTPUT);
  ticker.attach(0.5, tick);
   
  Serial.begin(115200);
  // Raison du réveil - restart reason
  Serial.println(""); Serial.print("Reason startup :");Serial.println(ESP.getResetReason());
    
  WiFi.begin(ssid, password);

  Serial.println("Connecting to WiFi.");
  int _try = 0;
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
    _try++;
    if ( _try >= NB_TRYWIFI ) {
        Serial.println("Impossible to connect WiFi network, go to deep sleep");
        ESP.deepSleep(0);
    }
  }
  Serial.println("Connected to the WiFi network");
 
  Serial.println("Send PIR Status to MQTT broker");
  client.setServer(mqtt_server, 1883);
  sendMQTTMessage();
  
  // Durée du réveil - waking time
  Serial.println("Waking time: ");Serial.print(millis()-start);Serial.println("ms");

  ticker.detach();
  digitalWrite(BUILTIN_LED, LOW);
 
  Serial.println("Go to deep sleep");
  
  ESP.deepSleep(0);
}

void loop() {
}

boolean reconnect() {
  if (client.connect("ESP8266Client")) {
    Serial.println("Connected to server");
    return client.connected();
  }
  Serial.println("I think connection failed!");
  return 0;
}

Vous trouverez plus de détail en lisant ce tutoriel sur le blog