Bonjour,
je tente de lier un ESP32-Wroom à plusieurs ESP-01.
Commençons par un seul ESP-01: celui qui gère un affichage MAX7219 pour en faire une horloge liée à un serveur NTP. Tout va bien chez lui. C’est donc dire que la communication wifi est bien activée et fonctionnelle.
D’autre part, j’ai mon ESP32-Wroom qui est agit comme chef d’orchestre. Il est destiné à pousser des infos à plusieurs autres ESP-01, en plus de celui mentionné ci-haut. Commençant par le commencement, j’y vais avec l’horloge.
Mon Wroom demande l’heure au ESP-01 et celui-ci doit retourner l’heure via communication esp_now. Puisque les deux doivent envoyer de l’info à l’autre, les deux sont configurés « Master » . J’ai suivi, en cela, les tutos (un pour ESP32, l’autre pour ESP8266) de ce site
Le problème n’est pas de faire fonctionner, mais de le faire fonctionner de manière stable. En l’état actuel, ça fonctionne une fois sur vingt environ. Je n’arrive pas à savoir dans quelles conditions ça fonctionne. J’ai essayé:
- alimenter le wroom en premier
- alimenter le ESP-01 en premier
- triple vérification des MAC
- redémarrer les deux micro-contrôleurs après un changement
- et bien d’autres choses
Voici les éléments pertinents du code Wroom
//Gestion de l'éclairage
struct Lignes {
String nom;
bool etat;
String RVB;
int R;
int V;
int B;
int stable;
uint8_t MAC[6];
String desc;
};
Lignes lignes[10] = {
{ "Panne", false, "FFFFFF", 0, 0, 0, 0, {0x94, 0x54, 0xC5, 0x72, 0xC5, 0xA4}, "Buttons" },
{ "Avant", false, "FFFFFF", 255, 255, 255, 0, {0x40, 0x91, 0x51, 0x52, 0x12, 0xB6}, "Avant" },
{ "Autel", false, "FFFFFF", 255, 255, 255, 0, {0x4C, 0x75, 0x25, 0x34, 0xA7, 0x89}, "Autel" },
{ "Lgn1a", false, "FFFFFF", 255, 255, 255, 0, {0x4C, 0x75, 0x25, 0x34, 0x71, 0x63}, "Ligne 1-A" },
{ "Lgn1b", false, "FFFFFF", 255, 255, 255, 0, {0x4C, 0x75, 0x25, 0x34, 0x71, 0x63}, "Ligne 1-B" },
{ "Lgn2a", false, "FFFFFF", 255, 255, 255, 0, {0x40, 0x91, 0x51, 0x51, 0xC1, 0x29}, "Ligne 2-A" },
{ "Lgn2b", false, "FFFFFF", 255, 255, 255, 0, {0x40, 0x91, 0x51, 0x52, 0x12, 0xB6}, "Ligne 2-B" },
{ "Lgn3a", false, "FFFFFF", 255, 255, 255, 0, {0x4C, 0x75, 0x25, 0x33, 0x7C, 0x08}, "Ligne 3" },
{ "Horlo", false, "FFFFFF", 255, 255, 255, 0, {0x4C, 0x75, 0x25, 0x33, 0xA1, 0xD6}, "Horloge_dansSalleReunion" },
{ "Psaum", false, "FFFFFF", 255, 255, 255, 0, {0x94, 0x54, 0xC5, 0x73, 0x83, 0x98}, "Psaumes" }
};
//Gestion des messages
struct VersAffichage {
int genre; //0: Changement à l'éclairage; 1: message à afficher; 2: heure reçue depuis ESP01 dans la fenêtre; 3: écran noir; 9: reset
char contenu[30];
int a;
int b;
int c;
int d;
int e;
};
VersAffichage versAffichage;
void calcueHeureACtu() {
versAffichage.genre = 2;
esp_now_send(lignes[8].MAC, (uint8_t *) &versAffichage, sizeof(versAffichage));
Serial.println("Requête envoyée au module Horloge");
affichonsHeure = true;
}
void Recevons(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&versAffichage, incomingData, sizeof(versAffichage));
Serial.print ("Nous sommes ici en ligne 185 avec ");
Serial.print ("le genre = ");
Serial.print (versAffichage.genre);
if (versAffichage.genre == 0) {
Serial.print ("Action portée sur éclairage avec ");
} else if (versAffichage.genre == 1) {
Serial.println("Changeons contenu affichage");
affichonsHeure = false;
affichageDEL();
} else if (versAffichage.genre == 2) {
Serial.print ("Recevons cette heure : ");
Serial.print (" : ");
Serial.print (versAffichage.a);
Serial.print (versAffichage.b);
Serial.print (":");
Serial.print (versAffichage.d);
Serial.println(versAffichage.e);
affichageDEL();
} else {
return;
}
}
void setup(void) {
WiFi.mode(WIFI_AP_STA); //Mode de fonctionnement: serveur (AP), non-fonctionnel en tant que « station » - client
WiFi.softAPConfig(APlocalIP, APgateway, APsousRes);
WiFi.softAP(APssid, APpwsd); //Point d'accès ... ceci servira aux ESP8266 satellites selon la syntaxe WiFi.softAP(ssid, pwsd);
Serial.print("Point d`accès a cette adresse : ");
Serial.println(WiFi.softAPIP());
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
Serial.print ("Mon adresse MAC : ");
Serial.println(WiFi.macAddress());
esp_now_register_recv_cb(esp_now_recv_cb_t(Recevons));
Serial.println("Lancement de la communication ESPnow");
if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW ne put être initialisé correctement. Oups!");
return;
}
Serial.println(WiFi.macAddress());
peerInfo.channel = 0;
peerInfo.encrypt = false;
for (int x=0; x<9; x++) {
memcpy(peerInfo.peer_addr, lignes[x].MAC, 6);
if (esp_now_add_peer(&peerInfo) != ESP_OK){ Serial.print("Échec avec peerInfo num "); Serial.println(x); } else { Serial.println(String(x) + " chargé."); }
}
}
Je prévois que vous direz … « ouais, mais t’as pas d’appel à la fonction calcueHeureACtu() », … oui, j’ai cet appel, mais ce n’est pas pertinent ici d’afficher comment puisque mon moniteur série affiche bien « Requête envoyée au module Horloge » lorsque vient son temps .
Voici ce que j’ai du côté du ESP-01
struct Lignes {
String nom;
bool etat;
String RVB;
int R;
int V;
int B;
int stable;
uint8_t MAC[6];
String desc;
};
Lignes lignes[1] = {
{ "Psaum", false, "FFFFFF", 255, 255, 255, 0, {0x94, 0x54, 0xC5, 0x73, 0x83, 0x98}, "Horloge_dansSalleReunion" }
};
//Gestion des messages
struct VersAffichage {
int genre; //0: Changement à l'éclairage; 1: message à afficher; 2: heure
char contenu[30];
int a;
int b;
int c;
int d;
int e;
};
VersAffichage versAffichage;
void DemandeRecue(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&versAffichage, incomingData, sizeof(versAffichage));
Serial.print ("Avons reçu : ");
Serial.println(versAffichage.genre);
if (versAffichage.genre == 1) {
affichons(0,12);
affichons(1, versAffichage.d);
affichons(2, versAffichage.c);
affichons(3, versAffichage.b);
horo = false;
} else if (versAffichage.genre == 2) {
versAffichage.genre = 2;
versAffichage.a = cetHre[3]/10;
versAffichage.b = cetHre[2];
versAffichage.c = 11;
versAffichage.d = cetHre[1]/10;
versAffichage.e = cetHre[0];
esp_now_send(lignes[0].MAC, (uint8_t *) &versAffichage, sizeof(versAffichage));
Serial.print ("Envoyons en retour: ");
Serial.print (versAffichage.genre);
Serial.print (" - ");
Serial.print (versAffichage.a);
Serial.print (versAffichage.b);
Serial.print (versAffichage.c);
Serial.print (versAffichage.d);
Serial.println(versAffichage.e);
}
}
void setup() {
if (esp_now_init() != 0) {
return;
}
// Define Send function
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_register_recv_cb(DemandeRecue);
esp_now_add_peer(lignes[0].MAC, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}
J’ai peut-être mis une commande en trop « esp_nom_set_self_role » que je ne vois pas dans la partie « communication bidi » du tuto. Mais c’est sans meilleur résultat (aucune communication entre les ESP ou - si une fois ou l’autre ça passe, c’est inexplicable).
On peut éliminer
- la distance, car mes deux ESP sont à environ 40 cm
- l’interférence, car chaque ESP est connecté en USB sur son propre ordinateur
- les confusion ESP8266 et ESP32 car j’ai vérifié cela 1000 fois et - de toutes façons - la compilation entraîne des messages d’erreur lorsque j’oublie cet élément, les bibliothèques étant différentes
