Usando o Wi-Fi Manager no NodeMCU para digitalizar e conectar-se a redes Wi-Fi

Tempo de leitura: 5 minutes

Dispositivos baseados em IoT estão se tornando cada vez mais populares entre nós, estima-se que haverá cerca de 1,5 bilhão de dispositivos conectados à Internet até o ano de 2022. Portanto, os engenheiros do futuro estão ansiosos para aprender como construir dispositivos IoT, apoiando que lá há várias placas de desenvolvimento para permitir a prototipagem rápida de IoT. Usamos várias placas populares, como Arduino, ESP8266, ESP32 e Raspberry Pi para desenvolver projetos de IoT, que você pode verificar nesta seção.

Como sabemos, a maioria dos dispositivos IoT precisam estar conectados à Internet para iniciar a operação. Enquanto prototipamos ou testamos nossos projetos de IoT, podemos codificar facilmente o SSID e a senha do Wi-Fi em nosso programa e fazê-lo funcionar. Mas quando o dispositivo é entregue ao consumidor, ele/ela deve ser capaz de escanear e se conectar à própria rede Wi-Fi sem alterar o programa. É aqui que o gerenciador de Wi-Fi ESP8266 será útil, esta função de gerenciador de Wi-Fi pode ser adicionada ao programa existente para fornecer uma opção para os usuários digitalizarem e se conectarem a qualquer rede Wi-Fi e, uma vez que a conexão seja estabelecida, dispositivo pode executar sua função normal até que a conexão de rede precise ser alterada novamente.

Neste projeto, vamos usar o NodeMCU e programá-lo para operar em dois modos diferentes, ou seja, modo de ponto de acesso (AP) e modo de estação (STA). No modo AP, NodeMCU funcionará como um roteador Wi-Fi emitindo seu próprio sinal Wi-Fi, você pode usar qualquer smartphone para se conectar a esta rede Wi-Fi e abrir uma página da web na qual podemos configurar o novo Wi-Fi SSID e senha, assim que as novas credenciais forem definidas, o NodeMCU entrará automaticamente no modo Estação e se conectará a este novo Wi-Fi. O novo SSID e senha do Wi-Fi serão lembrados para que o dispositivo seja conectado a esta rede sempre que for ligado novamente.

 

Componentes necessários

  • NodeMCU – Esp8266
  • ProtoBoard
  • Push Button (Apertar botões)
  • LEDs
  • Fios de conexão

Diagrama de circuito

Para indicar se o módulo está no ponto de estação ou no ponto de acesso, usei dois LEDs. Se o LED vermelho estiver piscando, significa que o módulo está no modo de estação e há uma conexão wi-fi ativa à qual está conectado. Se o LED verde estiver aceso, significa que o módulo está no modo de ponto de acesso e aguardando que o usuário configure a rede wi-fi disponível. O botão de pressão é usado para alternar entre o ponto de acesso e o modo de estação, se o botão for pressionado ao ligar o dispositivo, o NodeMCU entrará no modo de ponto de acesso, onde as novas credenciais de Wi-Fi podem ser inseridas. Assim que o dispositivo se conectar a uma rede Wi-Fi, ele piscará um LED vermelho conforme mostrado abaixo. Mais sobre isso é discutido na seção de programação.

Posteriormente, você pode substituir a seção piscando do led vermelho com o funcionamento real do seu projeto. Digamos, por exemplo, que se você construiu um dispositivo para medir temperatura e umidade, em vez de piscar o led vermelho, você pode executar esta função.

 

Explicação do código

Antes de entrar na codificação, existem certas bibliotecas, que devem ser baixadas. Use os links abaixo para baixar as bibliotecas e adicioná-las ao seu Arduino IDE

Assim que as bibliotecas forem adicionadas, podemos começar nossa programação. O programa completo para este projeto pode ser encontrado no final desta página, a explicação do mesmo é a seguinte. Começamos nosso programa adicionando os arquivos de cabeçalho necessários.

#include <ESP8266WiFi.h>         //https://github.com/esp8266/Arduino
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager​

Vamos codificar de forma que, ao ligar o módulo, se a chave estiver no estado ON, ele definirá o ESP para o modo Access Point (AP) e redefinirá as configurações salvas. Ele permanecerá neste modo até, a menos que o usuário use um dispositivo habilitado para Wi-Fi e o conecte a este ponto de acesso. Quando conectado a este ponto de acesso, ele redirecionará o usuário para uma página da web, onde o usuário pode configurar o novo SSID e senha. Após definir as credenciais, o ESP se reinicializará e funcionará como um modo Estação (STA).

Com o novo SSID e senha, que é fornecido pelo usuário na página web, ele tenta estabelecer uma conexão e, se a conexão for estabelecida, nosso processo de conexão será concluído com sucesso. Se o estabelecimento da conexão falhar, o processo é repetido desde o início.

O código abaixo será ativado somente quando o módulo for energizado junto com a chave no estado ligado. Esta parte do código redefine a configuração e executa o ESP no modo de ponto de acesso. Se a conexão for estabelecida, o processo de conexão é concluído e o programa vai para o loop void().

void setup() {
    Serial.begin(115200);
    pinMode(trigger,INPUT);
    pinMode(LED,OUTPUT);
    pinMode(power,OUTPUT);
    if(digitalRead(trigger) == HIGH){
    digitalWrite(power,HIGH);
    WiFiManager wifiManager;
    wifiManager.resetSettings();
    wifiManager.autoConnect("CapSistema WiFi Manager");
    Serial.println("connected :)");
  }
}

A próxima parte do código é usada para saber o status da conexão sem fio. Ele verificará o código continuamente e indicará ao usuário se ele está conectado a alguma rede sem fio. Se a luz vermelha piscar continuamente, significa que a conexão foi estabelecida. Se o led verde estiver piscando, isso indica que o ESP não está conectado a uma rede e que as configurações anteriores foram redefinidas. Mesmo que a alimentação seja fornecida ao módulo e nenhum dos LEDs esteja aceso, isso significa que o módulo perdeu sua conexão com a rede

void loop() {
  if (WiFi.status() == WL_CONNECTED)
        {
          digitalWrite(power,LOW);
          while(WiFi.status() == WL_CONNECTED){
            digitalWrite(LED,HIGH);
            delay(500);
            digitalWrite(LED,LOW);
            delay(200);  
          }
        } else {
          digitalWrite(LED,LOW);
        }

 

NodeMCU (Esp8266) Wi-Fi Manager funcionando

Você também pode seguir as etapas abaixo para verificar se o programa está funcionando conforme o esperado.

Etapa 1: conecte a alimentação ao módulo junto com a chave LIGADA. O LED verde começará a brilhar para indicar que o módulo ESP está no modo Access Point (AP), conforme mostrado abaixo

Etapa 2: use qualquer dispositivo habilitado para wi-fi para se conectar a este ponto de acesso. Selecione a opção de gerenciamento do roteador para redirecionar para uma página da web. Selecione Configurar Wi-Fi.

Etapa 3: O ESP fará a varredura e mostrará todas as redes disponíveis. Selecione a rede desejada e digite a senha.

Etapa 4: Se o LED vermelho começar a piscar, isso indica que o ESP se conectou à rede Wi-Fi.

Etapa 5: se o estabelecimento da conexão falhar, comece a partir da etapa 1.

Dessa forma, podemos eliminar o fardo da codificação sempre que você precisar se conectar a uma nova rede. Espero que você tenha entendido o tutorial e aprendido algo útil, se você tiver alguma dúvida, fique à vontade para deixá-la na seção de comentários abaixo ou use nossos fóruns para outras questões técnicas.

#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
// necessário para a biblioteca
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager

#define trigger D0
#define LED D2
#define power D3

void setup() {
    Serial.begin(115200);
    pinMode(trigger,INPUT); 
    pinMode(LED,OUTPUT); 
    pinMode(power,OUTPUT);    
    if(digitalRead(trigger) == HIGH){
    digitalWrite(power,HIGH);
    WiFiManager wifiManager;
    wifiManager.resetSettings();
    wifiManager.autoConnect("CapSistema WiFi Manager");
    Serial.println("connected :)");
  }     
}
void loop() { 
  if (WiFi.status() == WL_CONNECTED)
  {
     digitalWrite(power,LOW);
     while(WiFi.status() == WL_CONNECTED){           
        digitalWrite(LED,HIGH);
        delay(500);
        digitalWrite(LED,LOW);
        delay(200);   
     }              
  } else {
     digitalWrite(LED,LOW);
  }
}