ESP 8266 : ré-activer wifi après deepsleep en WAKE_RF_DISABLED

Bonjour,

Pour un projet avec fonctionnement sur batterie, je cherche à minimiser au maximum la consommation.
Je travaille sur un Node Mcu 12E (pour passer ensuite sur un ESP-0x alimenté directement par piles)

Je n'arrive pas à ré-activer le module Wifi après un ESP.deepSleep(0, WAKE_RF_DISABLED); (et après quelques heures, je craque :sob: )

Dans le code ci-dessous, si je mets un ESP.deepSleep(0, WAKE_RF_DEFAULT); alors pas de souci :
quand je sors du deepsleep (mise du RST au niveau bas), lla connexion wifi s'initialise bien.

Par contre, avec ESP.deepSleep(0, WAKE_RF_DISABLED); alors le WiFi.status() se met d'abord en 6 (module is not configured in station mode) puis passe en 1 (configured SSID cannot be reached).

J'ai pourtant l'impression de faire comme vu à différents endroits :

  • croquis trouvé ici
  • infos

Que dois-je modifier svp ??
ou qu'est-ce que je ne comprends pas ?

#include <ESP8266WiFi.h>
//#include <WiFiClientSecure.h>

const char* ssid = "****";
const char* password ="****";



void connexion(){ // connexion au wifi
 

  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);

  WiFi.mode( WIFI_STA );
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  WiFi.disconnect();
  Serial.println("wifi déconnecté");
  Serial.println(WiFi.status());
  
  }


void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);

WiFi.disconnect(); // au cas où pour l'instant

//réveil du wifi
WiFi.forceSleepWake();
delay( 500 );
WiFi.mode( WIFI_STA);
}

void loop() {

 // on se connecte
connexion();


  // on éteint le wifi avant le deep-sleep  
  WiFi.mode( WIFI_OFF );
  WiFi.forceSleepBegin();
  yield();
  Serial.println("status après wifi off");
  Serial.println(WiFi.status());

  Serial.println("on entre en deep-sleep");
  ESP.deepSleep(0, WAKE_RF_DISABLED); //WAKE_RF_DISABLED // WAKE_RF_DEFAULT
  

}

Bonjour

je ne suis pas certain de comprendre la démarche

la mise en sommeil profond (deep sleep) désactive presque tout dans l'ESP8266, radio WiFi inclue (seul continue à tourner le Compteur 'RTC' ), inutile de couper le WiFi avant de mettre en sommeil profond, ça n'apporte rien.

Au moment de mettre en sommeil profond on peut souhaiter avoir le comportement "pas de radio au prochain réveil ", c'est le rôle du paramètre WAKE_RF_DISABLED. Il est donc normal, dans ce cas , de se retrouver sans WiFi après ce réveil.

Attention donc au commentaire trompeur dans l'extrait de code ci dessous , la commande forceSleepWake() réveille l'ESP8266..... avec ou sans WiFi selon la consigne donnée à la mise en sommeil profond précédente !

//réveil du wifi

WiFi.forceSleepWake();

SI le but est d'obtenir la consommation minimale en mode sommeil profond et retrouver du WiFi au reveil il faut rester à WAKE_RF_DEFAULT, aucune autre option de réveil n'apportera une économie d'énergie pendant le sommeil profond. C'est du moins ce que j'ai constaté sur mes applications qui se reveillent toutes les 30' ou 60' et consomment moins de 100µA en sommeil profond (somme des courants dans l'ESP8266, la mémoire SPI Flash, l'interface UART/USB et le régulateur 3,3V).

Je n'ai jamais rencontré le 'deepsleep incomplet' que semble évoquer le second lien, phénomène peut être liè à une version particulière du SDK et de l'outil ESP8266 pour Arduino.

J'ai peut être eu de la chance, deepsleep() a toujours fonctionné pour moi conformément à la datasheet de l'ESP8266 et à la documentation des outils ESP8266 pour IDE Arduino , sources d'informations privilégiées avant d'aller piocher dans des tutos de qualité variable, vidéos, point de vues divers glanés içi ou là sur le Web.

Je ne vois que deux raisons à l'utilisation du WAKE_RF_DISABLED :
-activer le WiFI tous les n réveils (par exemple une mesure par heure, une connection WiFi par jour)
-différer l'activation du WiFi après le reveil pour profiter d'une étape préliminaire ou l'alimentation est faiblement bruitée (bon pour les mesures analogiques) avant d'activer le WiFI

Bonjour et merci pour les réponses.

Je me permets des remarques et questions complémentaires si tu/vous as/avez le temps.

  1. Le projet (pour ma maman !) :
    Recevoir sur son portable un sms quand du courrier est mis dans sa boite aux lettres.
    Je compte utiliser un capteur magnétique à lames fixé sur la boite avec un aimant fixé sur la plaque mobile.
    Lorsque l'on met du courrier, le capteur s'ouvre et donne l'info : courrier dans la boite.
    L'ensemble sera sur piles et c'est pourquoi je cherche la consommation minimale.

il faut rester à WAKE_RF_DEFAULT, aucune autre option de réveil n'apportera une économie d'énergie pendant le sommeil profond. C'est du moins ce que j'ai constaté sur mes applications qui se reveillent toutes les 30' ou 60' et consomment moins de 100µA en sommeil profond

2a) J'avais compris qu'en restant à WAKE_RF_DEFAULT, on consommait d'avantage en mode deepsleep et que la mise en off du Wifi avant le deepsleep permettait donc de descendre encore la conso et que WiFi.forceSleepWake(); remettait le wifi on.

2b) Quel type de module utilises-tu pour obtenir cette consommation ? (oui, je suis un peu perdu avec tout ce qui existe et les consommations des divers éléments).

En effet, d'après mes lectures sur Arduino et les vidéos de Andreas Spiess sur l'ESP8266 (le premier lien que je donnais où il explique que le régulateur de tension consomme et c'est pourquoi il utilisait un régulateur HT7333 qui est à faible intensité résiduelle), je me suis logiquement donc dit qu'une carte intégrée (NodeMcu) comportait moult éléments supplémentaires qui devait induire une consommation supplémentaire en deep_sleep.

Je pensais donc m'orienter vers une ESP-01 ou ESP-12 (car on trouve des cartes adaptatrices pour elles).
Peux-tu, svp, m'indiquer ce qui est le mieux et quel module je dois plutôt commander ?

Mes idées sur les consommations sont-elle grosso modo correctes ?

  1. Manière d'utiliser le capteur
    Boite aux lettres fermée, le capteur à lame est fermé.
    Quand on met du courrier, il s'ouvre.
    Or, la sortie de deepSleep se faisant en mettant le pin RST à GND.
    Il faut donc que j'inverse l'état logique.

Je pensais :

  • soit chercher un schéma électronique pour faire l'inversion (qui ne consomme rien lors du deepsleep);
  • soit mettre l'interrupteur magnétique sur la ligne d'alimentation (l'ouverture du contact puis sa re-fermeture provoquant le reset du module et l'envoi du sms avant le retour en deepSleep) ;
  • soit utiliser une interruption déclenchée par un changement d'état sur une broche (j'ai vu que ça existait mais je n'ai jamais fait).

Ces idées sont elles cohérentes ?
Y en-a-t-il une meilleur qu'une autre ?

Je ne vois que deux raisons à l'utilisation du WAKE_RF_DISABLED :
-activer le WiFI tous les n réveils (par exemple une mesure par heure, une connection WiFi par jour)

Par curiosité : comment réveille-t-on le Wifi si l'on a utilisé WAKE_RF_DISABLED ?
A part insérer dans un sketch vide une commande avec ESP.deepSleep(1, WAKE_RF_DEFAULT); je n'ai pas trouvé d'autre manière.

  1. Si j'abuse : sur les tensions d'alimentations
    J'ai vu des montages alimentés par deux piles AA en se passant de régulateur de tension puisque les 3.3V n'étaient pas atteints.
    Or dans les datasheet, je trouve des tensions mini de 3V pour le ESP8266.
    J'ai mal vu ?
    Il faut au moins 3 accus NiMh (3*1.3 V = 3.9) avec un régulateur ?

Merci d'avance.

Bonsoir

réponse partielle rapide limitée aux questions relatives à la consommation en sommeil profond

2a) deepsleep(), quelque soit le paramètre passé pour le réveil permet d'obtenir la consommation minimale .

2b) Je n'utilise plus que des modules Wemos D1 mini et D1 mini pro (après les ESP-01, puis ESP-03 et ESP-12)
C'est avec un D1 mini non modifié que j'obtiens la consommation annoncée dans mon message (environ 100µA) . Le régulateur 'low drop' 3,3V de ce module me parait satisfaisant au vu de l'intensité qu'il peut fournir, de la faible tension de déchet, de sa faible consommation, de sa désactivation possible.

Sans puce d'interface USB, sans régulateur, sans leds il est bien entendu possible d'aller vers les 50µA. dans ce cas j'alimente directement en 3**,2**V avec un accu LiFePo4. (testé avec un module ESP12 et un ESP-03).

Les 100µA me donnant l'autonomie de 5 à 6 mois suffisante je ne me casse plus la tête et prend tels quels le D1 Mini.

Ne pas oublier que l'autonomie est fortement impactée par la phase d'activité : sa durée, la puissance d'émission..... dans mon cas j'ai réduit à 16dB la puissance radio et je ne dépasse guère la seconde pour la durée de la phase active. (connection au point d'accès + mesure + requète a un serveur distant).

  1. Boite aux lettres métallique ? utiliser un module permettant de basculer sur une antenne déportée ....

  2. C'est également la seule manière (que je connaisse) pour réactiver le WiFi après un 'réveil sans radio' . Il en existe peut être d'autres.....

Bonjour

J'ai vu des montages alimentés par deux piles AA en se passant de régulateur de tension puisque les 3.3V n'étaient pas atteints.
Or dans les datasheet, je trouve des tensions mini de 3V pour le ESP8266.
J'ai mal vu ?
Il faut au moins 3 accus NiMh (3*1.3 V = 3.9) avec un régulateur ?

L'alimentation est probablement le point le plus souvent bâclé dans les réalisations présentées.
Le fonctionnement 'tombe en marche' quelques instants mais ne tient pas la route.

Eviter en effet d'alimenter l'ESP8266 en dessous de 3V, en particulier pendant les pics de courants WiFi.
La consommation en WiFi est irrégulière et présente des pics de courants de plus de 300mA.
Pendant ces pics la résistance interne de l'accu et le temps de réaction du régulateur engendrent des creux de tension. Il faut ménager une marge de sécurité pour s'assurer qu'on ne tombe pas en dessous de 3V pendant les pics de courant WiFi.

De ce point les 3 accus NiMh paraissent justes. En admettant que la tension 'de déchet' du régulateur ne dépasse pas 0,3V à 300mA., Le montage fonctionnera au début de la décharge des accus NiMh mais risque de cafouiller bien avant la décharge 'complète' de ceux-ci. Cafouiller içi c'est resetter et parfois redémarrer avec un mauvais rechargement du code à partir de la mémoire Flash SPI..... mauvais réveils d'un ESP8266 tiède qui ne répond plus et vide rapidement l'accu......

Par ailleurs les accus NiMh ont mauvaise réputation pour ce qui est de l'auto décharge.
Les quelque µA 'perdus' dans les composants additionnels d'un NodeMCU ou D1 Mini (ta préoccupation initiale) ne sont pas grand chose au regard du courant d'autodécharge qui sera déterminant pour l'autonomie.

La variété Sanyo ou Panasonic Eneloop est réputée pour sa faible autodécharge.

Bonjour,

Merci pour toutes ces explications et compléments.

J'ai commandé un D1 mini Pro (pas très répandu en fait) afin de pouvoir fixer une antenne déportée (je n'avais pas pensé à ça !). J'ai aussi pris un esp-07 pour avoir le plaisir de monter la carte et d'essayer.
Reste à attendre que ça arrive de Chine !

Pour éviter les creux de tension, je pensais utiliser (comme vu dans une vidéo de Spiess) un condensateur 1000 uF mis en sortie du régulateur.

Merci aussi pour la mise en relief avec l'auto-décharge des accus. Le LifePo4 serait intéressant mais le problème est le chargeur nécessaire que ma maman n'a pas.

Je vais du coup entamer le projet sur mon NodeMcu 12e en attendant.

Bon projet !!

Condensateur 1000µF : attention au revers, en technologie electrolytique le courant de fuite sera du même ordre de grandeur que le courant consommé par le montage par lui même en 'deep sleep'

Pas facile de trouver le compromis pour optimiser l'autonomie !!