ESP32 WiFi: Comunicação com a Internet

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...

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:

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.

Em seguida, no void setup, faremos a inicialização da comunicação Serial e da comunicação WiFi.

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.

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.

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.

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.

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.

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.

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.

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’.

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.

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.

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.

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.

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.

Código Completo do Web Server

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.

Categorias
ESP32

Bacharel em Ciência da Computação pela URI – Campus de Santo Ângelo, com experiência no desenvolvimento de pesquisas em Robótica e prototipação de Sistemas Robóticos.
34 Número de Comentários
  • Erik Jhones Freitas Nascimento
    19 julho 2019 at 16:58
    Deixe seu Comentário

    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

    • Equipe Usinainfo
      29 julho 2019 at 10:02
      Deixe seu Comentário

      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.

  • Antonio sousa
    15 agosto 2019 at 10:51
    Deixe seu Comentário

    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

    • Equipe Usinainfo
      22 agosto 2019 at 14:19
      Deixe seu Comentário

      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.

  • EDELSON MARTINS
    5 setembro 2019 at 16:09
    Deixe seu Comentário

    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

    • Equipe Usinainfo
      6 setembro 2019 at 15:03
      Deixe seu Comentário

      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”.

    • Ivam
      22 março 2020 at 17:33
      Deixe seu Comentário

      Oi boa tarde,
      nao consigo ler o codigo MAC

  • Yolanda
    1 outubro 2019 at 14:20
    Deixe seu Comentário

    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.

    • Equipe Usinainfo
      18 outubro 2019 at 14:32
      Deixe seu Comentário

      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.

  • Tito Alves
    6 janeiro 2020 at 17:29
    Deixe seu Comentário

    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?

    • Matheus Gebert Straub
      16 janeiro 2020 at 18:59
      Deixe seu Comentário

      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.

  • Gabriela Teixeira
    17 abril 2020 at 21:05
    Deixe seu Comentário

    Boa noite tudo bem?
    Teria como mandar os dados em rotas diferentes ? Tipo 192.168.0.101:8080/teste.

  • Gabriela Teixeira
    17 abril 2020 at 21:26
    Deixe seu Comentário

    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?

  • marcos
    25 junho 2020 at 12:46
    Deixe seu Comentário

    boa tarde, gostaria de enviar esses dados recolhidos do meu codigo para um outro site, como eu eu altero o local de destino?

    • Matheus Gebert Straub
      30 junho 2020 at 17:32
      Deixe seu Comentário

      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.

  • Adrian gadelha
    22 outubro 2020 at 14:26
    Deixe seu Comentário

    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.

    • Matheus Gebert Straub
      23 outubro 2020 at 09:03
      Deixe seu Comentário

      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.

  • Adrian Gadelha
    29 outubro 2020 at 18:32
    Deixe seu Comentário

    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.

    • Matheus Gebert Straub
      27 novembro 2020 at 10:55
      Deixe seu Comentário

      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.

  • Lívia
    4 novembro 2020 at 16:34
    Deixe seu Comentário

    Boa tarde! No exemplo 3, ensina como enviar e receber dados, é?

    • Matheus Gebert Straub
      27 novembro 2020 at 11:15
      Deixe seu Comentário

      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.

  • Everton
    11 novembro 2020 at 12:09
    Deixe seu Comentário

    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?

    • Matheus Gebert Straub
      27 novembro 2020 at 12:41
      Deixe seu Comentário

      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.

  • miguel alexandre wisintainer
    14 novembro 2020 at 09:31
    Deixe seu Comentário

    Legal que você é Santo Angelo, RS

  • adalton pedrosa
    4 janeiro 2021 at 21:08
    Deixe seu Comentário

    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?

  • Fernando
    8 janeiro 2021 at 04:48
    Deixe seu Comentário

    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

    • Matheus Gebert Straub
      4 março 2021 at 11:55
      Deixe seu Comentário

      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.

  • Willy Rocha de Melo
    8 março 2021 at 23:33
    Deixe seu Comentário

    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)

  • Gabriel
    11 maio 2021 at 14:53
    Deixe seu Comentário

    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

    • Matheus Gebert Straub
      11 maio 2021 at 15:19
      Deixe seu Comentário

      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.

  • Lucas Russignoli Peixoto
    30 outubro 2021 at 17:05
    Deixe seu Comentário

    Sempre aparece isso: cannot declare variable ‘server’ to be of abstract type ‘WiFiServer’

  • Franzininho Wi-Fi (ESP32-S2) com a IDE do Arduino – Fritzenlab eletrônica
    13 abril 2024 at 23:37
    Deixe seu Comentário

    […] o código abaixo no site da Usinainfo, e desta vez funcionou. Lembre-se de alterar “seussid” e […]

  • Deixe seu Comentário

    *

    *

    Sobre nós

    Hoje a Usinainfo é um dos maiores ecommerces de Ferramentas, Peças para Eletrônica, Componentes Eletrônicos, Sensores e Arduino do Brasil, contando com uma grande diversidade de produtos na linha de eletrônica.

    Sugestões

    Artigos Relacionados