Comunicação Wifi entre módulos ESP8266 ESP-01
Neste post vamos mostrar como realizar a comunicação entre módulos Wifi ESP8266, mais especificamente os módulos ESP01, baratos e muito fáceis de encontrar, e com eles você pode facilmente montar projetos de controle via rede sem fio (wireless), muito usados em projetos de IoT (Internet das Coisas) e automação residencial.
No nosso projeto usamos o ESP-01, mas você pode adaptar o código para outras placas e módulos da linha ESP, como o NodeMCU ESP-12.
A programação dos módulos ESP8266 será feita via IDE Arduino.
Projeto comunicação Wifi com módulos ESP8266
Para este projeto vamos usar o seguinte material:
- 2 módulos Wifi ESP8266 ESP-01
- Adaptador Programador USB para ESP8266 ESP-01
- Push button
- Resistor 10K
Como material opcional, você pode usar um Adaptador Protoboard para ESP-01 para montar o seu projeto de forma semelhante ao que eu fiz na imagem de capa deste post.
Basicamente o que vamos ter é um ESP-01 funcionando como Server (servidor), que vai receber um comando de um outro ESP-01 que estará no modo Client (Client).
Ao pressionar o botão conectado ao ESP-01 Client, um comando será enviado para o Server, que por sua vez vai ligar ou desligar seu led onboard.
Como mencionamos anteriormente, você pode usar o mesmo princípio e fazer adaptações no projeto, acionando por exemplo um relé ou uma válvula solenóide.
Conexão ESP-01 modo Client
Para montar o ESP-01 que funcionará no modo cliente, use o esquema de conexão abaixo, composto pelo ESP8266 ESP-01, um push-button e o resistor de 10K:

Um detalhe importante sobre a alimentação do circuito: use uma fonte de 3.3V que possa fornecer pelo menos 500mA de corrente. Esse foi o valor mínimo que funcionou aqui nos testes. Não recomendo usar o pino de 3.3V do Arduino pois a corrente não será suficiente para alimentar o projeto.
Para facilitar a alimentação do circuito que montamos, usamos uma fonte ajustável para protoboard. Não se esqueça de alterar os jumpers da fonte para 3.3V, ok?
O ESP-01 que vai funcionar no modo Server não exige circuito, então vamos agora direto para a parte de programação do ESP8266 usando a IDE do Arduino.
Programação do ESP8266 usando IDE Arduino
Para usar o ESP8266 ESP-01 com a IDE Arduino vamos primeiro realizar algumas configurações na IDE, começando por incluir no menu Arquivo -> Preferências -> URLs Adicionais para Gerenciadores de Placas a seguinte URL:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Em seguida, acesse o menu Ferramentas -> Placa -> Gerenciador de placas, coloque ESP8266 na caixa de busca e selecione o esp8266 by ESP8266 Community, clicando em seguida em Instalar:

Isso faz com que as placas da linha ESP8266 fiquem disponíveis no menu Ferramentas -> Placas. Agora basta você selecionar o Generic ESP8266 Module, conforme imagem abaixo:

Para realizar a programação, conecte o Adaptador Programador USB para ESP8266 ESP-01 na porta USB do seu computador e envie os programas normalmente. O adaptador vai alternar sozinho entre o modo “normal” (modo de operação) e o modo de programação.
Programas Server e Client ESP8266
O primeiro módulo que vamos programar é o Server, que contém as configurações do SSID (nome da rede Wifi) na linha 9 e a porta HTTP do servidor (porta 80) na linha 15. Uma variável chamada estado_led recebe o valor 0 ou 1, acendendo ou apagando o led onboard do ESP-01.
Mensagens de controle são enviadas para o Serial Monitor, caso você precise depurar o programa. Se tudo estiver ok o ESP8266 Server envia de volta para o cliente a mensagem “Pronto!” (linha 27) para indicar o sucesso da transmissão.
//Programa: Comunicação entre dois ESP8266 ESP-01 - Modulo Server
//Autor: Arduino e Cia
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
//Define o SSID do ESP8266 Server
const char* ssid = "ESP01_SVR";
//Variavel para alternar o estado do led
bool estado_led = 0;
//Port de conexao TCP
ESP8266WebServer server(80);
void handleRoot()
{
//Alterna o estado do led
estado_led = !estado_led;
//Aciona o led onboard de acordo com a variavel estado_led
digitalWrite(LED_BUILTIN, estado_led);
//Resposta da requisicao
String s = "\r\n\r\n <!DOCTYPE HTML>\r\n<html><h1>Comunicacao com Esp8266</h1> ";
s += "<p>Pronto!</html>\r\n\r\n";
//Envia resposta ao cliente
server.send(200, "text/html", s);
//Mostra o estado do led no Serial Monitor
Serial.print("Botao pressionado! Estado: ");
Serial.println(estado_led);
}
void setup()
{
delay(200);
Serial.begin(115200);
//Define o estado do led onboard do server como saida
pinMode(LED_BUILTIN, OUTPUT);
//Inicializa o wifi no modo AP (Access Point)
WiFi.softAP(ssid);
//Verifica o IP atribuido ao Server (geralmente o 192.168.4.1
IPAddress myIP = WiFi.softAPIP();
//Mostra o endereco IP atribuido no Serial Monitor
Serial.print("Endereco IP do Server (AP): ");
Serial.println(myIP);
//Verifica conexao
server.on("/Led", handleRoot);
//Inicializa o servidor
server.begin();
Serial.println("Servidor iniciado!");
}
void loop()
{
//Verifica se o client se conectou. Na primeira conexao altera o estado do led
server.handleClient();
}
Agora vamos programar o Client. Logo no inicio do programa (linha 8) colocamos o IP do Server, no caso 192.168.4.1.
Dentro do setup, definimos que o ESP-01 ficará em modo Station (linha 22) e fazemos a conexão com o SSID do Server na linha 25. O programa então aguarda o endereço IP fornecido pelo Server e mostra no Serial Monitor as informações da conexão.
Finalmente dentro do loop o programa verifica se o botão foi pressionado e realiza a conexão com o Web Server, enviando o comando \Led que vai alterar o estado do led no programa que está dentro do Server.
//Programa: Comunicação entre dois ESP8266 ESP-01 - Modulo Client
//Autor: Arduino e Cia
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
//Coloque aqui o IP do modulo ESP-01 Server
const char* host = "192.168.4.1";
//Pino de conexao do Push Button (GPIO2)
int pino_botao = 2;
void setup()
{
Serial.begin(115200);
delay(10);
//Define o pino do botao como entrada
pinMode(pino_botao, INPUT);
//Coloca o ESP-01 em modo Station
WiFi.mode(WIFI_STA);
//Conecta com o SSID do Server
WiFi.begin("ESP01_SVR");
//Aguarda o endereco IP fornecido pelo server
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
//Mostra as informacoes no Serial Monitor
Serial.println("");
Serial.println("WiFi conectado!");
Serial.println("Endereco IP do client: ");
Serial.println(WiFi.localIP());
}
void loop()
{
//Verifica se o botao foi pressionado
if (digitalRead(pino_botao) == 0) {
Serial.print("Conectando com ");
Serial.println(host);
//Conexao com o server
WiFiClient client;
const int httpPort = 80;
if (!client.connect("192.168.4.1", httpPort))
{
Serial.println("Conexao falhou!");
return;
}
//Requisicao para que o server acione o led
client.print(String("GET ") + "/Led" + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(10);
//Aguarda a resposta do Server e mostra os dados no Serial Monitor
while (client.available())
{
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("Conexao encerrada!");
}
}
Para testar a comunicação entre os módulos ESP8266, você pode montar o ESP8266 ESP-01 Client em uma protoboard, como mostramos na imagem do início do post. O ESP que funciona como Server pode permanecer conectado no adaptador USB que você usou para programar.
Gostou? Confira outros posts usando ESP8266 aqui mesmo no Arduino e Cia!