fbpixel
Etiquetas: ,
0
(0)

,

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.

Aplicações

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

Fontes

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?