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.
Aplicações
- Criar uma rede de NodeMCUs Esp8266 para gerir diferentes dispositivos ou sensores