- Descrição: O Módulo Fotoresistor (Sensor) LDR possui em sua…
Webserver com o Shield WiFi ESP8266 para Arduino
Uma dificuldade muito comum encontrada por usuários que possuem o Shield WiFi ESP8266, é como colocá-lo em funcionamento junto ao Arduino, de forma que seja possível enviar e receber informações dos pinos digitais e analógicos da placa através da conexão WiFi e utilizando a serial nativa do Arduino para se comunicar com o shield. Diante desta dificuldade, resolvi fazer esta postagem para demonstrar como integrar as duas plataformas. Portanto, ao final desta publicação vamos ter um webserver rodando no Arduino e este servidor web poderá ser acessado através de uma página WEB, onde um LED poderá ser controlado.
Na postagem Conhecendo o Shield WiFi ESP8266 para Arduino foi feito um apanhado geral sobre a placa. Logo, recomendo que você leia a postagem caso ainda não tenha lido. Além disso, é extremamente importante que você leia também a postagem Shiald e Shield WiFi ESP8266? Será que tem diferença?, pois se tratando do Shield WiFi ESP8266 (também conhecido como ESP8266 ESP-12E UART Wireless WIFI Shield TTL Converter), é possível encontrar no mercado pelo menos três placas que aparentemente são iguais, mas na verdade estas placas possuem alguns pontos que as diferem, até mesmo na questão de funcionamento com o Arduino através de comunicação pela serial nativa.
Como requisito principal para prosseguir nesta publicação, será necessário que você leia a postagem Upgrade de Firmware no Shield WiFi ESP8266 para Arduino. Nela eu ensinei a instalar no Shield WiFi ESP8266 o firmware de comandos AT que é um requisito essencial para a maioria das bibliotecas de comunicação entre o ESP8266 e o Arduino. Depois de ler a postagem e fazer a atualização de firmware do seu shield, retorne para continuar.
Conforme eu já havia mencionado na publicação Comunicando o Shield WiFi ESP8266 com o Arduino através da Serial Nativa, para utilizar o Shield WiFi ESP8266 com o Arduino através da serial nativa (pinos D0 e D1), é necessário que um código seja carregado no shield e que no Arduino seja carregado um outro código para enviar, receber e interpretar os dados tráfegados através da serial nativa. No shield, podemos colocar um firmware de comandos AT e programar o Arduino para fazer o envio dos comandos para o shield com a finalidade de se conectar a uma rede WiFi e possibilitar controlar as entradas e saídas do Arduino.
Nesta publicação vamos utilizar a biblioteca WiFiESP, pois a mesma já conta com todas as funções necessárias para integrar o ESP8266 (Shield WiFi ESP8266 no nosso caso) ao Arduino e atribuir WiFi a placa. A biblioteca WiFiESP funciona através do envio de comandos AT, logo, a conexão a rede sem fio do roteador e toda solicitação feita ao servidor web resultará no envio de comandos AT ao shield.
Para que a biblioteca WiFiESP funcione, é necessário que a versão do firmware de comandos AT seja no mínimo a 0.25 ou superior. Portanto, se você não sabe a versão do firmware de comandos AT do seu shield, basta clicar AQUI e seguir os passos para atualizar a placa com um firmware que possui versão de comandos AT igual a 1.2.0.0 e em seguida retorne para continuar.
Uma coisa que identifiquei durante meus testes com o shield e o Arduino, é que pelo fato da comunicação entre eles ocorrer através da serial nativa (pinos D0 e D1), torna-se necessário que a serial seja de uso exclusivo para a comunicação entre eles. Logo, não recomendo o uso de “Serial.print() / Serial.println()” pra imprimir informações no monitor serial da IDE do Arduino ou em qualquer outro programa que exibe informações da serial.
Por padrão, a biblioteca WiFiESP é configurada para exibir na serial os erros, avisos e outras informações da comunicação entre o Arduino e o ESP8266. Conforme já informei antes, a serial deve ficar liberada para a comunicação entre o Arduino e o shield. Portanto, editei um arquivo da biblioteca e desabilitei a exibição de todas as informações na serial. As únicas informações que serão exibidas no monitor serial, são os comandos AT que a biblioteca envia ao shield para conectá-lo a rede sem fio ou os comandos AT para executar as solicitações feitas ao webserver.
Clicando AQUI você pode fazer o download da biblioteca WiFIESP modificada.
Se você não sabe como instalar bibliotecas na IDE do Arduino, basta clicar no link abaixo, seguir os passos, importar a biblioteca e retornar para continuar:
Arduino – Importando bibliotecas para a IDE
Na pasta de instalação da biblioteca, basta acessar o caminho “WiFiEsp-master\src\utility” e dentro dela há o arquivo “debug.h” que foi editado para desabilitar a exibição de informações na serial. Abrindo o aqruivo no Notepad++, por exemplo, temos as linhas 25, 26, 27, 28 e 29 que mostram uma numeração correspondente para os tipos de informações que serão exibidos no monitor serial. Veja que o número 0 desabilita a exibição de todas as informações no monitor serial. Por fim, na linha 32 configurei o “_ESPLOGLEVEL_” com valor 0:
Se deseja utilizar a biblioteca WiFiESP em outros projetos com ESP8266 e precisa das informações sendo exibidas no monitor serial, basta configurar o “_ESPLOGLEVEL_” com o valor 3 (valor padrão da biblioteca) e salvar o arquivo.
Considerando que o seu Shield WiFi ESP8266 já esteja com um firmware de comandos AT versão 0.25 ou superior, vamos prosseguir.
Acople o shield ao seu Arduino (Uno, Mega, Leonardo ou outra versão que permita acoplamento do shield), coloque todas as vias da DIP switch na posição OFF, conecte um LED entre o pino 13 e o GND, e conecte o cabo USB ao Arduino e ao computador:
Para esta postagem utilizei o Arduino Mega 2560, contudo, o resultado final será o mesmo caso você esteja utilizando outra placa Arduino que permita o acoplamento do shield.
Copie o código abaixo e cole na IDE do Arduino:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include "WiFiEsp.h" //INCLUSÃO DA BIBLIOTECA NECESSÁRIA PARA FUNCIONAMENTO DO CÓDIGO char ssid[] = "NOME_DA_SUA_REDE_WIFI"; //VARIÁVEL QUE ARMAZENA O NOME DA REDE SEM FIO char pass[] = "SENHA_DA_SUA_REDE_WIFI";//VARIÁVEL QUE ARMAZENA A SENHA DA REDE SEM FIO int status = WL_IDLE_STATUS; //STATUS TEMPORÁRIO ATRIBUÍDO QUANDO O WIFI É INICIALIZADO E PERMANECE ATIVO //ATÉ QUE O NÚMERO DE TENTATIVAS EXPIRE (RESULTANDO EM WL_NO_SHIELD) OU QUE UMA CONEXÃO SEJA ESTABELECIDA //(RESULTANDO EM WL_CONNECTED) WiFiEspServer server(80); //CONEXÃO REALIZADA NA PORTA 80 RingBuffer buf(8); //BUFFER PARA AUMENTAR A VELOCIDADE E REDUZIR A ALOCAÇÃO DE MEMÓRIA int statusLed = LOW; //VARIÁVEL QUE ARMAZENA O ESTADO ATUAL DO LED (LIGADO / DESLIGADO) void setup(){ pinMode(LED_BUILTIN, OUTPUT); //DEFINE O PINO COMO SAÍDA (LED_BUILTIN = PINO 13) digitalWrite(LED_BUILTIN, LOW); //PINO 13 INICIA DESLIGADO Serial.begin(9600); //INICIALIZA A SERIAL WiFi.init(&Serial); //INICIALIZA A COMUNICAÇÃO SERIAL COM O SHIELD WIFI ESP8266 WiFi.config(IPAddress(192,168,0,110)); //COLOQUE UMA FAIXA DE IP DISPONÍVEL DO SEU ROTEADOR //INÍCIO - VERIFICA SE O SHIELD ESTÁ ACOPLADO AO ARDUINO, CONECTA A REDE SEM FIO E INICIA O WEBSERVER if(WiFi.status() == WL_NO_SHIELD){ while (true); } while(status != WL_CONNECTED){ status = WiFi.begin(ssid, pass); } server.begin(); //FIM - VERIFICA SE O SHIELD ESTÁ ACOPLADO AO ARDUINO, CONECTA A REDE SEM FIO E INICIA O WEBSERVER } void loop(){ WiFiEspClient client = server.available(); //ATENDE AS SOLICITAÇÕES DO CLIENTE if (client) { //SE CLIENTE TENTAR SE CONECTAR, FAZ buf.init(); //INICIALIZA O BUFFER while (client.connected()){ //ENQUANTO O CLIENTE ESTIVER CONECTADO, FAZ if(client.available()){ //SE EXISTIR REQUISIÇÃO DO CLIENTE, FAZ char c = client.read(); //LÊ A REQUISIÇÃO DO CLIENTE buf.push(c); //BUFFER ARMAZENA A REQUISIÇÃO //IDENTIFICA O FIM DA REQUISIÇÃO HTTP E ENVIA UMA RESPOSTA if(buf.endsWith("\r\n\r\n")) { sendHttpResponse(client); break; } if(buf.endsWith("GET /H")){ //SE O PARÂMETRO DA REQUISIÇÃO VINDO POR GET FOR IGUAL A "H", FAZ digitalWrite(LED_BUILTIN, HIGH); //ACENDE O LED statusLed = 1; //VARIÁVEL RECEBE VALOR 1(SIGNIFICA QUE O LED ESTÁ ACESO) } else{ //SENÃO, FAZ if (buf.endsWith("GET /L")) { //SE O PARÂMETRO DA REQUISIÇÃO VINDO POR GET FOR IGUAL A "L", FAZ digitalWrite(LED_BUILTIN, LOW); //APAGA O LED statusLed = 0; //VARIÁVEL RECEBE VALOR 0(SIGNIFICA QUE O LED ESTÁ APAGADO) } } } } client.stop(); //FINALIZA A REQUISIÇÃO HTTP E DESCONECTA O CLIENTE } } //MÉTODO DE RESPOSTA A REQUISIÇÃO HTTP DO CLIENTE void sendHttpResponse(WiFiEspClient client){ client.println("HTTP/1.1 200 OK"); //ESCREVE PARA O CLIENTE A VERSÃO DO HTTP client.println("Content-Type: text/html"); //ESCREVE PARA O CLIENTE O TIPO DE CONTEÚDO(texto/html) client.println(""); client.println("<!DOCTYPE HTML>"); //INFORMA AO NAVEGADOR A ESPECIFICAÇÃO DO HTML client.println("<html>"); //ABRE A TAG "html" client.println("<head>"); //ABRE A TAG "head" client.println("<link rel='icon' type='image/png' href='https://blogmasterwalkershop.com.br/arquivos/artigos/sub_wifi/icon_mws.png'/>"); //DEFINIÇÃO DO ICONE DA PÁGINA client.println("<link rel='stylesheet' type='text/css' href='https://blogmasterwalkershop.com.br/arquivos/artigos/sub_wifi/webpagecss.css' />"); //REFERENCIA AO ARQUIVO CSS (FOLHAS DE ESTILO) client.println("<title>MasterWalker Shop - Shield WiFi ESP8266 para Arduino</title>"); //ESCREVE O TEXTO NA PÁGINA client.println("</head>"); //FECHA A TAG "head" //AS LINHAS ABAIXO CRIAM A PÁGINA HTML client.println("<body>"); //ABRE A TAG "body" client.println("<img alt='masterwalkershop' src='https://blogmasterwalkershop.com.br/arquivos/artigos/sub_wifi/logo_mws.png' height='156' width='700' />"); //LOGO DA MASTERWALKER SHOP client.println("<p style='line-height:2'><font>Shield WiFi ESP8266 para Arduino</font></p>"); //ESCREVE O TEXTO NA PÁGINA client.println("<p style='line-height:2'><font>(ESP8266 ESP-12E UART Wireless WIFI Shield TTL Converter)</font></p>"); //ESCREVE O TEXTO NA PÁGINA client.println("<font>ESTADO ATUAL DO LED</font>"); //ESCREVE O TEXTO NA PÁGINA if (statusLed == HIGH){ //SE VARIÁVEL FOR IGUAL A HIGH (1), FAZ client.println("<p style='line-height:0'><font color='green'>LIGADO</font></p>"); //ESCREVE "LIGADO" NA PÁGINA client.println("<a href=\"/L\">APAGAR</a>"); //COMANDO PARA APAGAR O LED (PASSA O PARÂMETRO /L) }else{ //SENÃO, FAZ if (statusLed == LOW){ //SE VARIÁVEL FOR IGUAL A LOW (0), FAZ client.println("<p style='line-height:0'><font color='red'>DESLIGADO</font></p>"); //ESCREVE "DESLIGADO" NA PÁGINA client.println("<a href=\"/H\">ACENDER</a>"); //COMANDO PARA ACENDER O LED (PASSA O PARÂMETRO /H) } } client.println("<hr />"); //TAG HTML QUE CRIA UMA LINHA NA PÁGINA client.println("<hr />"); //TAG HTML QUE CRIA UMA LINHA NA PÁGINA client.println("</body>"); //FECHA A TAG "body" client.println("</html>"); //FECHA A TAG "html" delay(1); //INTERVALO DE 1 MILISSEGUNDO } |
Se estiver utilizando o Arduino Leonardo, vá até as linhas 19 e 20 do código, e mude a palavra Serial para Serial1, conforme mostrado na imagem abaixo:
No código você deverá inserir o nome da sua rede WiFi na linha char* ssid = “NOME DA SUA REDE WIFI”;, a senha deverá inserir na linha char* password = “SENHA DA SUA REDE WIFI“; e na linha WiFi.config(IPAddress… deverá inserir um endereço IP disponível na sua rede sem fio, pois este código utiliza IP estático:
Se você não sabe qual a faixa de IP utilizada pela sua rede sem fio, sugiro que leia a postagem Descobrindo a faixa de IP do seu roteador e em seguida retorne para continuar.
No menu “Ferramentas” selecione a opção “Placa” e selecione o modelo do seu Arduino. Ainda no menu “Ferramentas”, selecione a opção “Porta” e marque a porta COM em que seu Arduino foi alocado.
Clique no botão para enviar o código ao Arduino e aguarde o carregamento.
Se o shield estiver acoplado ao Arduino, as vias da DIP switch estiverem em OFF e mesmo assim o código não for carregado no Arduino, recomendo que leia ESTA postagem.
Terminado o carregamento do código no Arduino, desconecte o cabo USB da placa, coloque as vias P1 e P2 do shield na posição ON e conecte o cabo USB ao Arduino novamente.
OBS: enquanto as vias P1 e P2 do shield estiverem na posição ON, você não poderá fazer o envio de códigos para o Arduino, pois a serial nativa vai estar ocupada. Lembre-se de toda vez que mudar a posição das vias da DIP switch, pressionar o botão ESP-RST ou o RESET do Arduino.
Imediatamente abra o monitor serial da IDE do Arduino:
Com o monitor serial aberto você poderá acompanhar os comandos AT que estão sendo enviados ao shield para execução do webserver. Caso não seja apresentado nenhuma informação quando abrir o monitor serial, pressione o botão de RESET do seu Arduino e aguarde.
Veja que no monitor serial o comando “AT+CIPSTA_CUR” mostra o endereço IP para se conectar ao webserver e o comando “AT+CWJAP_CUR” mostra o nome e a senha da rede sem fio em que o shield está conectado:
Copie o endereço IP mostrado no monitor serial, abra o seu navegador de internet, cole o endereço IP e dê ENTER para acessar. Uma página web similar a da imagem abaixo será carregada:
A página web possui um botão que será responsável por ligar / desligar o LED conectado ao pino 13 do Arduino. Pressione o botão para acender / apagar o LED e veja que o estado atual é atualizado na página.
Você também pode acessar a página web através de um smartphone ou tablet, por exemplo.
Veja no vídeo abaixo o resultado final:
Esta foi uma prática simples, pois o intuito foi de mostrar como é fácil utilizar o shield com o Arduino. Todos os projetos que você encontrar na internet e que utilizarem o ESP8266 para atribuir WiFi ao Arduino, poderão ser reproduzidos com este Shield WiFi, a diferença é que você não vai precisar montar divisores de tensão na protoboard para comunicar as plataformas, e em projetos simples não vai ter que se preocupar em alimentar o circuito com fonte externa. Além disso, o seu projeto vai ter uma estética muito mais agradável.
Agora que você já sabe integrar o Shield WiFi ESP8266 com o Arduino a partir de um servidor web, basta modificar o código e implementar algum projeto mais elaborado ou começar a desenvolver seu próprio código.
Gostou deste tutorial? Então deixa seu comentário, dúvida ou sugestão aí embaixo!
Loja online: https://www.masterwalkershop.com.br
Fan page no Facebook: https://www.facebook.com/masterwalkershop
Nos ajude a espalhar conhecimento clicando no botão de compartilhar (f Like) que está mais abaixo.
Obrigado e até a próxima!
Seu feedback é muito importante! Que tal dar uma nota para esta postagem?! Faça sua avaliação aqui embaixo.
Postagem anterior: Como usar com Arduino – Sensor (Detector) de Som – KY-038
Próxima postagem: Como usar com Arduino – Módulo Sensor de Temperatura DS18B20
Boa tarde, tenho um sistema de monitoramento de aquário marinho controlado por APP e usa o shild W 5100 com Arduíno Uno e queria trocar por um esp 01 ou similar usando o mesmo APP.
Estou tentando achar a solução já a algum tempo e o que mais se aproximou foi esse da sterwlker, mas mesmo assim não sei como fazer,
Gostaria se possível, é claro, de uma resposta de como proceder.
Desde já agradeço.
Como faço para colocar aquela imagem
Boa tarde Euler, teria como me ajudar a juntar esse codigo com o codigo da cancela utilizando sensor rfid que você possui nesse blog. Me ajudaria muito.
Ola. gostei bastante. é possivel um arduino se comunicar com outro usando uma rede de internet? por exemplo: com modulo osciloscopio plugado em um arduino…eu coleto os dados…e transmito via interent em tempo real par ao outro arduino..que recebe e interpreta, e reponde tambem. obrigado
Hello,
i follow the proccess and get the following error. have you any idea what goes wrong??Thanks in advance
[WiFiEsp] >>> TIMEOUT >>>
AT
[WiFiEsp] >>> TIMEOUT >>>
AT
[WiFiEsp] >>> TIMEOUT >>>
AT
[WiFiEsp] >>> TIMEOUT >>>
[WiFiEsp] Cannot initialize ESP module
AT+CWDHCP_CUR=1,0
[WiFiEsp] >>> TIMEOUT >>>
AT+CIPSTA_CUR=”192.168.1.3″
[WiFiEsp] >>> TIMEOUT >>>
AT+CIPSTATUS
[WiFiEsp] >>> TIMEOUT >>>
[WiFiEsp] No tag found
Hello Kontos.
It looks like you’re using WiFiESP different from the one I put in the tutorial.
Remove the WiFiESP library you are using and download the modified library from the link below and then install it in the Arduino IDE:
https://blogmasterwalkershop.com.br/arquivos/libs/WiFiEsp-master-mod.zip
This error is showing up because the debug information is showing up on the serial monitor. In the text I say that the communication between the shield and the Arduino should be free of other information that may appear in the serial.
I follow all the instructions and i get the following message in the serial monitor:
[WiFiEsp] >>> TIMEOUT >>>
AT
[WiFiEsp] >>> TIMEOUT >>>
AT
…
[WiFiEsp] Cannot initialize ESP module
AT+CWDHCP_CUR=1,0
…
No tag found
What may go wrong? In addition, i followed all the firmware-update process in success.
Hello Kontos.
It looks like you’re using WiFiESP different from the one I put in the tutorial.
Remove the WiFiESP library you are using and download the modified library from the link below and then install it in the Arduino IDE:
https://blogmasterwalkershop.com.br/arquivos/libs/WiFiEsp-master-mod.zip
This error is showing up because the debug information is showing up on the serial monitor. In the text I say that the communication between the shield and the Arduino should be free of other information that may appear in the serial.