,
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
Muito top…vocês sabem como fazer um código em que eu consiga trocar qualquer mensagem que eu digitar no serial monitor entre os 02 ESP’s32?
//recuperar a mensagem da porta série
void readSerialPort(){
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read(); //gets one byte from serial buffer
msg += c; //add to String
}
}
Serial.flush(); //clean buffer
}
//enviar mensagem via udp
loop(){
readSerialPort();
if(msg!=””){
udp.printf(msg);
msg=””;
}
}