Manual

do

Maker

.

com

Atualização de firmware via OTA para ESP8266

Atualização de firmware via OTA para ESP8266

OTA para ESP8266

Não há dúvidas que a melhor maneira de atualizar um firmware é via OTA (Over The Air). Nada de conexão de fios, ainda mais usando ESP8266, onde a atualização se dá por WiFi. E para isso, utilizaremos um recurso nativo dele. Já escrevi outros artigos sobre OTA, caso não tenha acompanhado, você pode vê-los através dos links:

https://www.manualdomaker.com/article/esp8266-como-configurar-atualizacao-ota-por-mqtt-1-de-2/

https://www.manualdomaker.com/article/esp8266-como-configurar-atualizacao-ota-por-mqtt-2-de-2/

https://www.manualdomaker.com/article/esp8266-upload-sem-cabos-ota/

https://www.manualdomaker.com/article/esp8266-buscando-atualizacao-de-firmware-em-servidor-web/

https://www.manualdomaker.com/article/esp8266-atualizacao-sem-fio-pelo-browser/

Como você pode ver, já escrevi bastante coisa, mas sempre tem novidades. Nesse artigo de hoje a diferença está no framework utilizado, o Sming, que oferece nativamente o recurso de updating via OTA utilizando o rBoot.

rBoot

O rBoot é um bootloader para o ESP8266, atualmente integrado ao Sming. Ele é opensource e é o que temos mais próximo do bootloader contido no SDK da ESPressif. Com esse bootloader, podemos ter mais do que uma aplicação rodando no ESP, com diferentes versões e funcionalidades, com atualização via OTA. Para esse objetivo, algumas informações prévias serão necessárias.

Conceitos importantes

O ESP8266 só pode mapear 1mb de memória flash por vez, portanto sua ROM deve caber dentro desse bloco de 1mb na flash. Porém, se sua ROM estiver dividida, você pode escrevê-la em diferentes blocos, utilizando o chamado "big flash mode", através de linkagem da ROM.

Tem mais algumas coisas, mas irrelevantes nesse momento. Na verdade, o processo é mais simples do que a explicação.

Ambiente de compilação do Sming

Dessa vez não adiantará eu disponibilizar um firmware pronto, afinal a intenção aqui é que você possa fazer suas próprias compilações,  e para isso você tem opções entre "fácil" e "muito simples". Uma destas opções é você utilizar um container Docker que já contém todo o ambiente pronto para trabalho. Se desejar esse modelo (que recomendo muito), você pode seguir esses tutoriais:

https://www.manualdomaker.com/article/esp8266-ala-arduino-com-sming-em-um-container/

https://www.manualdomaker.com/article/primeiros-passos-com-o-sming-dentro-de-um-container-esp8266/

https://www.manualdomaker.com/article/conectar-o-netbeans-ao-container-sming-esp8266/

Está tudo aí, de maneira fácil e simplificada, basta seguir o tutorial, tendo como pré-requisito a instalação de um Linux (porque como já disse dúzias de vezes, só utilizo Linux há 20 anos da data desse artigo).

Se preferir compilar um ambiente em seu sistema nativo invés de criar um Docker, você pode seguir esse outro tutorial:

https://www.manualdomaker.com/article/sming-framework-para-esp8266/

E ainda relacionado, esse outro tutorial:

https://www.manualdomaker.com/article/compilar-um-novo-firmware-para-o-esp8266/

Se estiver utilizando o Docker, você encontrará um exemplo pronto em /opt/sming/Basic_AirUpdate.

Sistema de arquivos SPIFFS para ESP8266

Esse sistema de arquivos lhe permite criar arquivos e acessá-los em seu ESP8266, como se fosse qualquer mídia de armazenamento como HD, SSD, SD etc. Normalmente eu adiciono a montagem do sistema de arquivos na primeira linha da chamada init():

spiffs_mount();

Básico e suficiente

Um sketch extremamente básico seria esse:

#include <user_config.h>
#include <SmingCore/SmingCore.h>

//Defina as configurações WiFi
#define WIFI_SSID "seu_SSID" 
#define WIFI_PWD "sua_senha"


//A atualização se dará por interrupção no GPIO0
//isso significa que você precisará de um botão.
#define UPDATE_PIN 0 // GPIO0
HttpFirmwareUpdate airUpdater;

//manipulador de interrupções
void IRAM_ATTR interruptHandler()
{
    detachInterrupt(UPDATE_PIN);
    Serial.println("Iniciando o processo...");
    airUpdater.start();
}

//chamada ao garantir a conexão
void connectOk()
{
    Serial.println("Conectado ao WiFi");

    //configuração do update
    airUpdater.addItem(0x0000, "https://manualdomaker.com/article/fw/fake.flash.bin");
    airUpdater.addItem(0x9000, "https://manualdomaker.com/article/fw/fake2.flash.bin");
    
    //agora aguarda a interrupção, que chamará interruptHandler
    attachInterrupt(UPDATE_PIN, interruptHandler, CHANGE);
    Serial.println("Aguardando interrupcao no GPIO0 para buscar atualizacao.");
}

void init()
{
    Serial.begin(115200);
    Serial.systemDebugOutput(true); //ativa debug na serial

    //Ativa Station...
    WifiStation.enable(true);
    WifiStation.config(WIFI_SSID, WIFI_PWD);
    //... e desativa AP
    WifiAccessPoint.enable(false);

    //Aguarda a conexão WiFi
    WifiStation.waitConnection(connectOk);
}

Com esse conceito, já podemos pensar em outras formas de fazer a atualização via OTA. Que tal utilizar o MQTT para informar ao ESP8266 para se auto-atualizar? Veremos em um próximo artigo!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.