Communication entre deux ESP32

Ce tutoriel vous explique comment créer une connexion entre deux ESP32 via TCP/IP sur WiFi et échanger des données. Un ESP32 agit en tant que client TCP et l'autre en tant que serveur TCP. Nous apprenons également en détail à travers un exemple :

communication entre deux ESP32

Préparation du matériel

2×ESP-WROOM-32 Dev Module
2×Micro USB Cable
1×(Optional) DC Power Jack
1×Breadboard
1×Jumper Wires
1×(Recommended) ESP32 Screw Terminal Adapter

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

Communication entre deux ESP32 - Vue d'ensemble

Il existe de nombreuses manières de faire communiquer ESP32 #1 avec ESP32 #2. Selon la distance, nous pouvons choisir l'une des méthodes suivantes :

Methods Distance
SPI very short
I2C very short
UART (TTL) very short
UART (RS-232/485/422) short
Bluetooth short
LoRa long
WiFi unlimited(*)

※ NOTE THAT:

(*) :

  • Si nous connectons les deux ESP32 à Internet, la distance de communication est illimitée.
  • Si nous ne connectons pas les deux ESP32 à Internet, mais que nous les connectons au même réseau LAN, la distance de communication est limitée au réseau LAN.

Ce tutoriel va utiliser le WiFi pour la communication entre deux ESP32.

Communication entre deux ESP32 via WiFi

Deux ESP32 peuvent communiquer entre eux via le WiFi si :

  • Deux ESP32 dans le même réseau LAN. Ils n'ont pas besoin de se connecter à Internet.
  • Deux ESP32 dans des réseaux LAN différents. Ils doivent se connecter à Internet.

Il existe deux manières pour que deux ESP32 puissent communiquer entre eux.

  • Deux ESP32 communiquent directement l'un avec l'autre : un ESP32 est un client TCP, l'autre est un serveur TCP.
  • Deux ESP32 communiquent indirectement via un serveur centralisé (par exemple, un serveur MQTT) : les deux ESP32 sont des clients TCP. Voir le tutoriel Communication ESP32 à ESP32 via MQTT.

Il nécessite un protocole d'application que deux ESP32 utilisent pour communiquer entre eux. Par exemple :

  • Protocole auto-défini sur TCP brut (directement)
  • Modbus TCP (directement)
  • HTTP (directement)
  • Telnet (directement)
  • SSH (directement)
  • MQTT (indirectement via un serveur)

※ NOTE THAT:

Le protocole UDP est hors du champ d'application de ce tutoriel.

Exemple d'application

Réalisons l'application suivante : Un bouton/interrupteur connecté à ESP32 #1 contrôle une LED connectée à ESP32 #2 via WiFi.

communication entre deux ESP32

Pour simplifier, ce tutoriel utilisera un protocole auto-défini (défini par nous, sans norme).

Protocole Auto-défini

Nous définissons un protocole simple comme suit :

  • Créer une connexion TCP entre l'ESP32 #1 et l'ESP32 #2
  • ESP32 #1 :
    • Client TCP : effectue activement une demande de connexion TCP à l'ESP32 #2
    • Si l'état de l'interrupteur passe à ON, l'ESP32 #1 envoie un octet (commande) avec la valeur 1 à l'ESP32 #2.
    • Si l'état de l'interrupteur passe à OFF, l'ESP32 #1 envoie un octet (commande) avec la valeur 0 à l'ESP32 #2.
  • ESP32 #2 :
    • Serveur TCP : écoute une demande de connexion TCP de l'ESP32 #1. S'il y a une demande TCP, il accepte et la connexion est établie.
    • S'il reçoit un octet :
      • Si la valeur est 1, allumer la LED
      • Si la valeur est 0, éteindre la LED

      Schéma de câblage

      • Schéma de câblage pour ESP32 #1 : CLIENT TCP + UN BOUTON/INTERRUPTEUR
      Schéma de câblage du bouton ESP32

      This image is created using Fritzing. Click to enlarge image

      Si vous ne savez pas comment alimenter l'ESP32 et d'autres composants, vous pouvez trouver des conseils dans le tutoriel suivant : Comment alimenter l'ESP32.

      • Schéma de câblage pour ESP32 #2 : SERVEUR TCP + UNE LED
      Schéma de câblage de la LED ESP32

      This image is created using Fritzing. Click to enlarge image

      ※ NOTE THAT:

      Il est nécessaire d'utiliser une résistance pour une LED si elle n'a pas de résistance intégrée. Nous avons des tutoriels dédiés pour les boutons et les LED. Vous pouvez en apprendre davantage à leur sujet dans :

      Code ESP32 pour ESP32 #1

      /* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/communication-between-two-esp32 */ // ESP32: TCP CLIENT + A BUTTON/SWITCH #include <ezButton.h> #include <WiFi.h> #define BUTTON_PIN 21 // ESP32 pin GPIO21 connected to button const char* ssid = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char* password = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char* serverAddress = "192.168.0.180"; // CHANGE TO ESP32#2'S IP ADDRESS const int serverPort = 4080; ezButton button(BUTTON_PIN); // create ezButton WiFiClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds Serial.println("ESP32: TCP CLIENT + A BUTTON/SWITCH"); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); // connect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) { Serial.println("Connected to TCP server"); } else { Serial.println("Failed to connect to TCP server"); } } void loop() { button.loop(); // MUST call the loop() function first if (!TCPclient.connected()) { Serial.println("Connection is disconnected"); TCPclient.stop(); // reconnect to TCP server (Arduino #2) if (TCPclient.connect(serverAddress, serverPort)) { Serial.println("Reconnected to TCP server"); } else { Serial.println("Failed to reconnect to TCP server"); } } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("- The button is pressed, sent command: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("- The button is released, sent command: 0"); } }

      Code ESP32 pour ESP32 #2

      /* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/communication-between-two-esp32 */ // ESP32 #2: TCP SERVER + AN LED #include <WiFi.h> #define LED_PIN 18 // ESP32 pin GPIO18 connected to LED #define SERVER_PORT 4080 const char* ssid = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char* password = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD WiFiServer TCPserver(SERVER_PORT); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP32 #2: TCP SERVER + AN LED"); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); // Print your local IP address: Serial.print("ESP32 #2: TCP Server IP address: "); Serial.println(WiFi.localIP()); Serial.println("ESP32 #2: -> Please update the serverAddress in ESP32 #1 code"); // Start listening for a TCP client (from ESP32 #1) TCPserver.begin(); } void loop() { // Wait for a TCP client from ESP32 #1: WiFiClient client = TCPserver.available(); if (client) { // Read the command from the TCP client: char command = client.read(); Serial.print("ESP32 #2: - Received command: "); Serial.println(command); if (command == '1') digitalWrite(LED_PIN, HIGH); // Turn LED on else if (command == '0') digitalWrite(LED_PIN, LOW); // Turn LED off client.stop(); } }

      Étapes rapides

      • Si c'est la première fois que vous utilisez ESP32, consultez comment configurer l'environnement pour ESP32 sur Arduino IDE.
      • Connectez un bouton/interrupteur à ESP32 #1
      • Connectez une LED à ESP32 #2
      • Ouvrez Arduino IDE (appelé Arduino IDE #1)
      • Installez la bibliothèque ezButton sur Arduino IDE
      • Connectez ESP32 #1 au PC via un câble USB et sélectionnez le port COM de ESP32 #1 sur Arduino IDE #1
      • Ouvrez une autre fenêtre Arduino IDE (appelée Arduino IDE #2) en cliquant sur l'icône Arduino IDE sur votre PC (important!(**))
      • Connectez ESP32 #2 au PC via un câble USB et sélectionnez le port COM de ESP32 #2 sur Arduino IDE #2
      • Copiez le code de ESP32 #1, collez-le dans Arduino IDE #1 et enregistrez-le (nommé ESP321)
      • Copiez le code de ESP32 #2, collez-le dans Arduino IDE #2 et enregistrez-le (nommé ESP322)
      • Téléchargez le code de ESP32 #2 dans ESP32 #2 en premier
      • Ouvrez le moniteur série sur Arduino IDE #2, obtenez l'adresse IP du serveur TCP
      COM6
      Send
      ESP32 #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP32 #1 code
      Autoscroll Show timestamp
      Clear output
      9600 baud  
      Newline  
      • Mettre à jour l'adresse IP du serveur TCP dans le code ESP32 #1
      • Téléverser le code ESP32 #1 sur ESP32 #1
      • Ouvrir le moniteur série sur Arduino IDE #1
      • Appuyer et maintenir le bouton sur ESP32 #1 → observer l'état du LED sur ESP32 #2 (ON)
      • Relâcher le bouton sur ESP32 #1 → observer l'état du LED sur ESP32 #2 (OFF)
      • Répéter plusieurs fois le processus ci-dessus.
      • Vérifier la sortie sur les deux moniteurs série
        • Moniteur série de ESP32 #1
        COM6
        Send
        ESP32 #1: TCP CLIENT + A BUTTON/SWITCH ESP32 #1: Connected to TCP server ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0 ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0 ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0
        Autoscroll Show timestamp
        Clear output
        9600 baud  
        Newline  
        • Moniteur série de ESP32 #2
        COM6
        Send
        ESP32 #2: TCP SERVER + AN LED ESP32 #2: TCP Server IP address: 192.168.0.2 ESP32 #2: -> Please update the serverAddress in ESP32 #1 code ESP32 #2: - Received command: 1 ESP32 #2: - Received command: 0 ESP32 #2: - Received command: 1 ESP32 #2: - Received command: 0 ESP32 #2: - Received command: 1 ESP32 #2: - Received command: 0
        Autoscroll Show timestamp
        Clear output
        9600 baud  
        Newline  

        ※ NOTE THAT:

        • (**): Si vous ouvrez la fenêtre Arduino IDE #2 via "Fichier" → "Nouveau" ou "Ouvrir" depuis la fenêtre Arduino IDE #2, vous ne pourrez PAS ouvrir deux Moniteurs Séries pour deux ESP32 sur le même PC en même temps.
        • Il existe une alternative à ce protocole auto-défini. Il s'agit du Modbus TCP. Le protocole Modbus est standardisé, il présente de nombreux avantages par rapport au protocole auto-défini. Voir plus dans le tutoriel ESP32 - Modbus.

Vidéo

Comment connecter deux ESP32 via Internet

Voir Comment connecter deux appareils via Internet

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!