El NodeMCU ESP8266 es un pequeño microcontrolador con un chip Wi-Fi. Es posible establecer una comunicación entre dos ESP8266, cuando utilizan la misma red. En este tutorial, veremos una arquitectura con dos NodeMCUs que intercambiarán datos a través del protocolo UDP.
Si no tiene acceso a un segundo ESP8266, puede probar la comunicación con el software Packet Sender.
Material
- Ordenador
- NodeMCU ESP8266 x2 o más
- Cable USB A macho/micro B macho x2
Código ESP8266 Servidor UDP
Para el microcontrolador Servidor, crearemos un servidor que gestione las peticiones procedentes de los microcontroladores clientes. Utilizamos la librería ESP8266WiFi.h que permite gestionar el chip WiFi de las tarjetas ESP8266 y la librería WiFiUdp.h que permite gestionar las peticiones UDP.
N.B.: No olvides cambiar los valores de ssid y password, por el nombre y la contraseña de la red wifi que quieres utilizar
#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()); }
Código ESP8266 UDP Cliente
En el código del cliente, nos conectaremos al servidor utilizando la dirección IP utilizada anteriormente.
N.B.: No olvides modificar y utilizar los mismos valores de ssid y password que en el módulo Server para que las dos tarjetas ESP8266 se conecten a la misma red.
#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(); }
Resultado
Cuando los microcontroladores se conectan al Wifi y se establece la comunicación entre los dos ESP8266, podemos ver que se intercambia información entre las dos tarjetas. Así, es posible controlar un dispositivo conectado al cliente desde el servidor o viceversa.
Aplicaciones
- Crear una red de Esp8266 NodeMCUs para gestionar diferentes dispositivos o sensores
Muy fácil de entender.
Es genial para el proyecto que tengo entre manos; Un sistema de alarma casero
Conectando ambos 8266 a dos redes WiFi diferentes y conociendo el IP público del servidor, ¿puedo comunicarme desde el cliente?
Para ello, debe configurar el reenvío de puertos en el servidor