Problème de réveil avec deepsleep sur esp8266

Bonjour, suite à un projet d’alarme, j’ai voulu communiquer entre un esp8266(mini) (je le nommerais 1) et un autre esp8266(mini) (je le nommerais 2). L’un ferait office de serveur (1) en recevant les informations du deuxième (2) équipé d’un capteur HC SR 501. J’ai fait le choix d’utiliser ESP NOW qui est très pratique pour la transmission d’informations.

Suite au fonctionnement sur batterie de l’esp équipé du PIR (2), je souhaite le faire dormir quand l’alarme n’est pas activée… Pour cela, je désactive le wifi de l’esp (1). L’esp (2) ne pouvant plus communiquer avec lui, passe automatiquement en sommeil.

Cependant, quand je désactive le wifi de l’esp (1), l’esp(2) fait bien un sommeil de 10 sec comme écrit dans le code. Cependant, après son réveil, rien ne se passe… Pourtant, il est sensé redémarrer après ce deepsleep ! Je vous laisse voir le moniteur série où j’explique les différentes étapes.

Merci d’avance !

PS : L’esp (2) ne comporte pas encore le PIR. Je souhaite juste tester cette fonctionnalité de sommeil. C’est pour cela qu’il envoie toute les 2 secondes une information, et que le code ne comporte aucun pinMode en INPUT !

Moniteur série :

moniteur_serie|690x446

Code de l’esp (2) :

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-now-esp8266-nodemcu-arduino-ide/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.
  
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <espnow.h>

#define led 5

int statutdata;

// REPLACE WITH RECEIVER MAC Address
uint8_t broadcastAddress[] = {0xF4, 0xCF, 0xA2, 0xC7, 0xF6, 0x4E};

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message {
  bool e;
} struct_message;

// Create a struct_message called myData
struct_message myData;

unsigned long lastTime = 0;  
unsigned long timerDelay = 2000;  // send readings timer

void setup() {
  pinMode(led, OUTPUT);
  
  // Init Serial Monitor
  Serial.begin(115200);
 
  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}

// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Last Packet Send Status: ");
  if (sendStatus == 0){
    Serial.println("Delivery success");
  } else {
    Serial.println("Delivery fail");
    ESP.deepSleep(10 * 1000000, RF_CAL);
    Serial.println("Sommeil de 10 secondes enclenché");
  }
}

void loop() {
  if ((millis() - lastTime) > timerDelay) {
    myData.e = false;

    // Send message via ESP-NOW
    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

    if(OnDataSent) {
      digitalWrite(led, 1);
      delay(1000);
      digitalWrite(led, 0);
    }
    
    lastTime = millis();
  }
}

Oui , si et seulement si GPIO16 alias D0 est relié à RST ,

A la fin du temps imparti au deepsleep GPIO16/D0 passe à zéro
SI GPIO16/D0 est relié à RST son changement d’état relance l’ESP8266 (comme le ferait un appui sur le bouton reset) Au réveil le code démarre au niveau de setup()

(Avec l’ESP8266 le deepsleeep finit par un auto-reset, pas par une reprise du code là où on avait mis la puce en sommeil)

 ESP.deepSleep(10 * 1000000, RF_CAL);
    Serial.println("Sommeil de 10 secondes enclenché");

Avec ce code l’ESP8266 étant mis en sommeil juste avant on ne devrait pas voir apparaître "sommeil de 10 secondes’. Seules les lignes entre le

. . .
void setup() {
pinMode(led, OUTPUT);
. . .

du début et la mise en sommeil seront exécutées.

l’option RF_CAL est elle nécessaire ? elle produira à chaque réveil une re-calibration de la radio, opération qui accroît la dépense d’énergie pour un bénéfice incertain si la tension d’alimentation est stable.

Sur les vraies cartes Lolin/Wemos D1 Mini récentes un petit point de soudure entre deux pastilles permet d’effectuer cette liaison. Sur les copies je ne sais pas. Relier alors GPIO16 et RST par un fil ou une résistance de faible valeur (centaine d’ohm)

pont

Attention, relier d0 et rst est effectivement nécessaire pour le réveil après deepsleep, mais cela bloque le televersement d’un nouveau programme dans l’esp par la liaison série.
Il vaut donc mieux que cette liaison soit amovible.

Bonsoir @bricoleau

Sur une dizaine de cartes Lolin D1 MIni testées la liaison ‘zéro ohm’ permannente ne pose, en général, pas problème au flashage (cartes achetées sur la boutique en ligne Lolin/Wemos)

Sur 2 ou 3 de mes cartes (copies de D1 MIni) le problème se pose , résolu par liaison permanente d’une centaine d’ohm (réveil et flashage sont OK)

Selon leur provenance toutes les cartes D1 Mini n’ont pas les mêmes valeurs de composants dans la partie ‘auto flash’, et selon ces valeurs la liaison ‘zéro ohm’ entre GPIO16 et RST gêne ou pas le flashage

Bien entendu la liaison amovilble garantit les deux modes de fonctionnement !

je n’ai aucune carte type NodeMCU et ne sait ce qui peut éventuellement convenir en terme de liaison permanente entre RST et GPIO16 permanente

Ah bizarre
De mon côté, tous mes esp8266 proviennent aussi de la boutique en ligne lolin/wemos (modèle V3.1.0) et j’ai eu le problème de téléversement sur tous, dès lors que D0 et RST sont reliés.
Je t’avoue que je me suis pas posé beaucoup de questions, j’ai juste mis un cavalier sur la carte que j’enlève pour téléverser.

Merci pour toutes ces réponses !

toutes les expériences sont enrichissantes, l’essentiel est d’avoir des solutions à proposer dans tous les cas de figure !!

mon stock de cates achetées cez Lolin/Wemos est plus ancien : premier modèle sans numéro de version, version 2.3.0, puis 3.0.0 …depuis je n’approivisionne que de l’ESP32