Le NodeMCU ESP8266 est un petit microcontrôleur possédant une puce Wifi. Il est possible d’établir une communication entre deux ESP8266, 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 ESP8266, vous pouvez tester la communication avec le logiciel Packet Sender.
Matériel
- Ordinateur
- NodeMCU ESP8266 x2 ou plus
- Câble USB A Mâle/Micro B Mâle x2
Code ESP8266 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 ESP8266WiFi.h qui permet la gestion de la puce WiFi pour les cartes ESP8266 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 <ESP8266WiFi.h> #include <WiFiUdp.h> WiFiUDP udp; char packetBuffer[255]; unsigned int localPort = 9999; const char *ssid = "******"; const char *password = "******"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); udp.begin(localPort); Serial.print(F("UDP Server : ")); Serial.println(WiFi.localIP()); } void loop() { int packetSize = udp.parsePacket(); Serial.print(" Received packet from : "); Serial.println(udp.remoteIP()); Serial.print(" Size : "); Serial.println(packetSize); Serial.print(" Data : "); if (packetSize) { int len = udp.read(packetBuffer, 255); if (len > 0) packetBuffer[len - 1] = 0; Serial.print(packetBuffer); udp.beginPacket(udp.remoteIP(), udp.remotePort()); udp.write("UDP packet was received OK\r\n"); udp.endPacket(); } Serial.println("\n"); delay(500); Serial.print("[Server Connected] "); Serial.println (WiFi.localIP()); }
Code ESP8266 UDP Client
Dans le code client, nous allons nous connecter au serveur en utilisant l’adresse IP précédemment utilisée.
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 ESP8266 se connectent au même réseau.
#include <ESP8266WiFi.h> #include <WiFiUdp.h> WiFiUDP udp; char packetBuffer[255]; unsigned int localPort = 9999; const char *ssid = "********"; const char *password = "***********"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); udp.begin(localPort); Serial.print(F("UDP Client : ")); Serial.println(WiFi.localIP()); } void loop() { int packetSize = udp.parsePacket(); Serial.print(" Received packet from : "); Serial.println(udp.remoteIP()); Serial.print(" Size : "); Serial.println(packetSize); Serial.print(" Data : "); if (packetSize) { int len = udp.read(packetBuffer, 255); if (len > 0) packetBuffer[len - 1] = 0; Serial.print(packetBuffer); } Serial.println("\n"); delay(500); Serial.print("[Client Connected] "); Serial.println(WiFi.localIP()); udp.beginPacket("192.168.1.94", 9999); udp.write("Send millis: "); char buf[20]; unsigned long testID = millis(); sprintf(buf, "%lu", testID); Serial.print(" Sent : "); Serial.println(buf); udp.write(buf); udp.write("\r\n"); udp.endPacket(); }
Résultat
Lorsque les microcontrôleurs se connectent au Wifi et que la communication entre les deux ESP8266 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 server ou inversement.
Applications
- Créer un réseau de NodeMCU Esp8266 pour gérer différents appareils ou capteurs