Configurando WiFi do ESP8266 Sem Recompilar
Autor: Renato Aloi | Publicado: 2016-06-18T20:48:00-07:00








Pessoal, nesse terceiro artigo da série sobre o ESP8266 vou ensinar a configurar a Rede WiFi através do Navegador de Internet, sem precisar recompilar o código toda vez que mudamos o SSID e a senha do roteador.



Aprendemos no primeiro artigo a mapear funções do ESP8266 para páginas HTML e formulários que podem ser acessados por um Navegador de Internet.



E como já aprendemos no segundo artigo, podemos criar um formulário e enviar informações para o ESP8266 através de métodos como GET ou POST.



Nesse caso, utilizamos um formulário para preencher o SSID, senha, IP e Gateway e enviar via POST para o ESP8266 mudar suas configurações em tempo real.



Primeiro vamos ver como isso funciona e depois veremos o código necessário para isso.



Antes de mais nada precisamos configurar nosso roteador com as configurações iniciais do ESP8266 para fazermos a primeira conexão e depois podemos configurar os dados novos.





1) Acesse a página de configuração do seu roteador e clique na opção das configurações sem fio
2) Altere o nome do SSID para SSIDInicial
3) Altere a opção de segurança para WPA-PSK [TKIP]&nbsp;+&nbsp;WPA2-PSK [AES]
4) Mude também a senha para senhaInicial


Clique em "Enviar" para confirmar as configurações do seu roteador. Isso fará com que o roteador fique com as mesmas configurações iniciais que vamos escrever no código mais adiante.



Na sequência precisamos configurar o IP do roteador, que é o Gateway que configuramos no ESP8266.








1) Clique na opção de configuração de IP da LAN (os nomes podem ser um pouco diferentes dependendo da versão do roteador)
2) Configure o Endereço IP para 192.168.0.1


Feita essa configuração, você pode carregar o programa desse post e abrir o terminal Serial para verificar se o ESP8266 conectou no roteador corretamente, conforme imagem abaixo.









Ligue seu computador via cabo ou através do WiFi neste mesmo roteador. E abra um Navegador de Internet. Acesse o endereço do ESP8266, que na configuração inicial do código deste artigo é 192.168.0.125. Configure no código o endereço inicial que você deseja para seu ESP8266.








Clique no link "Configurar WiFi" ou acesse o endereço http://192.168.0.125/config







Pronto! Agora podemos mudar as configurações para o que quisermos sem precisar recompilar o código! Digite as informações que você quiser e clique em "Enviar"!







Isso parece simples, mas é muito poderoso, pois quando você cria um produto que oferece uma funcionalidade de WiFi, como você dá oportunidade para seu cliente configurar o produto para funcionar na rede dele? Esse é o jeito! Além disso com isso podemos oferecer para o cliente uma forma de atualizar o próprio firmware do ESP8266, que veremos no próximo post da série.



Vamos ver como isso é feito!







A primeira coisa que devemos fazer é incluir a biblioteca EEPROM, pois não tem sentido fazer toda essa configuração e depois perder ela quando a energia acabar. Para que as configurações permaneçam gravadas mesmo quando o ESP8266 for desligado, precisamos gravar essas informações na memória conhecida por EEPROM.



O resto do código é, na verdade, composto de coisas que já aprendemos nos outros dois posts. Vejamos os detalhes.








1) Definimos algumas macros para marcar posições iniciais da memória EEPROM onde ficarão nosso banco de dados de configuração. Temos uma macro para o início do controle de versão VERSION_START e uma macro para indicar onde a configuração realmente inicia CONFIG_START.
2) Criamos também uma macro para controlar a versão dos dados CONFIG_VERSION. Como a EEPROM grava os dados e não perde mais, temos esse controle para invalidar os dados anteriores em caso de recompilar o código, se necessário.
Por fim, criamos uma estrutura para guardar as configurações, chamada wifiConfig. Utilizaremos essa estrutura para facilitar o trabalho com a EEPROM, pois senão teríamos que lidar com leitura e escrita de bytes, o que é muito massante.







Para ajudar com a tarefa massante de lidar com gravação da EEPROM, criamos também uma função que utiliza um laço for para gravar todos os bytes da estrutura e facilitar o trabalho. Repare também que gravamos os bytes de controle da versão; e por fim utilizamos a função EEPROM.commit() para confirmar a gravação.







Outra função importante para lidar com a EEPROM é a que faz a leitura e alimenta a estrutura wifiConfig. Primeiro a função faz a leitura e verifica os bytes de controle para saber se existem e se conferem com o código atual. Lembre-se, para invalidar esse código, basta mudar a macro mostrada anteriormente de "1a" para qualquer outro valor, como por exemplo "1b" ou "JJ", não importa.



Invalidando esses bytes de controle farão com que o ESP8266 utilize os dados da configuração inicial, que é fixa. Por isso configuramos o roteador anteriormente com essas configurações no início desse post.


1) SSIDInicial é o SSID da configuração inicial fixa no código
2) senhaInicial é a senha inicial
3) 192.168.0.125 é o IP inicial do ESP8266
4) 192.168.0.1 é o IP do roteador, ou também chamado IP do Gateway


Essa configuração do código dentro do else só é carregada na primeira vez que o ESP8266 inicia. Depois disso as alterações são feitas pelo Navegador, conforme mostrado anteriormente e depois lida pela parte do if.




Quando acessamos a página de configuração do WiFi, chamamos a função mostrada abaixo, que monta e preenche o formulário HTML com as informações da estrutura wifiConfig, carregadas da EEPROM.









Ao clicar no botão "Enviar" desse formulário, a outra função que chamada é a mostrada abaixo, onde os dados preenchidos são registrados na estrutura wifiConfig e depois gravados na EEPROM, através da função saveConfig() que vimos anteriormente.









Repare que a última instrução é uma função especial para reiniciar o ESP8266 chamada ESP.restart(). Isso faz com que o WiFi reinicie e tente conectar de novo no roteador, com os dados novos que foram informados.



Quando o ESP8266 reinicia, a função setup() é chamada novamente, então as configurações carregadas são as novas que foram gravadas na EEPROM, conforme vemos a seguir.







Veja que precisamos primeiro iniciar a EEPROM chamando a função EEPROM.begin(), passando o valor 512 que é o tamanho do espaço reservado para essa memória no seu ESP8266. Verifique o tamanho da versão que você estiver usando.



Depois temos a chamada da funão loadConfig() que faz a leitura da EEPROM e carrega os dados da configuração na estrutura wifiConfig.



Finalmente só precisamos usar os valores de wifiConfig para configurar o SSID e senha na função WiFi.begin(), assim como o IP do ESP8266 e IP do Gateway na função WiFi.config().







Continuando a função setup() do ESP8266 vemos os detalhes finais:


1) Apresentamos os dados do roteador em que o ESP8266 conectou.
2) Aqui mostramos a configuração da função de chamada do método GET do formulário de configuração
3) E a configuração da chamada do método POST.


A instrução final do setup() é a chamada da função server.begin() que inicia o servidor.&nbsp;





É isso pessoal! Baixem o código completo aqui.




Até o próximo artigo!



Abraços,

Renato Aloi