sábado, 18 de junho de 2016

Configurando WiFi do ESP8266 Sem Recompilar


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] + 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. 

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

Até o próximo artigo!

Abraços,
Renato Aloi

Nenhum comentário:

Postar um comentário