fbpixel
Étiquettes : ,

Le NodeMCU ESP32 est un petit microcontrôleur possédant une puce Wifi. Il est possible d’établir une communication entre deux ESP32, lorsqu’ils utilisent le même réseau. Dans ce tutoriel, nous allons voir une architecture avec deux NodeMCU qui vont échanger des données via le protocole UDP.

Si vous n’avez pas accès à un deuxième ESP32, vous pouvez tester la communication avec le logiciel Packet Sender.

Matériel

  • Ordinateur
  • NodeMCU ESP32 x2 ou plus
  • Câble USB A Mâle/Micro B Mâle x2

Code ESP32 UDP Server

Pour le microcontrôleur Server, nous allons créer un serveur pour gérer les requêtes provenant des microcontrôleurs client. nous utilisons la librairie WiFi.h qui permet la gestion de la puce WiFi pour les cartes ESP32 et la librairie WiFiUdp.h qui permet de gérer les requêtes UDP.

N.B.: N’oubliez pas de modifier les valeurs de ssid et password, par le nom et le mot de passe du réseau wifi que vous souhaitez utiliser

#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char *ssid = "**********";
const char *password = "**********";

void setup() {
  Serial.begin(115200);
  // Connect to Wifi network.
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(F("."));
  }
  udp.begin(localPort);
  Serial.printf("UDP server : %s:%i \n", WiFi.localIP().toString().c_str(), localPort);
}

void loop() {
  int packetSize = udp.parsePacket();
  Serial.print(" Received packet from : "); Serial.println(udp.remoteIP());
  Serial.print(" Size : "); Serial.println(packetSize);
  if (packetSize) {
    int len = udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len - 1] = 0;
    Serial.printf("Data : %s\n", packetBuffer);
    udp.beginPacket(udp.remoteIP(), udp.remotePort());
    udp.printf("UDP packet was received OK\r\n");
    udp.endPacket();
  }
  Serial.println("\n");
  delay(500);
  Serial.print("[Server Connected] ");
  Serial.println (WiFi.localIP());
}

Une fois le code chargé, vous pouvez récupérer l’adresse IP et le port de la carte serveur dans le moniteur série pour la copier dans le code client (ici, 192.168.1.97:9999)

Code ESP32 UDP Client

Dans le code client, nous allons nous connecter au serveur en utilisant l’adresse IP précédemment utilisée (ici 192.168.1.97)

N.B.: N’oubliez pas de modifier et d’utiliser les mêmes valeurs de ssid et password que dans le module Serveur afin que les deux cartes ESP32 se connectent au même réseau.

#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char *ssid = "******";
const char *password = "********";

void setup() {
  Serial.begin(115200);
  // Connect to Wifi network.
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(F("."));
  }
  udp.begin(localPort);
  Serial.printf("UDP Client : %s:%i \n", WiFi.localIP().toString().c_str(), localPort);
}

void loop() {
  int packetSize = udp.parsePacket();
  Serial.print(" Received packet from : "); Serial.println(udp.remoteIP());
  Serial.print(" Size : "); Serial.println(packetSize);
  if (packetSize) {
    int len = udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len - 1] = 0;
    Serial.printf("Data : %s\n", packetBuffer);
  }
  Serial.println("\n");
  delay(500);
  Serial.print("[Client Connected] ");
  Serial.println(WiFi.localIP());
  udp.beginPacket("192.168.1.97", localPort);
  udp.printf("Send millis: ");
  char buf[20];
  unsigned long testID = millis();
  sprintf(buf, "%lu", testID);
  udp.printf(buf);
  udp.printf("\r\n");
  udp.endPacket();
}

N.B.: Dans cet exemple, le port utilisé sur le client est le même que le port du serveur. Ces valeurs peuvent être différentes.

Résultat

Lorsque les microcontrôleurs se connectent au Wifi et que la communication entre les deux ESP32 est établie, nous pouvons voir que des informations s’échangent entre les deux cartes. Il est alors possible de piloter un appareil connecté au client à partir du serveur ou inversement.

esp32-udp-result-server Communication entre deux ESP32 via UDP
esp32-udp-result-client Communication entre deux ESP32 via UDP

Applications

  • Créer un réseau de NodeMCU Esp32 pour gérer différents appareils ou capteurs

Sources