O NodeMCU ESP8266 é um pequeno microcontrolador com um chip WiFi. É possível estabelecer uma comunicação entre dois ESP8266 conectando-os na mesma rede. Neste tutorial, veremos uma arquitetura do tipo Master/Slave, na qual um ESP8266 irá desempenhar o papel de servidor e gerenciar uma interface web, assim como diferentes pedidos “slave”.
Material
- Computador
- 2 ou mais NodeMCU ESP8266
- Cabo USB A Macho/Micro B Macho
Configurar o servidor com um endereço IP fixo
Em alguns casos, tais como a criação de um servidor, é preciso determinar um endereço IP específico para o seu microcontrolador. É possível definir um endereço fixo nos ESP8266 especificando os endereços IP do gateway e da sub-rede.
No prompt de comando, digite arp -a para exibir os endereços IP já em uso na sua rede. Escolha um endereço que não esteja na lista (ex: 192.168.1.103)
![](https://www.aranacorp.com/wp-content/uploads/windows-cmd-prompt-terminal-get-available-ip.png)
Depois, digite ipconfig para obter os endereços IP correspondentes ao seu roteador.
![](https://www.aranacorp.com/wp-content/uploads/window-ipconfig-ip-subnet-gateway.png)
Inicialize os diferentes endereços IP no código do Arduino (não se esqueça de substituir os endereços pelos exibidos no seu computador).
IPAddress ip(192, 168, 1,103 );
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);
Depois, pode configurar a conexão WiFi para inicializá-la em seguida:
WiFi.config(ip, gateway, subnet); // Static IP setup
WiFi.begin(ssid, password);
![](https://www.aranacorp.com/wp-content/uploads/arduino-monitor-ip-fix.png)
Código do ESP8266 Master
Para o microcontrolador Master, vamos criar um servidor para gerenciar os pedidos do navegador, a interface web e os pedidos provenientes dos microcontroladores Slave. Utilizamos a biblioteca ESP8266WiFi.h que permite a gestão do chip WiFi para as placas ESP8266.
Obs: Não se esqueça de alterar os valores de ssid e password para o nome e a senha da rede WiFi que pretende utilizar
//Libraries #include <ESP8266WiFi.h>//https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFi.h //Constants #define NUM_SLAVES 1 #define LED D4 //Parameters String nom = "Master"; const char* ssid = "*******"; const char* password = "**********"; //Variables bool sendCmd = false; String slaveCmd = "0"; String slaveState = "0"; //Objects WiFiServer server(80); WiFiClient browser; IPAddress ip(192, 168, 1, 44); IPAddress gateway(192, 168, 1, 254); IPAddress subnet(255, 255, 255, 0); void setup() { //Init Serial USB Serial.begin(115200); Serial.println(F("Initialize System")); //Init ESP8266 Wifi WiFi.config(ip, gateway, subnet); // forces to use the fix IP WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(F(".")); } server.begin(); Serial.print(nom); Serial.print(F(" connected to Wifi! IP address : http://")); Serial.println(WiFi.localIP()); // Print the IP address pinMode(LED, OUTPUT); } void loop() { clientRequest(); } void clientRequest( ) { /* function clientRequest */ ////Check if client connected WiFiClient client = server.available(); client.setTimeout(50); if (client) { if (client.connected()) { //Print client IP address Serial.print(" ->");Serial.println(client.remoteIP()); String request = client.readStringUntil('\r'); //receives the message from the client if (request.indexOf("Slave0") == 0) { //Handle slave request Serial.print("From "); Serial.println(request); int index = request.indexOf(":"); String slaveid = request.substring(0, index); slaveState = request.substring(request.indexOf("x") + 1, request.length()); Serial.print("state received: "); Serial.println(slaveState); client.print(nom); if (sendCmd) { sendCmd = false; client.println(": Ok " + slaveid + "! Set state to x" + String(slaveCmd) + "\r"); } else { client.println(": Hi " + slaveid + "!\r"); // sends the answer to the client } client.stop(); // terminates the connection with the client } else { Serial.print("From Browser : "); Serial.println(request); client.flush(); handleRequest(request); webpage(client); } } } } void handleRequest(String request) { /* function handleRequest */ ////Check if client connected if (request.indexOf("/light1on") > 0) { digitalWrite(LED, LOW); } if (request.indexOf("/light1off") > 0) { digitalWrite(LED, HIGH); } if (request.indexOf("/light2on") > 0) { sendCmd = true; slaveCmd = "1"; } if (request.indexOf("/light2off") > 0) { sendCmd = true; slaveCmd = "0"; } } void webpage(WiFiClient browser) { /* function webpage */ ////Send webpage to browser browser.println("HTTP/1.1 200 OK"); browser.println("Content-Type: text/html"); browser.println(""); // do not forget this one browser.println("<!DOCTYPE HTML>"); browser.println("<html>"); browser.println("<head>"); browser.println("<meta name='apple-mobile-web-app-capable' content='yes' />"); browser.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />"); browser.println("</head>"); browser.println("<body style = ' background-color:#000000; color:white;'>"); browser.println("<hr/><hr>"); browser.println("<h1><center> Esp8266 Electrical Device Control </center></h1>"); browser.println("<hr/><hr>"); browser.println("<br><br>"); browser.println("<br><br>"); browser.println("<h2> Commands </h2>"); browser.println("<center>"); browser.println("Built-in LED"); browser.println("<a href='/light1on'><button>Turn On </button></a>"); browser.println("<a href='/light1off'><button>Turn Off </button></a><br />"); browser.println("</center>"); browser.println("<br><br>"); browser.println("<center>"); browser.println("Device 2"); browser.println("<a href='/light2on'><button>Turn On </button></a>"); browser.println("<a href='/light2off'><button>Turn Off </button></a><br />"); browser.println("</center>"); browser.println("<br><br>"); browser.println("<br><br>"); browser.println("<h2> Data </h2>"); browser.println("<center>"); browser.println("<table border='5'>"); browser.println("<tr>"); if (digitalRead(LED)) { browser.print("<td>LED is OFF</td>"); } else { browser.print("<td>LED is ON</td>"); } browser.println("<br />"); if (slaveState == "1") //(digitalRead(4)) { browser.print("<td>Light 2 is OFF</td>"); } else { browser.print("<td>Light 2 is ON</td>"); } browser.println("</tr>"); browser.println("</table>"); browser.println("</center>"); browser.println("</body></html>"); delay(1); }
Código do ESP8266 Slave
No código Slave, vamos nos conectar ao servidor através do endereço IP anteriormente utilizado.
Obs: Não se esqueça de modificar e utilizar os mesmos valores de ssid e password usados no módulo Master, para os dois cartões ESP8266 se conectarem à mesma rede.
//Libraries #include <ESP8266WiFi.h>//https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFi.h //Constants #define LED D4 #define UPDATE_TIME 500 //Parameters String nom = "Slave0"; const char* ssid = "*******"; const char* password = "*******"; //Variables String command; unsigned long previousRequest = 0; //Objects WiFiClient master; IPAddress server(192, 168, 1, 44); void setup() { //Init Serial USB Serial.begin(115200); Serial.println(F("Initialize System")); //Init ESP8266 Wifi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(F(".")); } Serial.print(nom); Serial.print(F(" connected to Wifi! IP address : ")); Serial.println(WiFi.localIP()); // Print the IP address pinMode(LED, OUTPUT); } void loop() { requestMaster(); } void requestMaster( ) { /* function requestMaster */ ////Request to master if ((millis() - previousRequest) > UPDATE_TIME) { // client connect to server every 500ms previousRequest = millis(); if (master.connect(server, 80)) { // Connection to the server master.println(nom + ": Hello! my current state is x" + String(!digitalRead(LED)) + "\r"); //answer String answer = master.readStringUntil('\r'); // receives the answer from the sever master.flush(); Serial.println("from " + answer); if (answer.indexOf("x") >= 0) { command = answer.substring(answer.indexOf("x") + 1, answer.length()); Serial.print("command received: "); Serial.println(command); if (command == "1") { Serial.println("LED ON"); digitalWrite(LED, LOW); } else { Serial.println("LED OFF"); digitalWrite(LED, HIGH); } } } } }
Resultado
Quando os microcontroladores são conectados ao Wifi e a comunicação entre os dois ESP8266 se estabelece, podemos ver as duas placas trocarem comandos e informações. Também é possível controlar os LEDs de ambas as placas por meio dos botões da interface.
![](https://www.aranacorp.com/wp-content/uploads/esp8266-communication-web-interface.png)
![](https://www.aranacorp.com/wp-content/uploads/arduino-monitor-esp8266-master.png)
![](https://www.aranacorp.com/wp-content/uploads/arduino-monitor-esp8266-slave.png)
Aplicações
- Criar uma rede de NodeMCUs Esp8266 para gerir diferentes dispositivos ou sensores
Perfect, I’ve been looking for this for a long time, thank you so much for sharing your knowledge.