A conexão wireless é, sem dúvidas, um dos principais motivos para diversos entusiastas da eletrônica utilizar o ESP32 Wifi em seus projetos. Ainda, devido ao seu baixo custo e grande abrangência de aplicação, esse módulo recebe um enfoque especial em aplicações da Internet of Things – IoT. Tendo isso em vista, aprenderemos, ao longo desse tutorial, a utilizar a biblioteca WiFi.
Esse tutorial esp32 está organizado da seguinte maneira: primeiramente, iremos conectar a ESP32 em uma rede WiFi; em seguida, veremos como obter o endereço MAC da placa; por fim, iremos criar um web browser o qual acionaremos ou desligaremos uma LED.
Wifi.h
Essa biblioteca, que já vem instalada na biblioteca do Arduino, fornece diversas funções. Estudaremos algumas delas, através de exemplos, para que possamos desenvolver projetos básicos. O principal objetivo é auxiliar o leitor a iniciar a programação referente a comunicação WiFi.
Exemplo 1: ESP32 Wifi conectando-se a uma rede WiFi
Primeiramente, precisamos incluir a biblioteca. Para isso, utilize o comando:
1 |
#include <WiFi.h> |
Feito isso, vamos criar duas constantes para armazenar o nome e a senha da rede a qual você irá se conectar. Para isso, substitua o conteúdo que está dentro das aspas pelo nome e senha da sua rede, conforme o código abaixo.
1 2 |
const char* ssid = "nome_da_rede"; const char* password = "senha_da_rede"; |
Em seguida, no void setup, faremos a inicialização da comunicação Serial e da comunicação WiFi.
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); } void loop() {} |
Na linha 5 encontra-se a função WiFi.status(), que retorna uma constate informando se houve problema de conexão ou não. Ela está dentro de uma estrutura de repetição, while, que verifica se o status é de conectado (WL_CONNECTED). Se não for, então o haverá um tempo de meio segundo e a verificação irá se repetir. Caso você tenha inserido algum caracter errado no nome da rede e na senha, o seu código ficará mostrando apenas “Connecting to WiFi..”.
Assim que a ESP32 conectar-se, será exibido no monitor serial a mensagem “Connected to the WiFi network”.
WiFi.begin()
Essa função é necessária para que a placa se conecte a rede WiFi. Seu uso normalmente acontece com a passagem de dois parâmetros para a função, o nome e senha da rede. Ela pode também ser usada sem eles, conforme uma explicação detalhada pode ser encontrada na referência da linguagem. Além disso, é possível também usá-la passando como parâmetro apenas o nome da rede, ssid, para redes sem senha.
WiFi.status()
Essa função pode retornar, além de “WL_CONNECTED” quando a placa estiver conectada a rede, algumas das seguintes constantes:
- WL_NO_SSID_AVAIL: quando a rede não for encontrada.
- WL_CONNECT_FAILED: quando as tentativas de conexão falharem.
- WL_DISCONNECTED: quando ela estiver desconectada de uma rede.
- WL_CONNECTION_LOST: quando a conexão for perdida ou interrompida (deixar de receber/enviar pacotes).
- WL_IDLE_STATUS: quando está ou em processo de tentativas de conexão ou as tentativas de conexão atingiram um limite e não foi obtido êxito na conexão, ou seja, a WiFi está ativa mas não conectada.
Existem outras, também, que podem ser conferidas na referência da linguagem. As descritas acima são, entretanto, as mais comuns.
Exemplo 2: ESP32 Wifi obtendo o endereço MAC
Esse endereço é uma identificação única de um dispositivo de rede. É muito interessante, portanto, que saibamos o endereço das placas que usaremos. Observe o código abaixo.
1 2 3 4 5 6 7 8 9 |
#include <WiFi.h> void setup(){ Serial.begin(115200); WiFi.mode(WIFI_MODE_STA); Serial.println(WiFi.macAddress()); } void loop(){} |
Duas novas funções são executadas. Veremos elas em mais detalhes.
WiFi.mode()
Essa função ajusta o modo de operação do chip WiFi da placa. A um nível mais baixo, ela chama a função interna esp_wifi_set_mode(), que, por sua vez, aceita como parâmetro quatro modos de operação. Veremos eles a seguir.
- WIFI_MODE_NULL: nesse modo, a estrutura de dados relativa ao funcionamento de rede não está alocada no chip, ou seja, não foram inicializadas as rotinas nem do modo AP nem do modo STA.
- WIFI_MODE_STA: esse, também chamado de station mode, é o modo de operação para que o dispositivo funcione como um cliente wireless. Um exemplo de uso é quando fizermos um web server: a ESP32 será conectada a uma rede WiFi e fornecerá páginas web no endereço dela. Na figura abaixo visualiza-se um exemplo da topologia nesse modo de operação.
- WIFI_MODE_AP: esse, também conhecido como Access Point mode, é o modo de operação para que o dispositivo funcione como um servidor/roteador. Esse modo é interessante para o caso de monitoramento de dados provenientes de outras placas ESP32. Você ter como clientes não apenas dispositivos como celular e computadores, mas também outras placas que tenham WiFi. Na figura abaixo visualiza-se um exemplo da topologia nesse modo de operação.
- WIFI_MODE_APSTA: esse é um modo de coexistência entre os modos STA e AP. Note que, nesse modo, o ESP32 prioriza o modo STA sob o AP.
WiFi.macAddress()
Essa é uma simples função da classe WiFi, usada para retornar o endereço MAC de um dispositivo de rede. O retorno é o endereço no formato hexadecimal. Por exemplo: “A4:CF:12:45:AE:CC”.
Exemplo 3: ESP32 Wifi Executando um WebServer
Um web server é, em poucas palavras, um programa que responde a solicitações HTTP, processando páginas e códigos e enviando dados para o cliente. O cliente é o quem faz as solicitações para o web browser, e podem haver diversos clientes fazendo diversas requisições em um dado momento. Nesse tutorial, seremos breves quanto ao funcionamento desse sistema. Para realmente compreender cada etapa, é necessário ter um aprofundamento de conceitos de Redes. Porém, nosso objetivo aqui é demonstrar como criar e manipular um servidor, mesmo sem ter pleno conhecimento de arquitetura de redes. Isso é possível devido a programação de alto nível de abstração que a biblioteca WiFi.h nos fornece. Em seguida, analisaremos pedaço por pedaço do código que usaremos.
Cabeçalho
Primeiramente, incluímos a biblioteca WiFi.h. Você poderá ver, em outros códigos, bibliotecas adicionais. Elas são muito úteis para aplicações mais robustas por fornecerem funções avançadas. Porém, não iremos utilizá-las no nosso web server devido a baixa complexidade de iniciar um pela WiFi.h.
Em seguida, definimos a rede e a senha da rede a qual a ESP32 irá se conectar. Nessa etapa, você deve substituir o conteúdo entre aspas pelas credencias da sua rede. Na sequência, declaramos uma variável LED para armazenar o pino o qual iremos manipular pela web. Caso você queira mudar o pino, basta alterar o valor da variável. A última linha do cabeçalho define a porta que o servidor irá utilizar. A mais comum é a utilização da porta 80.
1 2 3 4 5 |
#include <WiFi.h> const char* ssid = "SSID da sua rede"; const char* password = "Senha da sua rede"; int LED = 2; WiFiServer server(80); |
void setup()
Explicaremos essa e a próxima seção de maneira mais dividida, de forma a facilitar o entendimento. No final, você poderá encontrar o código completo caso deseje copiá-lo.
Nessa seção, iniciamos a comunicação serial para visualizarmos, no Serial Monitor, o status da programação. Isso servirá como uma espécie de log, informando-nos o que está acontecendo no sistema. Em seguida, definimos a porta LED, GPIO 2, como saída de dados.
1 2 |
Serial.begin(115200); pinMode(LED, OUTPUT); |
A seguir, teremos as primeiras informações que aparecerão no Monitor Serial quando o código começar a ser executado. O primeiro println é apenas para iniciar a frase abaixo dele em um novo parágrafo. Será exibido, o nome da rede a qual a ESP32 irá tentar se conectar e, logo a seguir, a tentativa de conexão será iniciada.
1 2 3 4 |
Serial.println(); Serial.print("Conectando-se a "); Serial.println(ssid); WiFi.begin(ssid, password); |
Nessa estrutura de repetição, while, verificamos se a conexão obteve sucesso. Enquanto a função WiFi.status não retornar “WL_CONNECTED”, uma constante que define o status da conexão como bem sucedida, serão exibidos pontos no Monitor Serial. Portanto, caso você tenha inserido alguma informação incorreta nas variáveis ssid e password, então o código ficará exibindo pontinhos infinitamente.
1 2 3 4 5 |
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); |
Em caso de sucesso na tentativa de conexão, serão exibidas as mensagens abaixo, inclusive o endereço IP da NodeMCU. Em seguida, o servidor web será iniciado, através da função server.begin. Como definido anteriormente, a porta a qual esse servidor receberá dados será na porta padrão 80.
1 2 3 4 |
Serial.println("WiFi conectada."); Serial.println("Endereço de IP: "); Serial.println(WiFi.localIP()); server.begin(); |
void loop()
Essa função inicializa uma variável client, que recebe os parâmetros do objeto cliente – derivado da classe WiFi.h. Em outras palavras, ele verifica se existe um cliente conectado com dados a serem transmitidos.
1 |
WiFiClient client = server.available(); |
Em seguida, caso exista um cliente, então é notificado no Monitor Serial que um novo client se conectou. Em seguida, criamos uma variável para armazenar a mensagem desse client. A estrutura de repetição a seguir, while, mantém-se até o cliente ser desconectado. Na sequência, na estrutura de decisão if, verificamos se existem bytes, dados, a serem lidos. Caso existam, então os armazenamos na variável c e mostramo-os no Monitor Serial. Por fim, verificamos se o caractere é um símbolo de nova linha, representado por ‘\n’.
1 2 3 4 5 6 7 8 |
if (client) { Serial.println("Novo client."); String currentLine = ""; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n') { |
Em seguida, é verificado, através da função length, se a mensagem terminou – ou seja, se não há mais bytes recebidos. Feito isso, é dado uma resposta ao cliente, através da função client.println, de forma a notificá-lo que a mensagem foi recebida.
1 2 3 4 |
if (currentLine.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); |
Na função client.print, enviamos duas mensagens de texto com marcações HTML. Nessa seção, caso você deseje, pode alterar para exibir outras tags de HTML, personalizando a página. Entretanto, no nosso caso, apenas é criado duas frases, uma para acionar a LED e outra para apagá-la.
1 2 |
client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 2 on.<br>"); client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 2 off.<br>"); |
Na sequência, mandamos uma linha em branco para notificar o fim da mensagem. Logo após encerramos o laço de repetição while, desconectando o client.
1 2 |
client.println(); break; |
Esta estrutura else remete a verificação dos caracteres da mensagem recebida pelo cliente. A primeira, impede a string de ficar com espaços em branco. A segunda, ‘\r’ significa um caractere de retorno, indicando o início de uma nova linha. Por fim, adicionamos ele a variável currentLine como parte da mensagem.
1 2 3 4 5 6 |
} else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } |
Finalmente, verificamos se a requisição foi para acionar a LED (H) ou desliga-la (L). Em seguida, finalizamos a conexão com o cliente através da função client.stop e notificamos no Monitor Serial.
1 2 3 4 5 6 7 8 9 10 11 12 |
if (currentLine.endsWith("GET /H")) { digitalWrite(LED, HIGH); } if (currentLine.endsWith("GET /L")) { digitalWrite(LED, LOW); } } } client.stop(); Serial.println("Client Disconnected."); } } |
Código Completo do Web Server
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 |
#include <WiFi.h> const char* ssid = "SSID da sua rede"; const char* password = "Senha da sua rede"; int LED = 2; WiFiServer server(80); void setup() { Serial.begin(115200); pinMode(LED, OUTPUT); Serial.println(); Serial.print("Conectando-se a "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectada."); Serial.println("Endereço de IP: "); Serial.println(WiFi.localIP()); server.begin(); } void loop() { WiFiClient client = server.available(); if (client) { Serial.println("New Client."); String currentLine = ""; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (c == '\n') { if (currentLine.length() == 0) { client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 2 on.<br>"); client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 2 off.<br>"); client.println(); break; } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } if (currentLine.endsWith("GET /H")) { digitalWrite(LED, HIGH); } if (currentLine.endsWith("GET /L")) { digitalWrite(LED, LOW); } } } client.stop(); Serial.println("Client Disconnected."); } } |
Feito isso, podemos conectar-se à página do web server através do computador, indicando o endereço IP que foi mostrado na Monitor Serial. Confira abaixo como a página deve aparecer em um web browser.
Também podemos acessá-la de um celular ou tablet, como mostra a imagem abaixo.
Conclusão
Por fim, esses foi o primeiro tutorial esp32 envolvendo a comunicação sem fio com a Internet por meio da placa de desenvolvimento NodeMCU ESP32 Wifi. Apresentamos conceitos essenciais para o desenvolvimento de códigos mais complexos e que envolvam mais dispositivos. Em breve, teremos mais projetos envolvendo a ESP. Fique ligado!
Conheça toda Linha ESP32 e Acessórios no site da UsinaInfo.
Como vai? Meu nome é Erik. Meu esp32 não está conectando ao wifi e no monitor serial aparece vários caracteres aleatórios. o que pode ser? O esp é um esp wroom 32
Olá Erik.
Possivelmente esta selecionado a baud rate diferente da que foi programada na ESP.
Pois a ESP pode estar transmitindo dados a 115200 por exemplo, mas estar no Monitor Serial o baud rate de 9600.
Nesse caso o Monitor Serial vai receber dados que ele não consegue interpretar, gerando caracteres aleatórios.
Ola bom dia
estou tentando reproduzir o experimento mas esta aparecendo o seguinte erro !!!
Arduino: 1.8.9 (Windows 10), Placa:”NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Disabled, All SSL ciphers (most compatible), 4M (no SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 115200″
C:\Users\ANTONI~1.SIL\AppData\Local\Temp\arduino_modified_sketch_492244\Blink.ino: In function ‘void setup()’:
Blink:15:28: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
WiFi.begin(ssid, password);
^
In file included from C:\Users\ANTONI~1.SIL\AppData\Local\Temp\arduino_modified_sketch_492244\Blink.ino:1:0:
D:\Antonio\Arduino_IDE\IDE\arduino-1.8.9-windows\arduino-1.8.9\libraries\WiFi\src/WiFi.h:79:9: error: initializing argument 1 of ‘int WiFiClass::begin(char*, const char*)’ [-fpermissive]
int begin(char* ssid, const char *passphrase);
^
exit status 1
invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
Saber me informar o q pode estar causando ??
Desde já agradeço
Att
Antonio Sousa
Olá Antonio.
O erro se refere a linha WiFi.begin(ssid, password);
Nessa linha é necessário substituir o ssid pelo nome da sua rede WiFi, e password pela senha da mesma.
Olá, boa tarde!
Estou tentando adequar o código para poder entrar com os dados da rede (ssid e senha) através de um display touch (Nextion).
Assim, conseguiria utilizá-lo em outras redes sem precisar alterar no código, bastaria digitar no display os dados da nova rede.
Mas esbarra no tipo de variável const char* que não está aceitando o texto enviado pelo display. Qual tipo de variável const char* aceita?
Exemplo:
const char* ssid = variavel_A;
const char* password = variavel_B;
Sds,
Edelson
Boa tarde Edelson.
Primeiro, precisaria retirar a palavra chave “const”, pois ela significa “constante”, ou seja, que não altera o seu valor. Depois, basta passar como parâmetro para ela uma string entre aspas duplas, por exemplo “NomeDaRedeNovo”.
Outro detalhe, o * depois de char significa que ela está apontando para um endereço de memória. Mais detalhes sobre isso podem ser encontrados em em pesquisas sobre “Ponteiros”.
Oi boa tarde,
nao consigo ler o codigo MAC
Olá, estou tentando conetcar e no monitor serial aparece
“conectando a rede”
e onde apareceria a senha e o IP, fica aparecendo apenas pontinhos e não conecta.
Qual será o problema?
Eu já tentei de tudo e não consigo fazer funcionar.
Olá Yolanda, tudo bem?
Confira se o SSID e senha da rede estão bem certinhas, pois os pontinhos significam que está tentando se conectar e não consegue.
Boa tarde, como faço para acessar minha esp32 que está conectada a uma rede e eu estando em outro local e em outra rede?
Boa Tarde Tito! O acesso externo de dados de um equipamento como o ESP é possível apenas caso a sua rede residencial possua um IP fixo, para isto você deve entrar em contato com a sua empresa de Internet e solicitar este serviço.
Boa noite tudo bem?
Teria como mandar os dados em rotas diferentes ? Tipo 192.168.0.101:8080/teste.
Boa noite,
Precisaria enviar informações da minha interface diretamente para esp32, mas como faria essa comunicação? Post para rota 192.168.0.101:8080/teste ? E no esp32 como pegaria essa informação vinda do wifi?
boa tarde, gostaria de enviar esses dados recolhidos do meu codigo para um outro site, como eu eu altero o local de destino?
Boa Tarde Marcos! Esta questão de envio de dados além das páginas criadas pelo próprio microcontrolador devem ser analisadas caso a caso, precisa ver a possibilidade de integração de dados e demais informações que alterariam a estrutura do código base.
Boa Tarde, fiz tudo como você fez, mas aparece essa sequência de número 14.05.09.853 e vários pontos quando a velocidade é 115200, quando é outra velocidade aparece várias interrogações.
Bom Dia Adrian! Pelo que me parece, o ESP32 não está conseguindo acessar a rede para acessar um IP, se os dados de rede estão ok e não são o problema, recomento que tente fixar um IP para tentar resolver o problema.
Boa Tarde Matheus, deu certo. Agora eu queria deixar o esp32 no WiFi e acessar o endereço de IP que produz com o 4G do meu celular, mas infelizmente não consigo, só consigo acessar o site com a mesma rede conectada ao ESP32, você tem alguma solução para isso ?
PS: Eu consegui apenas com o Blynk, mas não queria depender dele.
Bom Dia Adrian! Realmente, nestes exemplos que demos, o ESP32 e o dispositivo de controle precisam estar na mesma rede para funcionar. Caso deseje acessá-lo remotamente, é necessário o desenvolvimento de um esquema um pouco diferente utilizando sistemas como o No-IP, por exemplo.
Boa tarde! No exemplo 3, ensina como enviar e receber dados, é?
Bom Dia Lívia! O exemplo 3 ensina como criar um Web Server para poder controlar o liga e desliga de um LED, por exemplo.
Bom dia!
Estou querendo fazer um projeto utilizando o Módulo ESP8266 ou o ESP32.
Porém estou com algumas dúvidas.
1º Qual a diferença dos dois módulos?
2º Eu consigo enviar um sinal para o computador ou uma página da web utilizando um dos dois?
Eu vi vários tutorais na internet de gente controlando leds e lâmpadas pela página web utilizando o ESP8266 ESP-12.
Porém ao invés de mandar sinal da página para o módulo, eu quero que através de um botão utilizando o módulo, mande um sinal para a página web ou computador.
Consigo fazer isso?
Alguém pode me ajudar, por favor?
Bom Dia Everton! Este procedimento que quer fazer é possível sim, infelizmente não temos nenhum projeto semelhante até o momento, porém temos diversos projetos que podem ser utilizados como base para o que deseja, verifique em nosso blog projetos como os de Automação Residencial que lhe darão uma base do funcionamento, algumas lógicas porém deverão ser alteradas.
Legal que você é Santo Angelo, RS
boa noite, visualizando comentários sobre pontinhos e tendo como resposta que SSID e senha da rede estivesse errado, resolvi conferir e esta correto. continua do mesmo jeito assim……………………………………………………………………………………………………………………………………… e não sai disto. me ajude por favor?
Olá Adalton! Se este erro acontece quando carrega o código para o ESP32, o que está acontecendo é que você não está conseguindo finalizar este procedimento de gravação, uma vez que para finalizá-lo você deve pressionar o botão “Io0”. Maiores informações você encontra no seguinte artigo: https://www.usinainfo.com.br/blog/esp32-tutorial-com-primeiros-passos/
Bom dia, como todo novato to tendo dificuldades de acesso a internet em um caso, quando etou conectado na IDE com ubs todos exemplos funcionam inclusive o autoconnect etc, mas se tiro o cabo usb já era, não conecta em em nenhuma rede, o que está errado, Grato
Olá Fernando! Após desconectar o dispositivo da USB do computador você utiliza qual fonte de alimentação para o ESP32? Verifique se esta está sendo suficiente e dentro das especificações do mesmo.
Ola, primeiramente parabens pelo conteudo.
Quero fazer um projeto semelhante, porem com o arduino recebendo dados de um painel (painel de consumo de energia elétrica), e enviar esses dados a um aplicativo, no qual eu consiga monitorar pelo aplicativo o consumo.
Consigo fazer isso através do ESP32 ? (no caso o arduino se conecta a rede onde fica o painel)
Olá Willy! O ESO32 e o Arduino, ambos são microcontroladores. Caso deseje incluir uma capacidade de comunicação com a rede ao Arduino, é possível utilizar um Ethernet Shield como demonstrado no seguinte artigo: https://www.usinainfo.com.br/blog/utilizando-o-ethernet-shield-w5100-com-arduino/
Boa tarde,
Gostaria de saber se o Esp consegue alimentar tranquilamente o rele? sendo que 3.3v
Posso utilizar qualquer porta? por exemplo a D2
Olá Gabriel! No início também tive esta dúvida então decidi testar, com os módulos que tinha disponível na minha bancada, mesmo que 5V, todos funcionaram sem problema, acho que devido ao fato de que independentemente do sinal de 3,3V, a alimentação utilizada ainda foi de 5V.
Sempre aparece isso: cannot declare variable ‘server’ to be of abstract type ‘WiFiServer’
[…] o código abaixo no site da Usinainfo, e desta vez funcionou. Lembre-se de alterar “seussid” e […]