Estamos no penúltimo artigo sobre “Over-The-Air”, e esse post descreve a configuração client e server para atualização de firmware por WiFi, mas dessa vez o ESP8266 consultará o server de forma automática.
Esse procedimento é adequado para quando se tem um parque de dispositivos grande o suficiente para necessitar de um centralizador. Existem diversos modos de fazê-lo, mas exemplificar o conceito poderá fazê-lo refletir sobre a melhor forma para sua necessidade. Assim como nos outros artigos, utilizarei aqui o Wemos. se você não leu os outros artigos sobre a atualização via OTA, sugiro que o faça:
Você pode utilizar qualquer ESP8266, estou exemplificando com o Wemos porque gostei bastante dele, mas tenho vários e todos funcionam, desde o ESP01.
O segundo requisito (porque obviamente o ESP8266 é o primeiro) é um servidor web. Vou instalar um nginx em meu Raspberry Pi para esse artigo. Nesse Raspberry também tenho um servidor DNS configurado para resolver nomes públicos e para os dispositivos da rede local. Se você não leu esse artigo, não é fundamental, mas garanto que é uma boa leitura, por isso recomendo que o faça através desse link.
Se você não desejar configurar um DNS na sua rede, invés de uma URL você poderá utilizar o endereço IP. Eu optei por instalar o servidor web no Raspberry porque tenho mais planos para ele e no final terei toda uma coleção de links para o processo. De qualquer modo, esse tutorial não exemplifica a instalação de um servidor web em Windows e esse tutorial serve para distribuições Linux que tenham o gerenciador de pacote apt.
Esse sketch é puramente um exemplo, não serve para mais nada além de atualizar o firmware. Ou pelo menos deveria. Passei muitas horas implementando uma boa lógica para tornar o sketch mais útil, e peguei em todos os casos um reset por watchdog. Não sei exatamente a causa, mas pela mensagem parece um reset na interrupção do pino. Tentei de tudo, testei documentação, tentei desabilitar watchdog, tentei aumentar o tempo do watchdog de 1 para 5 segundos, troquei yield() por delay(), mas nada resolveu. Não vou deixar de mostrar o código porque pode ser algum bug relacionado ao firmware que estou utilizando, ou ainda, um bug relacionado à board Wemos. Confira primeiro o sketch de exemplo da própria IDE:
E agora, o sketch que eu escrevi implementando duas funcionalidades. Primeiro, invés de prender o programa no loop dedicando-o a ser um atualizador de firmware, coloquei uma interrupção para fazer verificação periódica. Assim, quando tiver estouro do timer, uma flag é setada e o loop trata de chamar uma função que analisa se tem uma nova versão e se tiver, inicia o processo. A segunda funcionalidade foi a consulta prévia de versão disponível. Caso a versão disponível seja maior do que a versão local, então inicia o processo de atualização. Não funcionou com o firmware padrão, mas escrevi esse post que relata o meio de atualizar o firmware e já comprovado, resolveu o bug causado que acontecia por conta do firmware antigo da Wemos. Esse código está 100% funcional:
Se quiser entender a respeito da interrupção do ESP8266, leia esse post que fiz exclusivamente para tal.