Icono del sitio AranaCorp

Comunicación entre dos ESP8266 a través de UDP

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

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

Fuentes

Salir de la versión móvil