fbpixel
Etiquetas: ,

,

O NodeMCU ESP32 é um pequeno microcontrolador com um chip WiFi. É possível estabelecer comunicação entre dois ESP32s quando eles usam a mesma rede. Neste tutorial, vamos analisar uma arquitetura com dois NodeMCUs que trocam dados utilizando o protocolo UDP.

Se não tiver acesso a um segundo ESP32, pode testar a comunicação utilizando o software Emissor de pacotes.

Hardware

  • Computador
  • NodeMCU ESP32 x2 ou mais
  • Cabo USB A macho

Código Servidor UDP ESP32

Para o microcontrolador Server, vamos criar um servidor para gerir os pedidos dos microcontroladores clientes. Estamos a utilizar a biblioteca WiFi.h, que gere o chip WiFi das placas ESP32, e a biblioteca WiFiUdp.h, que gere os pedidos UDP.

Nota: Não se esqueça de alterar os valores ssid e password para o nome e password da rede wifi que pretende utilizar.

#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char *ssid = "**********";
const char *password = "**********";

void setup() {
  Serial.begin(115200);
  // Connect to Wifi network.
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(F("."));
  }
  udp.begin(localPort);
  Serial.printf("UDP server : %s:%i \n", WiFi.localIP().toString().c_str(), localPort);
}

void loop() {
  int packetSize = udp.parsePacket();
  Serial.print(" Received packet from : "); Serial.println(udp.remoteIP());
  Serial.print(" Size : "); Serial.println(packetSize);
  if (packetSize) {
    int len = udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len - 1] = 0;
    Serial.printf("Data : %s\n", packetBuffer);
    udp.beginPacket(udp.remoteIP(), udp.remotePort());
    udp.printf("UDP packet was received OK\r\n");
    udp.endPacket();
  }
  Serial.println("\n");
  delay(500);
  Serial.print("[Server Connected] ");
  Serial.println (WiFi.localIP());
}

Uma vez carregado o código, pode obter o endereço IP e a porta da placa do servidor a partir do monitor de série e copiá-lo para o código do cliente (aqui, 192.168.1.97:9999).

Código do cliente UDP do ESP32

No código do cliente, vamos ligar-nos ao servidor utilizando o endereço IP anteriormente utilizado (neste caso, 192.168.1.97)

Nota: Não se esqueça de modificar e utilizar os mesmos valores de ssid e password que no módulo Server para que as duas placas ESP32 se liguem à mesma rede.

#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char *ssid = "******";
const char *password = "********";

void setup() {
  Serial.begin(115200);
  // Connect to Wifi network.
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(F("."));
  }
  udp.begin(localPort);
  Serial.printf("UDP Client : %s:%i \n", WiFi.localIP().toString().c_str(), localPort);
}

void loop() {
  int packetSize = udp.parsePacket();
  Serial.print(" Received packet from : "); Serial.println(udp.remoteIP());
  Serial.print(" Size : "); Serial.println(packetSize);
  if (packetSize) {
    int len = udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len - 1] = 0;
    Serial.printf("Data : %s\n", packetBuffer);
  }
  Serial.println("\n");
  delay(500);
  Serial.print("[Client Connected] ");
  Serial.println(WiFi.localIP());
  udp.beginPacket("192.168.1.97", localPort);
  udp.printf("Send millis: ");
  char buf[20];
  unsigned long testID = millis();
  sprintf(buf, "%lu", testID);
  udp.printf(buf);
  udp.printf("\r\n");
  udp.endPacket();
}

N.B.: Neste exemplo, a porta utilizada no cliente é a mesma que a porta utilizada no servidor. Estes valores podem ser diferentes.

Resultados

Quando os microcontroladores se ligam ao WiFi e a comunicação entre os dois ESP32 é estabelecida, podemos ver que as informações são trocadas entre as duas placas. É então possível controlar um dispositivo ligado ao cliente a partir do servidor ou vice-versa.

esp32-udp-result-server Comunicação entre dois ESP32s via UDP
esp32-udp-result-client Comunicação entre dois ESP32s via UDP

Aplicações

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

Fontes