banner

Ir para o Forum

ESP8266 e ESP32 com WiFiManager



Já conhece a WiFiManager, uma biblioteca que serve como um gerenciador de conexões wireless? Pois, com ela temos uma maior facilidade para configurar tanto um Ponto de Acesso quanto uma Estação. Eu tenho recebido diversas sugestões para falar sobre o assunto, então, hoje vou te apresentar uma biblioteca desta e suas funções. Ainda vou fazer uma demonstração de uso tanto com o ESP32 quanto o ESP8266.




PINOUT

Aqui eu deixo para vocês o PINOUT dos dois dispositivos que vamos utilizar:


NodeMCU ESP-12E

NodeMCU ESP-WROOM-32


WiFiManager

A WiFiManager, portanto, nada mais é que uma biblioteca escrita em cima do WiFi.h para facilitar o gerenciamento de conexões wireless. Lembrando que, com ela, temos uma maior facilidade para configurar tanto um Ponto de Acesso quanto uma Estação. Para o modo Estação, configuramos através de um portal no navegador.

Algumas características:
·         Depende da conectividade automática
·         Inicialização do portal de configuração não automática
·         Opera seletivamente no modo duplo


Como Funciona


O ESP iniciará um portal de configuração WiFi quando ligado e salvará os dados de configuração em memória não volátil. Posteriormente, o portal de configuração só será iniciado novamente se um botão for pressionado no módulo ESP.
Abaixo você confere o fluxo de configuração e o passo a passo:


1.       Utilizando qualquer dispositivo habilitado para WiFi com um navegador  conecte-se ao ponto de acesso recém-criado e digite o endereço 192.168.4.1.
2.       Na tela você terá duas opções para se conectar a uma rede existente:
·         Configure WiFi
·         Configure WiFi (No Scan)
3.       Escolha uma das redes e coloque a senha (se precisar). Então, salve e aguarde o ESP reiniciar.
4.       Ao finalizar o boot, o ESP tentará se conectar na rede salva. Caso não consiga, irá habilitar um Ponto de Acesso.


Bibliotecas

Adicione as bibliotecas: “WifiManager-ESP32”, DNSServer-ESP32” e WebServer-ESP32”.
Descompacte os arquivos e cole na pasta de bibliotecas da IDE do arduino.
C:/Program Files (x86)/Arduino/libraries


Observação:


A biblioteca WiFiManager-ESP32 já traz as configurações que funcionam com o ESP8266, por isso utilizaremos apenas ela, ao invés de duas libs “WiFiManager” (uma para cada tipo de chip).
Como veremos mais adiante, ESP8266WiFi e ESP8266WebServer são bibliotecas que não precisaremos realizar o download, pois elas já vêm quando instalamos o ESP8266 na IDE do arduino.




Funções

A seguir temos algumas funções que o WiFiManager nos oferece.

1.       autoConnect
A função autoConnect é responsável por criar um Access Point. Podemos usá-la de três maneiras.
·         autoConnect(“nome da rede”, “senha”); - cria uma rede com o nome e a senha definidos.
·         autoConnect(“nome da rede”); - cria uma rede aberta com o nome definido.
·         autoConnect(); - cria uma rede aberta e com nome gerado automaticamente com o nome sendo ‘ESP’ + chipID.



2.       startConfigPortal
A função startConfigPortal é responsável por criar um Access Point sem tentar conectar antes a uma rede salva anteriormente.
·         startConfigPortal(“nome da rede”, “senha”);   - cria uma rede com o nome e a senha definidos.
·         startConfigPortal(); - cria uma rede aberta e com nome gerado automaticamente com o nome sendo ‘ESP’ + chipID.



3.       getConfigPortalSSID
                Retorna o SSID do portal (Access Point)
4.       getSSID
Retorna o SSID da rede a qual está conectado.
5.       getPassword
                Retorna a senha da rede a qual está conectado.



6.       setDebugOutput
A função setDebugOutput é responsável por imprimir mensagens de debug no serial monitor. Essas mensagens já são definidas na biblioteca. Conforme passa pelas funções, os dados vão sendo impressos.
Por padrão essa função vem setada como TRUE. Caso queira desabilitar as mensagens, basta setar a função como FALSE.



7.       setMinimumSignalQuality
A função setMinimumSignalQuality é responsável por filtrar as redes baseadas na qualidade do sinal. Por padrão, o WiFiManager não mostrará redes com sinal abaixo de 8%.



8.       setRemoveDuplicateAPs
A função setRemoveDuplicateAPs é responsável por remover as duplicatas de redes.
Por padrão vem setado como TRUE. 



9.       setAPStaticIPConfig
A função setAPStaticIPConfig é responsável por setar as configurações de endereço estáticas quando no modo access point.
(IP, GATEWAY, SUBNET)



10.   setSTAStaticIPConfig
A função setSTAStaticIPConfig é responsável por setar as configurações de endereço estáticas quando no modo estação.
(IP, GATEWAY, SUBNET)


Deve-se adicionar o comando antes de autoConnect !!!



11.   setAPCallback
A função setAPCallback é responsável por informar que o modo AP foi iniciado.
O parâmetro é uma função que se deve criar para indicá-la como sendo um callback;



12.   setSaveConfigCallback
A função setSaveConfigCallback é responsável por informar que uma nova configuração foi salva e a conexão foi realizada com sucesso.
O parâmetro é uma função que se deve criar para indicá-la como sendo um callback.


Deve-se adicionar o comando antes de autoConnect!!!


Montagem



Exemplo

No nosso exemplo vamos criar um Access Point com o ESP (o código servirá tanto para o ESP8266 como para o ESP32). Após a criação do AP, vamos acessar o portal através do IP 192.168.4.1 (que é o padrão para acessá-lo). Então, vamos buscar as redes disponíveis, selecionar uma delas e salvar. A partir daí, o ESP irá reiniciar e tentará se conectar a ela, trabalhando, então, como uma estação e, não mais, como um Access Point.
Após entrar em modo estação, apenas através do botão que você poderá fazer o ESP voltar ao modo Access Point.

Código

Bibliotecas

Primeiramente vamos definir as bibliotecas que utilizaremos.
Repare que temos comandos #if defined, #else e #endif. Eles são condicionais para incluir bibliotecas necessárias referentes ao chip. Essa parte é extremamente importante para poder rodar o mesmo código tanto no ESP8266 quanto no ESP32.

#if defined(ESP8266)
#include <ESP8266WiFi.h>  //ESP8266 Core WiFi Library         
#else
#include <WiFi.h>      //ESP32 Core WiFi Library    
#endif

#if defined(ESP8266)
#include <ESP8266WebServer.h> //Local WebServer used to serve the configuration portal
#else
#include <WebServer.h> //Local WebServer used to serve the configuration portal ( https://github.com/zhouhan0126/WebServer-esp32 )
#endif

#include <DNSServer.h> //Local DNS Server used for redirecting all requests to the configuration portal ( https://github.com/zhouhan0126/DNSServer---esp32 )
#include <WiFiManager.h>   // WiFi Configuration Magic ( https://github.com/zhouhan0126/WIFIMANAGER-ESP32 ) >> https://github.com/tzapu/WiFiManager (ORIGINAL)


Setup

No setup estamos configurando nosso WiFiManager da maneira mais simples. Vamos apenas definir os callbacks e criar a rede. 

const int PIN_AP = 2;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_AP, INPUT);
  //declaração do objeto wifiManager
  WiFiManager wifiManager;

  //utilizando esse comando, as configurações são apagadas da memória
  //caso tiver salvo alguma rede para conectar automaticamente, ela é apagada.
//  wifiManager.resetSettings();

//callback para quando entra em modo de configuração AP
  wifiManager.setAPCallback(configModeCallback); 
//callback para quando se conecta em uma rede, ou seja, quando passa a trabalhar em modo estação
  wifiManager.setSaveConfigCallback(saveConfigCallback); 

//cria uma rede de nome ESP_AP com senha 12345678
  wifiManager.autoConnect("ESP_AP", "12345678"); 
}


Loop

No loop, faremos a leitura do pino do botão para saber se ele foi pressionado e, então, vamos chamar o método para habilitar novamente o modo AP.

void loop() 
{
   if ( digitalRead(PIN_AP) == HIGH ) 
   {
      WiFiManager wifiManager;
      if(!wifiManager.startConfigPortal("ESP_AP", "12345678") )
      {
        Serial.println("Falha ao conectar");
        delay(2000);
        ESP.restart();
      }
   }

}



Ao pressionar o botão, o ESP sairá do modo Estação e abrirá seu Access Point e o portal.
Lembre-se que não utilizamos o comando resetSettings(). As configurações ainda permanecem salvas para a próxima vez que o ESP inicializar.


Callbacks


//callback que indica que o ESP entrou no modo AP
void configModeCallback (WiFiManager *myWiFiManager) {  
//  Serial.println("Entered config mode");
  Serial.println("Entrou no modo de configuração");
  Serial.println(WiFi.softAPIP()); //imprime o IP do AP
  Serial.println(myWiFiManager->getConfigPortalSSID()); //imprime o SSID criado da rede

}

//callback que indica que salvamos uma nova rede para se conectar (modo estação)
void saveConfigCallback () {
  Serial.println("Configuração salva");
}

As funções de callback, as quais são associadas a eventos, servem para você ter o momento exato de uma operação, no nosso caso, a entrada no modo AP e no modo Estação. Podemos, então, implementar alguma rotina desejada, como recuperar o SSID da rede conectada, por exemplo.


Faça o download dos arquivos:


29 comentários:

  1. Geteway lora por 15 dólares
    É real https://youtu.be/ZV_ZY-0Q1lo

    ResponderExcluir
  2. bom dia fernando

    sou iniciante com arduino e já coloquei aqui o codigo e deu certo abriu a pagina tudo certo

    agora minha duvida e simples mas eu nao entendo! como coloco por exemplo um codigo seu mesmo aquele ddns em cima deste já que quando coloco um o outro apaga

    ResponderExcluir
    Respostas
    1. Olá. O WiFiManager serve apenas para você se conectar mais facilmente à um Ponto de Acesso. A respeito do DDNS ele terá que ser configurado em seu roteador. Abraço!

      Excluir
  3. Respostas
    1. Olá. Os dois são muito bons, você precisa avaliar de acordo com sua aplicação desejada. O ESP32 tem melhor processamento que o ESP8266. Abraço!

      Excluir
  4. Olá Fernando muito bacana o seu post. Estou tentando conectar na nuvem utilizando este wifimanager, de inicio dá tudo certo, porem com o tempo (tipo 12h) o esp disconecta e para de enviar dados a nuvem, além disso ele não gera novamente o servidor para tentar novamente a conexão, ou seja, ele para de mandar dados. Tem alguma ideia do que poderia ser, obrigado

    ResponderExcluir
  5. como envio dados para a nuvem, na vdd preciso enviar dados da leitura da D8 para um link http interno
    tipo http://192.168.0.1/recebe_dados.php
    só o valor da leitura.
    como fazer?

    ResponderExcluir
    Respostas
    1. Eu uso o client() pra fazer um GET no servidor. Dê uma olhada nesse exemplo: https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiClient/WiFiClient.ino

      Espero que ajude! Abraço!

      Excluir
  6. Olá Fernando,
    Seria possível criar um loop, para verificar a existência de conexão com a internet?
    Se sim, como seria isso?

    ResponderExcluir
    Respostas
    1. Boa tarde! Você conseguiu fazer algo para validar se ele está conectado a alguma rede?

      Excluir
  7. Boa noite amigo vc pode me enviar uma ide pra colocar no meu esp 8266 nodemcu pra acionar 10 relés via wi-fi do meu celular sem precisar de internet

    ResponderExcluir
  8. Se puder enviar pro meu WhatsApp (22)997380309 eu agradeço

    ResponderExcluir
  9. Fernando não há um jeito de usar um nome em vez do ip?
    por exemplo "portalAP" em vez 192.168.4.1

    ResponderExcluir
  10. Olá Fernando!
    Estou tentando rodar meu próprio código "hello world" ativando um LED via navegador na IDE Arduino, porém estou me deparando com um problema. A conexão com a rede local ocorre normalmente, e o monitor serial mostra a URL (endereço IP) que eu deveria utilizar para acessar o servidor. Entretanto, quando jogo o endereço no navegador e tento acessar, aparece um erro dizendo que não foi possível encontrar a página. Já desativei o firewall, testei em vários navegadores diferentes, redes diferentes, portas diferentes (mudei da porta 80 para a 443) e nada funciona! O que pode estar acontecendo?
    P.S.: Estou utilizando um ESP32 e SO Windows 10

    ResponderExcluir
  11. o meu nao compilou /Users/josimar/Documents/Arduino/libraries/WiFiManager/WiFiManager.h:24:30: fatal error: user_interface.h: No such file or directory

    ResponderExcluir
  12. Olá Prof. Fernando.
    Funcionou perfeitamente.
    A biblioteca já cá a tinha, não sabia era como usá-la.
    Muito Obrigado.
    Um grande abraço de Portugal.

    ResponderExcluir
  13. Por mais que eu tente ele nao cria a conexão com o nome configurado, sempre aparece Wifi-repeater.
    Também tive vários problemas de conflito entre as bibliotecas por usarem nome de arquivos iguais e quando eu removo qualquer um deles ou troco o nome a aplicação não funciona.

    ResponderExcluir
  14. Fiz e reg=fiz a instalacao muitas vezes, MAS......

    Multiple libraries were found for "WiFi.h"
    WifiManager32:14:159: error: WiFiManager.h: No such file or directory

    Used: C:\Users\vidal\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\libraries\WiFi
    compilation terminated.

    Not used: C:\Arduino\libraries\WiFi
    exit status 1
    WiFiManager.h: No such file or directory

    ResponderExcluir
  15. Boa noite Fernando, acho fantasticas suas aulas e venho seguindo alguns tutoriais, comecei a brincar com o esp32 a pouco tempo e estou tentando carregar o autoconect do wifimanager aparecem informaçoes de duplas bibliotecas e no final da um erro de compilação, estou há meses tentando instalar e desisntalar ide, bibliotecas etc mas da sempre o mesmo erro, o blink ele carrega. O Senhor ou alguem que segue a página pode me ajudar? abraços, obrigado

    ResponderExcluir
    Respostas
    1. Ola estou com o mes o problema utilizando o ino do site e as bibliotecas indicadas no artigo.
      Alguma sugestão ?

      Excluir
  16. Hola Fernando,
    just a question,
    why in the INO program downloadable from your page, in Void Loop is called WiFiManager wifiManager and after there is the function IF to check the input.
    and in the video, like in the documentation in this pages, in the loop the first command there is the if function to check the push button and, if is TRUE is called the WiFiManager wifiManager?

    what is the difference
    thanks

    ResponderExcluir
  17. Cara estou com o problema de múltiplas biblioteca a semanas e ninguém consegue me da um norte.
    ta osso kkk.

    Qualquer exemplo que uso as biblioteca citadas acima dao esse erro.

    Outras biblioteca e exemplos funcionam normal

    ResponderExcluir
  18. To na com esse problema tambem "Murilo Gimenez" ja refiz todo o processo de instalação e nada da certo

    ResponderExcluir
  19. Bom dia Fernando,

    Segui a risca seu tutorial para a configuração do Access Point utilizando ESP32, porém, não saio desse erro.

    Foram encontradas múltiplas bibliotecas para "WebServer.h"
    In file included from C:\Users\kaina\Desktop\sketch_nov17a\sketch_nov17a.ino:10:0:

    Usado: C:\Users\kaina\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\libraries\WebServer
    C:\Users\kaina\Documents\Arduino\libraries\WiFiManager/WiFiManager.h:16:25: fatal error: ESP8266WiFi.h: No such file or directory

    Não usado: C:\Program Files (x86)\Arduino\libraries\WebServer-ESP32
    compilation terminated.

    Foram encontradas múltiplas bibliotecas para "WiFi.h"
    Usado: C:\Users\kaina\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\libraries\WiFi
    Não usado: C:\Program Files (x86)\Arduino\libraries\WiFi
    Foram encontradas múltiplas bibliotecas para "DNSServer.h"
    Usado: C:\Users\kaina\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\libraries\DNSServer
    Não usado: C:\Program Files (x86)\Arduino\libraries\DNSServer-ESP32
    exit status 1
    Erro compilando para a placa ESP32 Dev Module

    Se puder ajudar eu agradeço.

    Forte abraço, e parabéns pelos tutoriais.

    ResponderExcluir
    Respostas
    1. Kainã, também estou com esse problema. Você conseguiu algo para resolver?
      Obrigado.

      Excluir
  20. Eu tive um problema parecido, deletei todas as bibliotecas e reinstalei e resolveu tudo

    ResponderExcluir

Tecnologia do Blogger.