Comunicación entre dos ESP8266s

Esta guía te muestra cómo establecer una conexión entre dos dispositivos ESP8266 usando TCP/IP a través de WiFi y intercambiar datos. Un ESP8266 funcionará como cliente TCP, mientras que el otro actuará como servidor TCP. Profundizaremos en este proceso a través de un ejemplo:

Hardware Requerido

2×ESP8266 NodeMCU
2×Cable Micro USB
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP8266
1×(Recomendado) Divisor de Alimentación para ESP8266 Tipo-C

Or you can buy the following kits:

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 ESP8266 - Visión general

Consideremos un ejemplo concreto: ESP8266 n.º 1 interactuando con ESP8266 n.º 2. Existen numerosas formas de habilitar la comunicación entre los dos ESP8266. Podemos seleccionar una de ellas en función de la distancia de comunicación. La tabla a continuación muestra algunos métodos y su rango de comunicación.

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

※ Nota:

  • Si dos ESP8266 están conectados a Internet, el alcance de la comunicación es ilimitado.
  • Sin embargo, si dos ESP8266 no están conectados a Internet, sino conectados en la misma red LAN, su alcance de comunicación se limita a esa red de área local.

Entre los métodos mencionados anteriormente, este tutorial utiliza WiFi para permitir la comunicación entre dos ESP8266, ya que permite un alcance de comunicación ilimitado.

Comunicación entre dos ESP8266 a través de LAN local o Internet

Dos ESP8266 pueden comunicarse entre sí a través de WiFi cuando:

  • Están en la misma red de área local (LAN), y no es necesaria una conexión a Internet.
  • Están en diferentes redes LAN, y se necesita una conexión a Internet.

No importa si dos ESP8266 están conectados dentro de una red LAN local o a través de Internet, hay dos formas de comunicación:

Cuando se trata de comunicación directa, normalmente un ESP8266 es el cliente TCP y el otro es el servidor TCP.

En el caso de utilizar un servidor centralizado para la comunicación, normalmente ambos ESP8266 actúan como clientes TCP.

Al decidir el protocolo de aplicación para la comunicación entre dos ESP8266, tenemos varias opciones entre las que elegir:

  • Protocolo definido por el usuario sobre TCP crudo
  • Modbus TCP
  • HTTP
  • Telnet
  • SSH
  • MQTT (que requiere un servidor centralizado)

Ejemplo de Aplicación

Hagamos realidad el siguiente programa: un botón o interruptor conectado al ESP8266 #1 se utilizará para encender y apagar un LED conectado al ESP8266 #2 a través de WiFi.

Comunicación entre dos ESP8266 NodeMCU

Como se mencionó anteriormente, hay unos pocos protocolos de aplicación disponibles. Para simplificar este ejemplo, crearemos nuestro propio protocolo (un protocolo definido por nosotros).

Protocolo definido por uno mismo

Establezcamos un protocolo sencillo:

  • Establecer una conexión TCP entre ESP8266 #1 y ESP8266 #2
  • ESP8266 #1:
    • Actuar como cliente TCP, iniciando la conexión TCP con ESP8266 #2
    • Cuando el interruptor se ponga en ON, envía un byte (comando) con valor 1 a ESP8266 #2.
    • Cuando el interruptor se ponga en OFF, envía un byte (comando) con valor 0 a ESP8266 #2.
  • ESP8266 #2:
    • Servir como servidor TCP, escuchando solicitudes de conexión TCP desde ESP8266 #1
    • Si el byte recibido es 1, enciende el LED
    • Si el byte recibido es 0, apaga el LED

    Diagrama de cableado

    • ESP8266 #1 - Diagrama de cableado entre ESP8266 y botón
    Esquema de cableado del botón ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

    Para obtener m\u00e1s informaci\u00f3n, consulte Pines del ESP8266 y c\u00f3mo alimentar ESP8266 y otros componentes.

    • ESP8266 #2 - Diagrama de cableado entre ESP8266 y LED
    Diagrama de cableado de LED ESP8266 NodeMCU

    This image is created using Fritzing. Click to enlarge image

    Código ESP8266 para ESP8266 #1

    /* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/communication-between-two-esp8266 */ #include <ezButton.h> #include <ESP8266WiFi.h> #define BUTTON_PIN D7 // The ESP8266 pin connected to button #define SERVER_IP "192.168.0.180" #define SERVER_PORT 4080 ezButton button(BUTTON_PIN); // create ezButton attached to pin D7 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD WiFiClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds Serial.println("ESP8266 #1: TCP CLIENT + A BUTTON/SWITCH"); // Connect to WiFi WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Connect to TCP server (ESP8266 #2) if (TCPclient.connect(SERVER_IP, SERVER_PORT)) Serial.println("ESP8266 #1: Connected to TCP server"); else Serial.println("ESP8266 #1: Failed to connect to TCP server"); } void loop() { button.loop(); // MUST call the loop() function first if (!TCPclient.connected()) { Serial.println("ESP8266 #1: Connection is disconnected"); TCPclient.stop(); // Reconnect to TCP server (ESP8266 #2) if (TCPclient.connect(SERVER_IP, SERVER_PORT)) Serial.println("ESP8266 #1: Reconnected to TCP server"); else Serial.println("ESP8266 #1: Failed to reconnect to TCP server"); } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("ESP8266 #1: - The button is pressed, sent command: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("ESP8266 #1: - The button is released, sent command: 0"); } }

    Código para ESP8266 #2

    /* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/communication-between-two-esp8266 */ #include <ESP8266WiFi.h> #define LED_PIN D6 // The ESP8266 pin connected to LED #define SERVER_PORT 4080 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD WiFiServer TCPserver(SERVER_PORT); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: TCP SERVER + AN LED"); // Connect to Wi-Fi WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Start the TCP server TCPserver.begin(); } void loop() { // Check if a client has connected WiFiClient client = TCPserver.available(); if (client) { // Read the command from the TCP client char command = client.read(); Serial.print("ESP8266 #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(); // Close the connection } }

    Pasos R\u00e1pidos

    Para empezar con ESP8266 en Arduino IDE, siga estos pasos:

    • Consulta el tutorial cómo configurar el entorno para ESP8266 en Arduino IDE si es la primera vez que usas ESP8266.
    • Conecta los componentes tal como se muestra en el diagrama.
    • Conecta dos placas ESP8266 a tu computadora mediante un cable USB.
    • Abre el Arduino IDE (llamado Arduino IDE #1).
    • Abre el Arduino IDE (llamado Arduino IDE #2).
    • Elige la placa ESP8266 correcta, como (p. ej. NodeMCU 1.0 (ESP-12E Module)), y su puerto COM correspondiente.
    • Instala la biblioteca ezButton en Arduino IDE.
    • Copia el código ESP8266 #1, pégalo en Arduino IDE #1 y guárdalo (con el nombre ESP8266-1).
    • Copia el código ESP8266 #2, pégalo en Arduino IDE #2 y guárdalo (con el nombre ESP8266-2).
    • Sube el código ESP8266 #2 al ESP8266 #2 primero.
    • Abre el Monitor Serial en Arduino IDE #2 y obtén la dirección IP del servidor TCP.
    COM6
    Send
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP8266 #1 code
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Cambiar la dirección IP del servidor TCP en el código del ESP8266 #1.
    • Subir el código del ESP8266 #1 al ESP8266 #1.
    • Abrir el Monitor Serial en el IDE de Arduino #1.
    • Presiona y mantén presionado el botón en el ESP8266 #1 y observa el estado del LED en el ESP8266 #2 (debería estar ENCENDIDO).
    • Suelta el botón en el ESP8266 #1 y observa el estado del LED en el ESP8266 #2 (debería estar APAGADO).
    • Presiona, mantén y suelta el botón varias veces.
    • Verifica la salida en el Monitor Serial #1:
    COM6
    Send
    ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH Connected to TCP server ESP8266 #1: - The button is pressed, sent command: 1 ESP8266 #1: - The button is released, sent command: 0 ESP8266 #1: - The button is pressed, sent command: 1 ESP8266 #1: - The button is released, sent command: 0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Ver la salida en el Monitor Serial #2:
    COM6
    Send
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP8266 #1 code ESP8266 #2: - Received command: 1 ESP8266 #2: - Received command: 0 ESP8266 #2: - Received command: 1 ESP8266 #2: - Received command: 0 ESP8266 #2: - Received command: 1 ESP8266 #2: - Received command: 0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

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 ESP8266 a través de Internet

Existen dos tipos de direcciones IP: privadas y públicas. La dirección IP que se usa habitualmente en una red doméstica es privada.

Es sencillo reconocer una dirección IP privada. Hay tres formatos de direcciones IP privadas: 10.x.x.x, 172.16.x.x, 192.168.x.x

No es importante utilizar la dirección IP privada en los siguientes escenarios:

  • Cuando dos ESP8266 se encuentran dentro de la misma red de área local, sin importar si se comunican directamente o a través de un servidor centralizado, y sin importar si la red de área local está conectada a Internet o no.
  • Cuando dos ESP8266 se encuentran en redes de área local separadas y se comunican entre sí a través de un servidor centralizado.

En el caso de que dos ESP8266 estén en diferentes redes LAN y se comuniquen entre sí directamente, el cliente TCP de ESP8266 puede utilizar una dirección IP privada. Sin embargo, el servidor TCP de ESP8266 debe usar cualquiera de las siguientes:

  • Una dirección IP pública
  • Una dirección IP privada con "Reenvío de puertos" en el router/punto de acceso

La técnica de 'Port Forwarding' varía de router/punto de acceso a router/punto de acceso. Este tutorial no cubre este tema.

※ 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!