Gerenciando Múltiplas Redes Wi-Fi com o ESP32

O ESP32 é um microcontrolador poderoso e versátil, amplamente utilizado em aplicações de Internet das Coisas (IoT) devido às suas capacidades integradas de Wi-Fi e Bluetooth. Em muitos projetos, é comum que o dispositivo precise se conectar a diferentes redes Wi-Fi, seja por mobilidade, redundância ou facilidade de uso. Este artigo explora como gerenciar múltiplas redes Wi-Fi com o ESP32, permitindo que ele se conecte automaticamente à melhor ou à primeira rede disponível, tornando seus projetos mais flexíveis e robustos.

Por Que Gerenciar Múltiplas Redes Wi-Fi?🔗

Antes de mergulharmos nas implementações técnicas, é importante compreender as razões pelas quais gerenciar múltiplas redes Wi-Fi é benéfico:

  • Mobilidade: Em aplicações onde o ESP32 é móvel, como robôs ou dispositivos vestíveis, ele pode se mover entre diferentes áreas cobertas por redes Wi-Fi distintas.
  • Redundância: Ter múltiplas redes configuradas garante que, se uma rede falhar, o dispositivo possa se conectar a outra disponível, aumentando a confiabilidade.
  • Facilidade de Configuração: Pré-configurar o ESP32 com várias redes conhecidas evita a necessidade de reprogramação ao mudar o dispositivo de local.
  • Escalabilidade: Em ambientes com múltiplos pontos de acesso, como empresas ou casas com extensores de sinal, o ESP32 pode se conectar ao ponto com o melhor sinal.

Configurando o ESP32 para Conectar-se a Múltiplas Redes🔗

Para permitir que o ESP32 gerencie múltiplas redes Wi-Fi, precisamos armazenar as credenciais de cada rede e programá-lo para tentar se conectar a elas. Existem diferentes abordagens para alcançar isso:

Utilizando a Classe WiFiMulti

A biblioteca WiFiMulti facilita o gerenciamento de múltiplas redes. Ela permite adicionar várias redes com suas credenciais, e o ESP32 tentará se conectar àquelas que estiverem disponíveis, escolhendo a de melhor qualidade de sinal.

Como Funciona o WiFiMulti

  • Armazenamento de Redes: Você adiciona as redes conhecidas ao objeto WiFiMulti.
  • Processo de Conexão: Quando wifiMulti.run() é chamado, o ESP32 escaneia as redes disponíveis e tenta se conectar àquelas cujos SSIDs correspondem aos armazenados.
  • Seleção da Melhor Rede: Caso várias redes conhecidas estejam disponíveis, ele se conectará àquela com o sinal mais forte.

Implementação Passo a Passo

Vamos implementar um exemplo prático de como gerenciar múltiplas redes Wi-Fi usando o ESP32 e a classe WiFiMulti.

Materiais Necessários

  • Módulo ESP32.
  • Cabo USB para conexão ao computador.
  • Arduino IDE com suporte ao ESP32 configurado.

Passo 1: Configurando o Ambiente

Certifique-se de que o Arduino IDE está configurado para trabalhar com o ESP32. Caso ainda não tenha feito isso, adicione o URL de gerenciadores de placas do ESP32 nas preferências do Arduino IDE e instale as placas ESP32 via gerenciador de placas.

Passo 2: Escrevendo o Código

Aqui está o código que permite ao ESP32 gerenciar múltiplas redes Wi-Fi:

#include <WiFi.h>
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
void setup()
{
  Serial.begin(115200);
  // Adicionando as redes Wi-Fi
  wifiMulti.addAP("RedeCasa", "senhaCasa");
  wifiMulti.addAP("RedeEscritorio", "senhaEscritorio");
  wifiMulti.addAP("RedeCelular", "senhaCelular");
  Serial.println("Conectando ao Wi-Fi...");
  while (wifiMulti.run() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(1000);
  }
  Serial.println();
  Serial.println("Conectado com sucesso!");
  Serial.print("Endereço IP: ");
  Serial.println(WiFi.localIP());
}
void loop()
{
  // Aqui você pode inserir o código que será executado continuamente
}

Passo 3: Entendendo o Código

  • Inclusão das Bibliotecas:
#include <WiFi.h>
#include <WiFiMulti.h>
Importamos as bibliotecas necessárias para conexão Wi-Fi e gerenciamento de múltiplas redes.
  • Instanciando o WiFiMulti:
WiFiMulti wifiMulti;
Criamos um objeto wifiMulti para gerenciar as redes Wi-Fi.
  • Função setup():
    • Inicialização da Serial:
Serial.begin(115200);
Iniciamos a comunicação serial para monitorar o processo.
  • Adicionando Redes Wi-Fi:
wifiMulti.addAP("RedeCasa", "senhaCasa");
wifiMulti.addAP("RedeEscritorio", "senhaEscritorio");
wifiMulti.addAP("RedeCelular", "senhaCelular");
Adicionamos as redes conhecidas ao objeto wifiMulti.
  • Tentativa de Conexão:
while (wifiMulti.run() != WL_CONNECTED)
{
  Serial.print(".");
  delay(1000);
}
O código permanece no loop enquanto não estiver conectado a uma das redes adicionadas.
  • Função loop():
A função loop() está vazia neste exemplo, mas é onde você adicionaria o código principal do seu projeto.

Passo 4: Carregando e Testando o Código

  • Conecte o ESP32 ao computador e selecione a porta correta no Arduino IDE.
  • Carregue o código no ESP32.
  • Abra o Monitor Serial para observar a saída.
  • O ESP32 tentará se conectar às redes adicionadas e exibirá o endereço IP ao conectar-se.

Lidando com Desconexões e Reconexões

Para garantir que o ESP32 permaneça conectado, mesmo se a rede Wi-Fi mudar ou houver uma queda de conexão, podemos modificar o código para verificar periodicamente a conexão.

Atualizando o loop()

void loop()
{
  if (wifiMulti.run() != WL_CONNECTED)
  {
    Serial.println("Desconectado. Tentando reconectar...");
  }
  else
  {
    // Código quando conectado
    // Por exemplo, leitura de sensores ou envio de dados
  }
  delay(1000);
}

Com essa modificação, o ESP32 verifica a cada segundo se ainda está conectado. Se não estiver, o wifiMulti.run() tentará reconectar-se a uma das redes disponíveis.

Armazenando Credenciais Externamente🔗

Em projetos mais complexos, pode ser conveniente armazenar as credenciais das redes em arquivos externos ou permitir que o usuário final configure as redes sem a necessidade de alterar o código.

Utilizando o Sistema de Arquivos SPIFFS ou LittleFS

O ESP32 suporta sistemas de arquivos como SPIFFS ou LittleFS, permitindo armazenar arquivos na memória flash.

Passo 1: Criando um Arquivo JSON com as Redes

Crie um arquivo chamado networks.json com o seguinte conteúdo:

[
  {"ssid": "RedeCasa", "password": "senhaCasa"},
  {"ssid": "RedeEscritorio", "password": "senhaEscritorio"},
  {"ssid": "RedeCelular", "password": "senhaCelular"}
]

Passo 2: Carregando o Arquivo no ESP32

Use um plugin do Arduino IDE para carregar o sistema de arquivos (por exemplo, o ESP32 Sketch Data Upload).

Passo 3: Modificando o Código para Ler o Arquivo

Inclua as seguintes bibliotecas:

#include <FS.h>
#include <SPIFFS.h>
#include <ArduinoJson.h>

Atualize o setup() para ler as redes do arquivo:

void setup()
{
  Serial.begin(115200);
  SPIFFS.begin(true);
  File file = SPIFFS.open("/networks.json", "r");
  if (!file)
  {
    Serial.println("Falha ao abrir o arquivo");
    return;
  }
  DynamicJsonDocument doc(1024);
  DeserializationError error = deserializeJson(doc, file);
  if (error)
  {
    Serial.println("Falha ao interpretar o JSON");
    return;
  }
  for (JsonObject obj : doc.as<JsonArray>())
  {
    const char* ssid = obj["ssid"];
    const char* password = obj["password"];
    wifiMulti.addAP(ssid, password);
    Serial.print("Adicionado Wi-Fi: ");
    Serial.println(ssid);
  }
  file.close();
  Serial.println("Conectando ao Wi-Fi...");
  while (wifiMulti.run() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(1000);
  }
  Serial.println();
  Serial.println("Conectado com sucesso!");
  Serial.print("Endereço IP: ");
  Serial.println(WiFi.localIP());
}

Vantagens Desta Abordagem

  • Flexibilidade: Adicionar ou remover redes sem reprogramar o ESP32.
  • Segurança: As credenciais não ficam expostas no código-fonte.
  • Escalabilidade: Facilita o gerenciamento quando há muitas redes.

Utilizando um Portal de Configuração com WiFiManager🔗

A biblioteca WiFiManager permite que usuários finais configurem as redes Wi-Fi através de um portal web, eliminando a necessidade de programar as credenciais diretamente.

Como Funciona

  • O ESP32 inicia como um ponto de acesso (AP) com um portal de configuração.
  • O usuário conecta-se ao AP e acessa uma página web.
  • A partir dessa página, o usuário escolhe a rede Wi-Fi desejada e fornece a senha.
  • O ESP32 salva as credenciais e conecta-se à rede selecionada.

Implementação Básica com WiFiManager

Instale a biblioteca WiFiManager através do gerenciador de bibliotecas do Arduino IDE.

#include <WiFi.h>
#include <WiFiManager.h>
void setup()
{
  Serial.begin(115200);
  WiFiManager wm;
  // Inicia o portal de configuração
  if (!wm.autoConnect("ESP32-Config"))
  {
    Serial.println("Falha na conexão ou tempo esgotado");
    ESP.restart();
  }
  Serial.println("Conectado com sucesso!");
  Serial.print("Endereço IP: ");
  Serial.println(WiFi.localIP());
}
void loop()
{
  // Seu código principal aqui
}

Personalizando o Portal

O WiFiManager permite personalizar o portal de configuração, incluindo:

  • Definir parâmetros adicionais: Como endereços de servidores, chaves de API, etc.
  • Personalizar a aparência: Alterando estilos CSS e textos.
  • Implementar validações: Garantindo que os dados inseridos são válidos.

Boas Práticas de Segurança🔗

Ao lidar com múltiplas redes e armazenar credenciais, é fundamental considerar a segurança:

  • Criptografia de Dados: Considere criptografar as credenciais ao armazená-las no sistema de arquivos.
  • Proteção do Portal: Se utilizar um portal de configuração, implemente autenticação para evitar acesso não autorizado.
  • Atualizações Regulares: Mantenha o firmware do ESP32 atualizado para proteger contra vulnerabilidades conhecidas.
  • Limitação de Acesso: Restrinja o acesso físico ao dispositivo, especialmente se armazenar informações sensíveis.

Casos de Uso Reais🔗

Automação Residencial

Em sistemas de automação residencial, dispositivos ESP32 podem precisar se conectar a diferentes redes domésticas, como a rede principal, redes de convidados ou diferentes extensores Wi-Fi, garantindo cobertura completa em toda a casa.

Monitoramento Ambiental

Sensores ambientais portáteis podem ser movidos entre diferentes locais, como escritórios, laboratórios e áreas externas, exigindo que o ESP32 se conecte a redes Wi-Fi distintas sem intervenção manual.

Dispositivos Industriais Móveis

Em ambientes industriais, equipamentos móveis com ESP32 podem se deslocar entre diferentes pontos de acesso configurados, mantendo a conectividade e permitindo o monitoramento contínuo.

Considerações Finais🔗

Gerenciar múltiplas redes Wi-Fi com o ESP32 é uma funcionalidade poderosa que aumenta a flexibilidade e a robustez dos seus projetos IoT. Seja para permitir mobilidade, fornecer redundância ou facilitar a configuração por usuários finais, as abordagens apresentadas neste artigo oferecem soluções práticas para diferentes cenários.

Ao implementar essas técnicas, você está capacitando seus dispositivos a operar efetivamente em diversos ambientes, tornando-os mais adaptáveis e confiáveis. Lembre-se sempre de considerar aspectos de segurança ao lidar com credenciais e redes para proteger seus dispositivos e dados.

Explore e experimente as diferentes abordagens para encontrar a que melhor se adapta às necessidades do seu projeto. Com prática e aprofundamento, você será capaz de criar soluções IoT cada vez mais eficientes e inovadoras.

Este artigo faz parte do grupo Conectando o ESP32 à Rede Wi-Fi
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Artigos Relacionados