Desenvolvimento

30 nov, 2016

OTA – Como programar o ESP8266 pelo WiFi no platformIO

Publicidade

Muitos dos meus artigos são necessidades que eu tenho no decorrer de projetos ou de experiências que eu faço. O artigo de hoje surgiu de uma necessidade de segurança, já que o projeto está ligado diretamente na rede elétrica e eu quero minimizar ao máximo qualquer risco de choque elétrico.

Existe um risco real em conectar qualquer equipamento não isolado na rede elétrica e, por sua vez, no computador. Isso pode acabar com qualquer projeto e dar prejuízo. Para minimizar isso, devemos isolar a comunicação entre o dispositivo e o computador.

Para isso, com o ESP8266 existe uma alternativa bem interessante, que é a atualização “over the air” ou OTA.

Atualização OTA

A atualização “over the air” consiste em enviar o firmware do ESP8266 pelo WiFi, eliminando assim a necessidade de deixá-lo ligado na serial USB. Existem diversas formas de fazer isso. A mais prática para o projeto que estou trabalhando foi em usar a biblioteca ArduinoOTA.

Instalação da biblioteca

Para instalar a biblioteca, baixe os arquivos diretamente pelo GitHub e os coloque dentro de uma pasta com nome src e depois em uma pasta ArduinoOTA. Copie esta pasta para dentro da pasta lib do projeto, conforme o esquema abaixo:

lib > ArduinoOTA > src > ArduinoOTA.cpp > ArduinoOTA.h

Utilizando

Para a utilização da atualização por OTA, devemos fazer ao menos uma gravação pelo método convencional, ou seja, pela serial.

O código abaixo é um exemplo do código que deverá ser gravado, sempre, no ESP. Ele possui todas as tratativas para o envio e gravação do firmware no ESP.

Atenção! Este procedimento só funciona nos ESP com memória maior que 512Kb.

Arduino

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "ssid";
const char* password = "senha";

void setup() {

  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  ArduinoOTA.setHostname("espota");
  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH)
      type = "sketch";
    else // U_SPIFFS
      type = "filesystem";

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });
  ArduinoOTA.begin();
  Serial.println("Ready OTA ESP8266");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}

Após gravar esse primeiro código no ESP, podemos alterar a forma de programar para o WiFi. Para isso devemos alterar o arquivo platformio.ini.

Incluir a seguinte linha:

upload_port = espota.local

ou

upload_port = 192.168.xx.yy (IP do ESP na rede)

E basta compilar novamente e o firmware que será enviado para o ESP pelo WiFi!

Demonstração

Abaixo, um vídeo de como fazer o procedimento na WeMos D1:

Conclusão

Essa é uma forma bem interessante de fazer atualizações no ESP de forma remota, pelo WiFi. Mesmo para projetos como o meu, que é para uma melhor segurança no manuseio da eletricidade, esse método é muito eficaz e prático.