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!