Comunicación entre dos ESP32

Este tutorial explica cómo crear una conexión entre dos ESP32 mediante TCP/IP a través de WiFi y intercambiar datos. Un ESP32 actúa como cliente TCP y el otro como servidor TCP. También aprenderemos en detalle con un ejemplo:

comunicación entre dos ESP32s

Hardware Requerido

2×Módulo de Desarrollo ESP32 ESP-WROOM-32
2×Cable Micro USB
1×(Opcional) Conector de Alimentación DC
1×Protoboard
1×Cables Puente
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP32
1×(Recomendado) Breakout Expansion Board for ESP32
1×(Recomendado) Divisor de Alimentación para ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Comunicación entre dos ESP32 - Descripción general

Hay muchas formas de hacer que ESP32 #1 se comuniqe con ESP32 #2. Dependiendo de la distancia, podemos elegir una de las siguientes formas:

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

※ Nota:

(*):

  • Si conectamos ambos ESP32 a Internet, la distancia de comunicación es ilimitada
  • Si no conectamos ambos ESP32 a Internet, pero los conectamos a la misma red LAN, la distancia de comunicación se restringe dentro de la red LAN.

Este tutorial va a usar WiFi para la comunicación entre dos ESP32.

Comunicación entre dos ESP32 a través de WiFi

Dos ESP32 pueden comunicarse entre sí a través de WiFi si:

  • Dos ESP32 en la misma red LAN. No necesitan conectarse a Internet.
  • Dos ESP32 en diferentes redes LAN. Necesitan conectarse a Internet.

Hay dos formas en las que dos ESP32 pueden comunicarse entre sí.

  • Dos ESP32 se comunican entre sí directamente: un ESP32 es un cliente TCP, el otro es un servidor TCP.
  • Dos ESP32 se comunican entre sí indirectamente a través de un servidor centralizado (p. ej., servidor MQTT): ambos ESP32 son clientes TCP. Consulta el tutorial Comunicación ESP32-ESP32 vía MQTT.

Se necesita un protocolo de aplicación que dos ESP32 usen para comunicarse entre sí. Por ejemplo:

  • Protocolo propio sobre TCP crudo (directamente)
  • Modbus TCP (directamente)
  • HTTP (directamente)
  • Telnet (directamente)
  • SSH (directamente)
  • MQTT (indirectamente a través de un servidor)

※ Nota:

  • El protocolo UDP está fuera del alcance de este tutorial.

Aplicación de ejemplo

Realicemos la siguiente aplicación: un botón o interruptor conectado al ESP32 #1 controla un LED conectado al ESP32 #2 mediante WiFi.

comunicación entre dos ESP32

Para hacerlo más sencillo, este tutorial utilizará un protocolo autodefinido (definido por nosotros, sin estándar).

Protocolo definido por el usuario

Definimos un protocolo simple de la siguiente manera:

  • Crear una conexión TCP entre ESP32 #1 y ESP32 #2
  • ESP32 #1:
    • Cliente TCP: realiza activamente una solicitud de conexión TCP a ESP32 #2
    • Si el estado del interruptor cambia a ON, ESP32 #1 envía un byte (comando) con valor 1 a ESP32 #2.
    • Si el estado del interruptor cambia a OFF, ESP32 #1 envía un byte (comando) con valor 0 a ESP32 #2.
  • ESP32 #2:
    • Servidor TCP: escucha una solicitud de conexión TCP desde ESP32 #1. Si hay una solicitud TCP, la acepta y se crea la conexión.
    • Si recibe un byte:
      • Si el valor es 1, enciende el LED
      • Si el valor es 0, apaga el LED

      Diagrama de cableado

      • Diagrama de cableado para ESP32 #1: Cliente TCP + un botón/interruptor
      Diagrama de cableado del botón ESP32

      This image is created using Fritzing. Click to enlarge image

      Si no sabe c\u00f3mo alimentar ESP32 y otros componentes, encuentre instrucciones en el siguiente tutorial: C\u00f3mo alimentar ESP32.

      • Diagrama de cableado para ESP32 #2: Servidor TCP + un LED
      Diagrama de cableado LED para ESP32

      This image is created using Fritzing. Click to enlarge image

      ※ Nota:

      Es necesario usar una resistencia para el LED si no tiene una resistencia integrada. Tenemos tutoriales dedicados para el botón y el LED. Puedes aprender más sobre ellos en:

      Código ESP32 para ESP32 #1

      /* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/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"); } }

      Código ESP32 para ESP32 #2

      /* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/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(); } }

      Pasos R\u00e1pidos

      • Si esta es la primera vez que usas ESP32, consulta cómo configurar el entorno para ESP32 en Arduino IDE.
      • Conecta un botón o interruptor a ESP32 #1
      • Conecta un LED a ESP32 #2
      • Abre Arduino IDE (llamado Arduino IDE #1)
      • Instala la biblioteca ezButton en Arduino IDE
      • Conecta ESP32 #1 al PC mediante un cable USB y selecciona el puerto COM de ESP32 #1 en Arduino IDE #1
      • Abre otra ventana de Arduino IDE (llamada Arduino IDE #2) haciendo clic en el icono de Arduino IDE en tu PC (¡importante!())
      • Conecta ESP32 #2 al PC mediante un cable USB y selecciona el puerto COM de ESP32 #2 en Arduino IDE #2
      • Copia el código de ESP32 #1, pégalo en Arduino IDE #1 y guárdalo (llamado ESP321)
      • Copia el código de ESP32 #2, pégalo en Arduino IDE #2 y guárdalo (llamado ESP322)
      • Carga el código de ESP32 #2 a ESP32 #2 primero
      • Abre el Monitor Serial en Arduino IDE #2, obtén la dirección IP del servidor 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  
      • Actualizar la dirección IP del servidor TCP en el código de ESP32 #1
      • Subir el código de ESP32 #1 al ESP32 #1
      • Abrir el Monitor Serial en Arduino IDE #1
      • Presiona y mantén pulsado el botón en ESP32 #1 → ver el estado del LED en ESP32 #2 (ENCENDIDO)
      • Suelta el botón en ESP32 #1 → ver el estado del LED en ESP32 #2 (APAGADO)
      • Realiza el proceso anterior varias veces.
      • Ver la salida en ambos Monitores Serial
        • Monitor Serial 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  
        • Monitor de serie del 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  

        ※ Nota:

        • (): Si abre la ventana del IDE de Arduino #2 a través de "Archivo" → "Nuevo" o "Abrir" desde la ventana del IDE de Arduino #2, NO podrá abrir dos monitores serie para dos ESP32 en la misma PC al mismo tiempo.
        • Existe una alternativa a este protocolo autodefinido. Es el Modbus TCP. El protocolo Modbus está estandarizado; tiene muchas ventajas sobre el protocolo autodefinido. Ver más en el tutorial ESP32 - Modbus.

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Cómo conectar dos ESP32 a través de Internet

Ver Cómo conectar dos dispositivos a través de Internet

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!