Communication espNOW avec ESP-01

Bonjour à tous,

oui, j'avais écrit que je n'utiliserais plus de ESP-01 à l'avenir, mais j'en ai encore quelques-uns en marche, quand même!

Voici que je me questionne sur la non-réception de valeurs via espNOW par mon ESP-01
Ce dernier devrait recevoir des données depuis un ESP32-wroom distant de seulement 4 mètres (donc la distance n'est pas un enjeu), à l'intérieur de la même salle (donc pas d'enjeu de cloison ni même de meuble, car les deux micro-contrôleur sont près du plafond).

Le code de l'émetteur a été vérifié. À chaque envoi de données, il me retourne un message de « succès d'envoi ».

L'adresse MAC a été vérifiée, c'est bien vers le bon ESP-01 que Wroom émet.

Tout le blâme est porté, donc, par ESP-01.
J'ai recopié le code de Ruis Santos et n'en ai modifié que la structure de données pour la conformer à celle de l'émetteur et me retourner quelques informations de contrôle.
Voici ce code:

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

//Gestion des messages
struct VersAffichage {
  int genre;      //0: Changement à l'éclairage; 1: message à afficher; 2: heure
  int a;
  int b;
  int c;
  int d;
  int e;
};
VersAffichage interESP;

// Callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
  memcpy(&interESP, incomingData, sizeof(interESP));
  Serial.print("Bits reçus: ");
  Serial.print(len);
  Serial.print(", soit : \t");
  Serial.print(interESP.a);
  Serial.print("\t");
  Serial.print(interESP.b);
  Serial.print("\t");
  Serial.print(interESP.c);
  Serial.print("\t");
  Serial.print(interESP.d);
  Serial.print("\t");
  Serial.println(interESP.e);
  Serial.println();
}
 
void setup() {
  // Initialize Serial Monitor
  Serial.begin(115200);
  delay(500);
  Serial.println("Démarrage du test");
  delay(200);
  Serial.println("Démarrage du test");
  
  // 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;
  } else {
    Serial.println("ESPnow est bien démarré.");
  }
  
  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
  Serial.println("Le comportement de ESPnow a été défini.");
}

void loop() {
  
}

Or, ESP-01 ne reçoit rien, ne me retourne rien.
Voici le retour complet, après 10 minutes d'attente tandis que Wroom émet une fois par minute:

Démarrage du test
ESPnow est bien démarré.
Le comportement de ESPnow a été défini.

Pourtant, ce même code fonctionne entre un ESP32-AIthinker et un ESP-01.

Y a-t-il des versions de ESP-01 qui soient incompatibles avec espNOW ?
Si oui, comment savoir si le remplaçant sera compatible ou non ?
Trouvez-vous une erreur dans mon code ?

Merci à tous.

Bonne journée.

Il me semble me souvenir (tous les esp-01 à 07 sont au fond d’un tiroir ça fait des années que je ne les ai plus touchés ) que sur les ESP8266, le canal radio est celui actuellement configuré par le firmware Wi-Fi, avec un défaut fréquent au canal 1 sans doute alors que sur ESP32, le canal dépend souvent d’un Wi-Fi antérieur ou d’un réglage implicite différent..

Peut être essayez de forcer le canal à utiliser au niveau radio ?

Regardez wifi_set_channel() sur esp8266 et sur ESP32 essayez de mettre le même canal avec esp_wifi_set_channel();

à mettre juste après WiFi.mode(WIFI_STA) et avant esp_now_init.

Ce message ne prouve rien car tu ne testes pas le retour de esp_now_set_self_role() et esp_now_register_recv_cb() donc elles ont pu échouer.


A noter, j'ai fait une recherche dans l'API esp-now et je n'ai pas trouvé esp_now_set_self_role(). Voilà ce que me retourne l'IA de QWANT

esp_now_set_self_role

esp_now_set_self_role – fonction de l’API ESP‑NOW (ESP‑IDF)

Élément Description
Objet Définit le rôle du dispositif dans le réseau ESP‑NOW.
Rôles possibles ESP_NOW_ROLE_CONTROLLER : uniquement émetteur.
ESP_NOW_ROLE_SLAVE : uniquement récepteur.
ESP_NOW_ROLE_COMBO : émetteur + récepteur.
Prototype esp_err_t esp_now_set_self_role(esp_now_role_t role);
Paramètre role – valeur de type esp_now_role_t parmi les trois rôles ci‑dessus.
Valeur de retour ESP_OK si le rôle est appliqué avec succès.
ESP_ERR_INVALID_ARG si le rôle est invalide.
ESP_ERR_NOT_SUPPORTED si la fonction n’est pas supportée sur le matériel/firmware.
Remarque Depuis ESP‑IDF v4.2, la fonction est dépréciée ; le rôle est désormais géré automatiquement ou via d’autres API (ex. esp_now_init). Consultez la documentation officielle d’Espressif pour la version de l’SDK que vous utilisez.

Pour moi, ça prouve que l'affichage Serial.print fonctionne. C'est nécessaire parce qu'en production l'ESP-01 n'a pas de broches en nombre suffisant pour permettre l'affichage Serial. C'est donc important de m'assurer que Serial.print fonctionne afin d'éliminer une interprétation incorrecte du non-retour. Ma fonction de réception de données - en test - se base sur l'affichage Serial.print. En production, la même fonction devrait donc fonctionner correctement après avoir éliminé les affichage.

Ok, je tenterai de l'ôter. Je viens de tester une compilation de mon programme test et ça a été accepté sans la définition du rôle.

Le message "ESPnow est bien démarré." rempli cette fonction.

Le message "Le comportement de ESPnow a été défini." ne devrait être retourné que si le rôle et l'enregistrement du callback se sont bien déroulés et pour ça il faut tester ce que retourne ces 2 méthodes.

Bonjour à tous,

j'ai trouvé le problème et ça n'avait rien à voir avec ESP!
Dans le code de l'expéditeur, le « genre » n'était pas défini. Le receveur ayant besoin d'une valeur comprise entre 1 et 4 ne savait pas quoi faire avec un zéro ... il ne faisait donc rien. C'est du côté de l'expéditeur, donc que j'ai corrigé le problème.

Ah les petits détails, parfois!

Quoi qu'il en soit, cette révision de mon code a permis d'apporter d'autres améliorations.
Tout fonctionne bien.

Bonne soirée.