fbpixel
Etiquetas: ,

O NodeMCU ESP8266 é um pequeno microcontrolador com um chip Wi-Fi. É possível estabelecer uma comunicação entre dois ESP8266, quando utilizam a mesma rede. Neste tutorial, veremos uma arquitectura com dois NodeMCUs que irão trocar dados através do protocolo UDP.

Se não tiver acesso a um segundo ESP8266, pode testar a comunicação com o software Packet Sender.

Material

  • Computador
  • NóMCU ESP8266 x2 ou mais
  • Cabo USB A Macho/Micro B Macho x2

Código ESP8266 UDP Server

Para o microcontrolador Servidor, vamos criar um servidor para gerir os pedidos provenientes dos microcontroladores clientes. Utilizamos a biblioteca ESP8266WiFi.h que permite a gestão do chip WiFi para os cartões ESP8266 e a biblioteca WiFiUdp.h que permite gerir os pedidos UDP.

N.B.: Não se esqueça de alterar os valores de ssid e password, pelo nome e password da rede wifi que pretende 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

No código do cliente, ligar-nos-emos ao servidor utilizando o endereço IP anteriormente utilizado.

N.B.: Não se esqueça de modificar e utilizar os mesmos valores de ssid e senha que no módulo Servidor, de modo a que os dois cartões ESP8266 se liguem à mesma rede.

#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

Quando os microcontroladores se ligam ao Wifi e a comunicação entre os dois ESP8266 é estabelecida, podemos ver que a informação é trocada entre os dois cartões. É então possível controlar um dispositivo ligado ao cliente a partir do servidor ou vice-versa.

udp-client-monitor-result Comunicação entre dois ESP8266s via UDP
udp-server-monitor-result Comunicação entre dois ESP8266s via UDP

Aplicações

  • Criar uma rede de NodeMCUs Esp8266 para gerir diferentes dispositivos ou sensores

Fontes