,
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