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:

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

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.

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.

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

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

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.

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.

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.

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.

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

 
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.

 
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.

 
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.

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.

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

  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

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

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.
Sem Comentários

Enviar Resposta

*

*

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
  • O Projeto Arduino de Irrigação Automática nos mostra que sempre existe algo escondido que nos arranca um sorriso e nos deixa impressionado. Conhecimento nunca é de mais e desbravar...
  • O ESP32 LoRa WiFi é uma pequena placa de desenvolvimento que integra três formas distintas de comunicação: Wifi, Bluetooth e a rede de comunicação de longo alcance – LoRa...
  • Adicionar em um Projeto ESP32 um Display torna a visibilidade de dados muito mais interessante. Nesse tutorial, demonstraremos como conectar um display de 16×2 em uma ESP32. Utilizaremos também...
  • Continuando a série de tutoriais sobre Micropython ESP32, iremos desenvolver alguns projetos para exemplificar o seu uso. Em todos os exemplos, estaremos utilizando o uPyCraft IDE. O entendimento do...

Artigos Relacionados

  • Esp32 Lora WiFi

    ESP32 LoRa WiFi SX1278

    O ESP32 LoRa WiFi é uma pequena placa de desenvolvimento que integra três formas distintas de comunicação: Wifi, Bluetooth e a rede de comunicação de longo alcance – LoRa...
  • Projeto ESP32 com Display 16×2

    Adicionar em um Projeto ESP32 um Display torna a visibilidade de dados muito mais interessante. Nesse tutorial, demonstraremos como conectar um display de 16×2 em uma ESP32. Utilizaremos também...
  • Micropython ESP32: Parte 2

    Continuando a série de tutoriais sobre Micropython ESP32, iremos desenvolver alguns projetos para exemplificar o seu uso. Em todos os exemplos, estaremos utilizando o uPyCraft IDE. O entendimento do...
  • Micropython ESP32: Parte 1

    Micropython ESP32 é uma linguagem de programação compacta, porém eficiente, derivada de Python 3. Ela inclui diversas subfunções da biblioteca padrão do Python e é otimizada para rodar em...