ESP-MESH avec ESP32 et ESP8266 : Mise en route

ESP-MESH avec ESP32 et ESP8266 : Mise en route

Apprenez à utiliser le protocole réseau ESP-MESH pour créer un réseau maillé avec les cartes ESP32 et ESP8266 NodeMCU. ESP-MESH permet à plusieurs appareils (nœuds) de communiquer entre eux via un seul réseau local sans fil. Il est pris en charge sur les cartes ESP32 et ESP8266. Dans ce guide, nous allons vous montrer comment démarrer avec ESP-MESH en utilisant le noyau Arduino.

ESP-MESH avec ESP32 et ESP8266 : Mise en route

Cet article couvre les sujets suivants :

EDI Arduino

Si vous voulez programmer le ESP32 et ESP8266 cartes utilisant Arduino IDE, vous devez avoir installé les add-ons ESP32 ou ESP8266. Suivez les guides suivants :

Si vous souhaitez programmer l’ESP32/ESP8266 en utilisant VS Code + PlatformIO, suivez le tutoriel suivant :

Présentation ESP-MESH

En conséquence de la documentation Espressif :

« ESP-MESH est un protocole de réseau construit au-dessus du protocole Wi-Fi. ESP-MESH permet à de nombreux appareils (appelés nœuds) répartis sur une grande surface physique (à la fois à l’intérieur et à l’extérieur) d’être interconnectés sous un seul WLAN (Wireless Local-Area Network).

ESP-MESH s’auto-organise et s’auto-répare, ce qui signifie que le réseau peut être construit et maintenu de manière autonome. Pour plus d’informations, visitez le Documentation officielle ESP-MESH.

Architecture de réseau Wi-Fi traditionnelle

Dans une architecture de réseau Wi-Fi traditionnelle, un seul nœud (point d’accès – généralement le routeur) est connecté à tous les autres nœuds (stations). Chaque nœud peut communiquer entre eux à l’aide du point d’accès. Cependant, cela est limité à la couverture Wi-Fi du point d’accès. Chaque station doit être à portée pour se connecter directement au point d’accès. Cela ne se produit pas avec ESP-MESH.

Réseau Wi-Fi traditionnel ESP32 ESP8266

Architecture réseau ESP-MESH

Avec ESP-MESH, les nœuds n’ont pas besoin de se connecter à un nœud central. Les nœuds sont chargés de relayer les transmissions les uns des autres. Cela permet à plusieurs appareils de se répartir sur une grande surface physique. Les nœuds peuvent s’auto-organiser et se parler dynamiquement pour s’assurer que le paquet atteint sa destination de nœud finale. Si un nœud est supprimé du réseau, il est capable de s’auto-organiser pour s’assurer que les paquets atteignent leur destination.

Réseau ESP-MESH ESP32 ESP8266i

bibliothèque painlessMesh

Le bibliothèque painlessMesh nous permet de créer un réseau maillé avec les cartes ESP8266 ou/et ESP32 de manière simple.

«painlessMesh est un véritable réseau ad hoc, ce qui signifie qu’aucune planification, aucun contrôleur central ou routeur n’est requis. Tout système d’un ou plusieurs nœuds s’auto-organisera en un maillage entièrement fonctionnel. La taille maximale du maillage est limitée (nous pensons) par la quantité de mémoire dans le tas qui peut être allouée au tampon de sous-connexions et devrait donc être vraiment assez élevée. Plus d’informations sur la bibliothèque painlessMesh.

Installation de la bibliothèque PainlessMesh

Vous pouvez installer painlessMesh via le gestionnaire de bibliothèque Arduino. Accédez à Outils > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir.

Recherchez « painlessmesh » et installez la bibliothèque. Nous utilisons la version 1.4.5

Installer la bibliothèque painlessMesh Arduino IDE

Cette bibliothèque a besoin d’autres dépendances de bibliothèque. Une nouvelle fenêtre devrait apparaître vous demandant d’installer les dépendances manquantes. Sélectionnez « Tout installer ».

Installer les dépendances de la bibliothèque painlessmesh Arduino IDE

Si cette fenêtre ne s’affiche pas, vous devrez installer les dépendances de bibliothèque suivantes :

Si vous utilisez PlatformIO, ajoutez les lignes suivantes au fichier platformio.ini pour ajouter les bibliothèques et modifier la vitesse du moniteur.

Pour l’ESP32 :

monitor_speed = 115200
lib_deps = painlessmesh/painlessMesh @ ^1.4.5
    ArduinoJson
    arduinoUnity
    TaskScheduler
    AsyncTCP

Pour l’ESP8266 :

monitor_speed = 115200
lib_deps = painlessmesh/painlessMesh @ ^1.4.5
    ArduinoJson
    TaskScheduler
    ESPAsyncTCP

Exemple de base ESP-MESH (messages de diffusion)

Pour commencer avec ESP-MESH, nous allons d’abord expérimenter avec l’exemple de base de la bibliothèque. Cet exemple crée un réseau maillé dans lequel toutes les cartes diffusent des messages à toutes les autres cartes.

Nous avons expérimenté cet exemple avec quatre cartes (deux ESP32 et deux ESP8266). Vous pouvez ajouter ou supprimer des tableaux. Le code est compatible avec les cartes ESP32 et ESP8266.

Exemple de base ESP-MESH painlessMesh ESP32 ESP8266

Code – exemple de base de la bibliothèque painlessMesh

Copiez le code suivant dans votre IDE Arduino (code des exemples de la bibliothèque). Le code est compatible avec les cartes ESP32 et ESP8266.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/esp-mesh-esp32-esp8266-painlessmesh/
  
  This is a simple example that uses the painlessMesh library: https://github.com/gmag11/painlessMesh/blob/master/examples/basic/basic.ino
*/

#include "painlessMesh.h"

#define   MESH_PREFIX     "whateverYouLike"
#define   MESH_PASSWORD   "somethingSneaky"
#define   MESH_PORT       5555

Scheduler userScheduler; // to control your personal task
painlessMesh  mesh;

// User stub
void sendMessage() ; // Prototype so PlatformIO doesn't complain

Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );

void sendMessage() {
  String msg = "Hi from node1";
  msg += mesh.getNodeId();
  mesh.sendBroadcast( msg );
  taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}

// Needed for painless library
void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}

void newConnectionCallback(uint32_t nodeId) {
    Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

void nodeTimeAdjustedCallback(int32_t offset) {
    Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

void setup() {
  Serial.begin(115200);

//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
  mesh.setDebugMsgTypes( ERROR | STARTUP );  // set before init() so that you can see startup messages

  mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
  mesh.onReceive(&receivedCallback);
  mesh.onNewConnection(&newConnectionCallback);
  mesh.onChangedConnections(&changedConnectionCallback);
  mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

  userScheduler.addTask( taskSendMessage );
  taskSendMessage.enable();
}

void loop() {
  // it will run the user scheduler as well
  mesh.update();
}

Afficher le code brut

Avant de télécharger le code, vous pouvez configurer les variables MESH_PREFIX (c’est comme le nom du réseau MESH) et les variables MESH_PASSWORD (vous pouvez le définir comme vous le souhaitez).

Ensuite, nous vous recommandons de modifier la ligne suivante pour chaque carte afin d’identifier facilement le nœud qui a envoyé le message. Par exemple, pour le nœud 1, modifiez le message comme suit :

String msg = "Hi from node 1 ";

Comment fonctionne le code

Commencez par inclure la bibliothèque painlessMesh.

#include "painlessMesh.h"

Détails MAILLE

Ensuite, ajoutez les détails du maillage. Le MESH_PREFIX fait référence au nom du maillage. Vous pouvez le changer en ce que vous voulez.

#define MESH_PREFIX "whateverYouLike"

Le MESH_PASSWORD, comme son nom l’indique, est le mot de passe du maillage. Vous pouvez le changer en ce que vous voulez.

#define MESH_PASSWORD "somethingSneaky"

Tous les nœuds du maillage doivent utiliser les mêmes MESH_PREFIX et MESH_PASSWORD.

MESH_PORT fait référence au port TCP sur lequel vous souhaitez que le serveur maillé s’exécute. La valeur par défaut est 5555.

#define MESH_PORT 5555

Planificateur

Il est recommandé d’éviter d’utiliser delay() dans le code du réseau maillé. Pour maintenir le maillage, certaines tâches doivent être effectuées en arrière-plan. L’utilisation de delay() empêchera ces tâches de se produire et peut entraîner la perte de stabilité/l’effondrement du maillage.

Au lieu de cela, il est recommandé d’utiliser TaskScheduler pour exécuter vos tâches qui sont utilisées dans painlessMesh lui-même.

La ligne suivante crée un nouveau planificateur appelé userScheduler.

Scheduler userScheduler; // to control your personal task

maille indolore

Créez un objet painlessMesh appelé mesh pour gérer le réseau maillé.

Créer des tâches

Créez une tâche appelée taskSendMessage chargée d’appeler la fonction sendMessage() toutes les secondes tant que le programme est en cours d’exécution.

Task taskSendMessage(TASK_SECOND * 1 , TASK_FOREVER, &sendMessage);

Envoyer un message au maillage

La fonction sendMessage() envoie un message à tous les nœuds du réseau de messagerie (diffusion).

void sendMessage() {
  String msg = "Hi from node 1";
  msg += mesh.getNodeId();
  mesh.sendBroadcast( msg );
  taskSendMessage.setInterval(random(TASK_SECOND * 1, TASK_SECOND * 5));
}

Le message contient le texte « Hi from node 1 » suivi de l’ID de la puce de la carte.

String msg = "Hi from node 1";
msg += mesh.getNodeId();

Pour diffuser un message, utilisez simplement la méthode sendBroadcast() sur l’objet mesh et passez en argument le message (msg) que vous souhaitez envoyer.

mesh.sendBroadcast(msg);

Chaque fois qu’un nouveau message est envoyé, le code modifie l’intervalle entre les messages (une à cinq secondes).

taskSendMessage.setInterval(random(TASK_SECOND * 1, TASK_SECOND * 5));

Fonctions de rappel de maillage

Ensuite, plusieurs fonctions de rappel sont créées et seront appelées lorsque des événements spécifiques se produisent sur le maillage.

La fonction receiveCallback() imprime l’expéditeur du message (from) et le contenu du message (msg.c_str()).

void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}

La fonction newConnectionCallback() s’exécute chaque fois qu’un nouveau nœud rejoint le réseau. Cette fonction imprime simplement l’ID de puce du nouveau nœud. Vous pouvez modifier la fonction pour effectuer toute autre tâche.

void newConnectionCallback(uint32_t nodeId) {
  Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

La fonction modifiedConnectionCallback() s’exécute chaque fois qu’une connexion change sur le réseau (lorsqu’un nœud rejoint ou quitte le réseau).

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

La fonction nodeTimeAdjustedCallback() s’exécute lorsque le réseau ajuste l’heure, afin que tous les nœuds soient synchronisés. Il imprime le décalage.

void nodeTimeAdjustedCallback(int32_t offset) {
  Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

installation()

Dans le setup(), initialisez le moniteur série.

void setup() {
  Serial.begin(115200);

Choisissez les types de messages de débogage souhaités :

//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on

mesh.setDebugMsgTypes( ERROR | STARTUP );  // set before init() so that you can see startup messages

Initialisez le maillage avec les détails définis précédemment.

mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);

Affectez toutes les fonctions de rappel à leurs événements correspondants.

mesh.onReceive(&receivedCallback);
mesh.onNewConnection(&newConnectionCallback);
mesh.onChangedConnections(&changedConnectionCallback);
mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

Enfin, ajoutez la fonction taskSendMessage au userScheduler. Le planificateur est responsable de la gestion et de l’exécution des tâches au bon moment.

userScheduler.addTask(taskSendMessage);

Enfin, activez la tâcheSendMessage, afin que le programme commence à envoyer les messages au maillage.

taskSendMessage.enable();

Pour que le maillage continue de fonctionner, ajoutez mesh.update() à la boucle().

void loop() {
  // it will run the user scheduler as well
  mesh.update();
}

Manifestation

Téléchargez le code fourni à tous vos tableaux. N’oubliez pas de modifier le message pour identifier facilement le noeud expéditeur

Avec les cartes connectées à votre ordinateur, ouvrez une connexion série avec chaque carte. Vous pouvez utiliser le Serial Monitor, ou vous pouvez utiliser un logiciel comme Mastic et ouvrez plusieurs fenêtres pour tous les tableaux.

Vous devriez voir que tous les tableaux reçoivent les messages les uns des autres. Par exemple, ce sont les messages reçus par le nœud 1. Il reçoit les messages des nœuds 2, 3 et 4.

Exemple de base ESP-MESH 4 cartes Arduino Serial Monitor

Vous devriez également voir d’autres messages lorsqu’il y a des changements sur le maillage : lorsqu’une carte quitte ou rejoint le réseau.

Exemple de base ESP MESH Connexions modifiées du moniteur série

Échanger les lectures de capteur à l’aide d’ESP-MESH

Dans cet exemple suivant, nous allons échanger les lectures des capteurs entre 4 cartes (vous pouvez utiliser un nombre différent de cartes). Chaque conseil reçoit les relevés des autres conseils.

ESP-MESH Exchange BME280 Lectures des capteurs ESP32 ESP8266

Par exemple, nous échangerons les relevés de capteur d’un Capteur BME280mais vous pouvez utiliser n’importe quel autre capteur.

Pièces requises

Voici les pièces nécessaires pour cet exemple :

Bibliothèque Arduino_JSON

Dans cet exemple, nous échangerons les lectures des capteurs au format JSON. Pour faciliter la gestion des variables JSON, nous utiliserons le Bibliothèque Arduino_JSON.

Vous pouvez installer cette bibliothèque dans le gestionnaire de bibliothèque Arduino IDE. Accédez simplement à Sketch > Inclure la bibliothèque > Gérer les bibliothèques et recherchez le nom de la bibliothèque comme suit :

Installer la bibliothèque Arduino JSON Arduino IDE

Si vous utilisez VS Code avec PlatformIO, incluez les bibliothèques dans le fichier platformio.ini comme suit :

ESP32

monitor_speed = 115200
lib_deps = painlessmesh/painlessMesh @ ^1.4.5
    ArduinoJson
    arduinoUnity
    AsyncTCP
    TaskScheduler
    adafruit/Adafruit Unified Sensor @ ^1.1.4
    adafruit/Adafruit BME280 Library @ ^2.1.2
    arduino-libraries/Arduino_JSON @ ^0.1.0

ESP8266

monitor_speed = 115200
lib_deps = painlessmesh/painlessMesh @ ^1.4.5
    ArduinoJson
    TaskScheduler
    ESPAsyncTCP
    adafruit/Adafruit Unified Sensor @ ^1.1.4
    adafruit/Adafruit BME280 Library @ ^2.1.2
    arduino-libraries/Arduino_JSON @ ^0.1.0

Schéma

Câblez le capteur BME280 aux broches I2C par défaut ESP32 ou ESP8266 comme indiqué dans les schémas suivants.

ESP32

Circuit de schéma de câblage de pression d'humidité de capteur ESP32 BME280

Lecture recommandée : ESP32 avec capteur BME280 utilisant Arduino IDE (pression, température, humidité)

ESP8266 NodeMCU

ESP8266 NodeMCU BME280 Capteur Température Humidité Pression Schéma de câblage Circuit

Lecture recommandée : ESP8266 avec BME280 utilisant Arduino IDE (pression, température, humidité)

Code – Lectures du capteur de diffusion ESP-MESH

Téléchargez le code suivant sur chacun de vos tableaux. Ce code lit et diffuse les relevés actuels de température, d’humidité et de pression sur toutes les cartes du réseau maillé. Les lectures sont envoyées sous forme de chaîne JSON qui contient également le numéro de nœud pour identifier la carte émettrice.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/esp-mesh-esp32-esp8266-painlessmesh/
  
  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 <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "painlessMesh.h"
#include <Arduino_JSON.h>

// MESH Details
#define   MESH_PREFIX     "RNTMESH" //name for your MESH
#define   MESH_PASSWORD   "MESHpassword" //password for your MESH
#define   MESH_PORT       5555 //default port

//BME object on the default I2C pins
Adafruit_BME280 bme;

//Number for this node
int nodeNumber = 2;

//String to send to other nodes with sensor readings
String readings;

Scheduler userScheduler; // to control your personal task
painlessMesh  mesh;

// User stub
void sendMessage() ; // Prototype so PlatformIO doesn't complain
String getReadings(); // Prototype for sending sensor readings

//Create tasks: to send messages and get readings;
Task taskSendMessage(TASK_SECOND * 5 , TASK_FOREVER, &sendMessage);

String getReadings () {
  JSONVar jsonReadings;
  jsonReadings["node"] = nodeNumber;
  jsonReadings["temp"] = bme.readTemperature();
  jsonReadings["hum"] = bme.readHumidity();
  jsonReadings["pres"] = bme.readPressure()/100.0F;
  readings = JSON.stringify(jsonReadings);
  return readings;
}

void sendMessage () {
  String msg = getReadings();
  mesh.sendBroadcast(msg);
}

//Init BME280
void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }  
}

// Needed for painless library
void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("Received from %u msg=%s\n", from, msg.c_str());
  JSONVar myObject = JSON.parse(msg.c_str());
  int node = myObject["node"];
  double temp = myObject["temp"];
  double hum = myObject["hum"];
  double pres = myObject["pres"];
  Serial.print("Node: ");
  Serial.println(node);
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println(" C");
  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.println(" %");
  Serial.print("Pressure: ");
  Serial.print(pres);
  Serial.println(" hpa");
}

void newConnectionCallback(uint32_t nodeId) {
  Serial.printf("New Connection, nodeId = %u\n", nodeId);
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

void nodeTimeAdjustedCallback(int32_t offset) {
  Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

void setup() {
  Serial.begin(115200);
  
  initBME();

  //mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
  mesh.setDebugMsgTypes( ERROR | STARTUP );  // set before init() so that you can see startup messages

  mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );
  mesh.onReceive(&receivedCallback);
  mesh.onNewConnection(&newConnectionCallback);
  mesh.onChangedConnections(&changedConnectionCallback);
  mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

  userScheduler.addTask(taskSendMessage);
  taskSendMessage.enable();
}

void loop() {
  // it will run the user scheduler as well
  mesh.update();
}

Afficher le code brut

Le code est compatible avec les cartes ESP32 et ESP8266.

Comment fonctionne le code

Continuez à lire cette section pour savoir comment fonctionne le code.

Bibliothèques

Commencez par inclure les bibliothèques requises : Adafruit_Sensor et Adafruit_BME280 pour s’interfacer avec le capteur BME280 ; la bibliothèque painlessMesh pour gérer le réseau maillé et Arduino_JSON pour créer et gérer facilement les chaînes JSON.

#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "painlessMesh.h"
#include <Arduino_JSON.h>

Détails en maille

Insérez les détails du maillage dans les lignes suivantes.

#define MESH_PREFIX    "RNTMESH" //name for your MESH
#define MESH_PASSWORD  "MESHpassword" //password for your MESH
#define MESH_PORT      5555 //default port

Le MESH_PREFIX fait référence au nom du maillage. Vous pouvez le changer en ce que vous voulez. Le MESH_PASSWORD, comme son nom l’indique, est le mot de passe du maillage. Vous pouvez le changer en ce que vous voulez. Tous les nœuds du maillage doivent utiliser les mêmes MESH_PREFIX et MESH_PASSWORD.

MESH_PORT fait référence au port TCP sur lequel vous souhaitez que le serveur maillé s’exécute. La valeur par défaut est 5555.

BME280

Créez un objet Adafruit_BME280 appelé bme sur les broches ESP32 ou ESP8266 par défaut.

Adafruit_BME280 bme;

Dans la variable nodeNumber, insérez le numéro de nœud de votre carte. Il doit s’agir d’un numéro différent pour chaque carte.

int nodeNumber = 2;

La variable lectures sera utilisée pour enregistrer les lectures à envoyer aux autres cartes.

String readings;

Planificateur

La ligne suivante crée un nouveau planificateur appelé userScheduler.

Scheduler userScheduler; // to control your personal task

maille indolore

Créez un objet painlessMesh appelé mesh pour gérer le réseau maillé.

Créer des tâches

Créez une tâche appelée taskSendMessage chargée d’appeler la fonction sendMessage() toutes les cinq secondes tant que le programme est en cours d’exécution.

Task taskSendMessage(TASK_SECOND * 5 , TASK_FOREVER, &sendMessage);

getLectures()

La fonction getReadings() obtient les lectures de température, d’humidité et de pression du capteur BME280 et concatène toutes les informations, y compris le numéro de nœud sur une variable JSON appelée jsonReadings.

JSONVar jsonReadings;
jsonReadings["node"] = nodeNumber;
jsonReadings["temp"] = bme.readTemperature();
jsonReadings["hum"] = bme.readHumidity();
jsonReadings["pres"] = bme.readPressure()/100.0F;

La ligne suivante montre la structure de la variable jsonReadings avec des valeurs arbitraires.

{
  "node":2,
  "temperature":24.51,
  "humidity":52.01,
  "pressure":1005.21
}

La variable jsonReadings est ensuite convertie en chaîne JSON à l’aide de la méthode stringify() et enregistrée sur la variable readings.

readings = JSON.stringify(jsonReadings);

Cette variable est ensuite retournée par la fonction.

return readings;

Envoyer un message au maillage

La fonction sendMessage() envoie la chaîne JSON avec les lectures et le numéro de nœud (getReadings()) à tous les nœuds du réseau (diffusion).

void sendMessage () {
  String msg = getReadings();
  mesh.sendBroadcast(msg);
}

Initialiser le capteur BME280

La fonction initBME() initialise le capteur BME280.

void initBME(){
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

Fonctions de rappel de maillage

Ensuite, plusieurs fonctions de rappel sont créées et seront appelées lorsqu’un événement sur le maillage se produit.

La fonction receiveCallback() imprime l’expéditeur du message (from) et le contenu du message (msg.c_str()).

void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());

Le message est au format JSON, nous pouvons donc accéder aux variables comme suit :

JSONVar myObject = JSON.parse(msg.c_str());
int node = myObject["node"];
double temp = myObject["temp"];
double hum = myObject["hum"];
double pres = myObject["pres"];

Enfin, imprimez toutes les informations sur le Serial Monitor.

Serial.print("Node: ");
Serial.println(node);
Serial.print("Temperature: ");
Serial.print(temp);
Serial.println(" C");
Serial.print("Humidity: ");
Serial.print(hum);
Serial.println(" %");
Serial.print("Pressure: ");
Serial.print(pres);
Serial.println(" hpa");

La fonction newConnectionCallback() s’exécute chaque fois qu’un nouveau nœud rejoint le réseau. Cette fonction imprime simplement l’ID de puce du nouveau nœud. Vous pouvez modifier la fonction pour effectuer toute autre tâche.

void newConnectionCallback(uint32_t nodeId) {
  Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

La fonction modifiedConnectionCallback() s’exécute chaque fois qu’une connexion change sur le réseau (lorsqu’un nœud rejoint ou quitte le réseau).

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

La fonction nodeTimeAdjustedCallback() s’exécute lorsque le réseau ajuste l’heure, afin que tous les nœuds soient synchronisés. Il imprime le décalage.

void nodeTimeAdjustedCallback(int32_t offset) {
  Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

installation()

Dans le setup(), initialisez le moniteur série.

void setup() {
  Serial.begin(115200);

Appelez la fonction initBME() pour initialiser le capteur BME280.

initBME();

Choisissez les types de messages de débogage souhaités :

//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on

mesh.setDebugMsgTypes( ERROR | STARTUP );  // set before init() so that you can see startup messages

Initialisez le maillage avec les détails définis précédemment.

mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);

Affectez toutes les fonctions de rappel à leurs événements correspondants.

mesh.onReceive(&receivedCallback);
mesh.onNewConnection(&newConnectionCallback);
mesh.onChangedConnections(&changedConnectionCallback);
mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

Enfin, ajoutez la fonction taskSendMessage au userScheduler. Le planificateur est responsable de la gestion et de l’exécution des tâches au bon moment.

userScheduler.addTask(taskSendMessage);

Enfin, activez la tâcheSendMessage, afin que le programme commence à envoyer les messages au maillage.

taskSendMessage.enable();

Pour que le maillage continue de fonctionner, ajoutez mesh.update() à la boucle().

void loop() {
  // it will run the user scheduler as well
  mesh.update();
}

Manifestation

Après avoir téléchargé le code sur tous vos tableaux (chaque tableau avec un numéro de nœud différent), vous devriez voir que chaque tableau reçoit les messages des autres tableaux.

La capture d’écran suivante montre les messages reçus par le nœud 1. Il reçoit les lectures des capteurs des nœuds 2, 3 et 4.

ESP-MESH Exchange BME280 Sensor Readings ESP32 ESP8266 Serial Monitor f

Conclusion

Nous espérons que cette introduction rapide au protocole réseau ESP-MESH vous a plu. Vous pouvez jeter un oeil à la bibliothèque painlessMesh pour plus d’exemples.

Nous avons l’intention de créer plus de tutoriels sur ce sujet dans un futur proche. Alors, écrivez vos suggestions dans la section des commentaires.

Vous aimerez aussi les articles suivants :

Apprenez-en plus sur l’ESP32 et l’ESP8266 avec nos ressources :

Merci d’avoir lu.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

YouTube video

  • AZDelivery 3 x NodeMCU Amica Module V2 ESP8266 ESP-12F Carte de Développement WiFi WiFi avec CP2102 Compatible avec Arduino incluant Un E-Book!
    ✅ La carte de développement Nodemcu V2 Amica ESP8266 est équipée d'un puissant microcontrôleur ESP6266 (ESP-12F) avec 802.11 b / g / n WLAN et antenne 25dBm intégrée. ✅ Cette carte de développement wifi vous permet un prototypage confortable par simple programmation via un code Lua-Script et une construction optimisée pour la carte à pain (pas de 23 mm). ✅ Grâce à ses dimensions (L 48 mm x l 26 mm x H 13 mm), NodeMcu V2 WiFi Amica ESP8266 ESP-12E est une carte de développement parfaitement conçue qui ne nécessite aucune soudure en raison de sa forme compatible. ✅ AZ-Delivery ESP8266 avec wifi possède de puissantes capacités de stockage et de traitement embarquées qui lui permettent d'être intégré avec des capteurs et des dispositifs spécifiques aux applications et de supporter une charge minimale pendant le temps de fonctionnement. ✅ Ce produit inclut un E-Book qui fournit des informations utiles sur la façon de commencer votre projet. Il permet une installation rapide et fait gagner du temps sur le processus de configuration. On y trouve une série d'exemples d'applications, des guides d'installation complets et des bibliothèques.