OTA – Como programar o ESP8266 pelo WiFi no platformIO

Muitos dos meus artigos aqui no blog, 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 uma pasta ArduinoOTA, por exemplo e 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.

Apos 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 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.

 

Happy Hacking!

banner-youtube

27 Comments

  1. Gabriel

    É possível, fazer um upgrade OTA utilizando a SDK nativa da espressif?

    Reply
    1. Pedro Minatel (Post author)

      Gabriel, é possível sim, mas não com essa biblioteca

      Reply
  2. Bruno

    Muito bom. Mas como funciona o Serial Monitor com a placa fora do USB ?

    Reply
    1. Pedro Minatel (Post author)

      Teria que implementar via socket ou algo do tipo. Acho que não seria muito complicado.

      Reply
  3. tiago alexandre batista

    Tenho um wemos D1 mini com 3mb, tentei usar o código pela IDE arduino, mas da dois erros,

    o primeiro na hora de compilar ele aparece a seguinte mensagem na linha 27:
    exit status 1
    ‘class ArduinoOTAClass’ has no member named ‘getCommand’

    quando retiro essa parte do código e faço upload, ele pede uma senha, e não descubro qual é, até defini uma senha, mas ele tbm não reconhece.

    parabéns pelas postagens

    Reply
    1. Pedro Minatel (Post author)

      Tiago, o exemplo foi o mesmo utilizado no post? A biblioteca está na última versão?

      Reply
      1. tiago alexandre batista

        Pedro, agora com tempo fiz os testes reinstalei a Lib Arduino OTA e deu certo, muito bons os post’s parabéns.

        Reply
        1. Pedro Minatel (Post author)

          Que bom que deu certo!

          Obrigado por acompanhar o blog!

          Reply
  4. tiago alexandre batista

    Pedro utilizei o exemplo do post, aparentemente é a ultima versão da lib OTA, pois reinstalei recentemente o Esp8266 na ide do arduino.

    ta bem esquisito o erro

    Reply
    1. mmagalha

      Dá uma olhada se vc colocou os arquivos .h e .cpp dentro de lib/ArduinoOTA/… aconteceu comigo e foi so colocar na pasta correta

      o comando: ajuda nesse debug

      Reply
      1. tiago alexandre batista

        mmgalha, estava certinho, mas refiz a instalação e deu certo, obrigado pela dica

        Reply
  5. mmagalha

    Pedro,

    Cara ótimo site, parabéns pelo seu trabalho.

    me tira uma duvida, como faço para colocar um webserver junto com OTA. subi o código mas se coloco o

    ArduinoOTA.handle(); o webserver não sobe mesmo com um ArduinoOTA.setPort(8080);

    Reply
    1. Pedro Minatel (Post author)

      Nesse projeto que eu tô fazendo tem isso.

      https://github.com/lhc/lhc-esp-automation

      Reply
  6. Douglas Lara

    Fala Pedro,

    Cara segui o tutorial mas quando envio ele começa a atualizar e reseta,
    estou utilizando o esp 12

    Segue log:

    Booting
    Readyy
    IP address: 192.168.1.101
    Start updating sketch
    Progress: 0%
    Progress: 0%
    Progress: 1%
    Progress: 1%
    Progress: 2%
    Progress: 2%

    ets Jan 8 2013,rst cause:4, boot mode:(3,7)

    wdt reset
    load 0x4010f00

    Tem alguma ideia do que pode ser?

    Abração, seu trabalho é muito massa.

    Reply
  7. Douglas Lara

    Fala Pedro blz?

    Cara segui o tutorial mas quando faço o upload ele reseta.
    Estou utilizando o esp 12, segue log:
    Booting
    Readyy
    IP address: 192.168.1.101
    Start updating sketch
    Progress: 0%
    Progress: 0%
    Progress: 1%
    Progress: 1%
    Progress: 2%
    Progress: 2%

    ets Jan 8 2013,rst cause:4, boot mode:(3,7)

    wdt reset
    load 0x4010f00

    Tem ideia do que possa ser?

    Seu trabalho é muito massa, abração.

    Reply
    1. Pedro Minatel (Post author)

      Douglas, teve algum progresso?

      Reply
      1. Douglas Lara

        Ainda nada, hoje fiz as atualizações do platformio, refiz todo o upload mas sem sucesso.

        Reply
        1. Pedro Minatel (Post author)

          Verificou se há alguma restrição na porta no seu roteador?

          Tente colocar a função que define a porta.

          ArduinoOTA.setPort(8266);

          E tente mudar a porta.

          Reply
          1. Douglas Lara

            Tentei deixar ele no DMZ que “libera” todas as portas mas sem sucesso, também tentei fazer a atualização por http e ele crasha ao iniciar :/

    2. Bruno Scherer

      Douglas, vale verificar a alimentação do teu ESP, isso pode estar acontecendo devido sobrecarga na entrada, se tiveres algum capacitor aconcelho a usar para estabilizar a tensão de entrada.

      Reply
      1. Douglas

        Gente, possivelmente era alguma restrição do meu roteador, estou fazendo agora via http e esta funcionando perfeitamente, obrigado pela força.

        Reply
  8. Bruno Scherer

    Fala Pedro, muito bom o post. Só gostaria de reportar uma situação que esta acontecendo comigo. Quando usei o código pela primeira vez tudo funcionou perfeitamente, o OTA para o esp está perfeito, porém em alguns outros testes que venho fazendo e outras aplicações com OTA o hostname que defino acaba não funcionando, já procurei problemas parecidos e acaba que parece ser randômico quando funciona ou não. Sabes me apontar uma possivel causa desse problema? Pode ser as diferentes plataformas que estou usando ou a rede em que conecto o ESP?

    Reply
  9. Alexandre Magno

    Como seria um sketch para ser carregado por wifi, teria de ser uma nova versão desse inicial? Ou o código de sketch a ser enviado por wifi poderia ser coisa simples tal como sempre são os exemplos de blink (hello worlds)?

    Reply
    1. Alexandre Magno

      Talvez eu esteja perguntando se esse código inicial, que implanta o OTA, é um bootloader. Se for, quanto de espaço ele ocupa? E coloca alguma restrição no hardware?

      Reply
  10. Douglas

    Alexandre, é um sketch que configura o ESP para aceitar esse tipo de função, em seguida que ele estiver com esse sketch você pode enviar um blink por exemplo sem acrescentar as funções do OTA, ele vai carregar normalmente mas depois de atualizar não vai ser mais possível atualizar via wifi exceto se no sketch do blink você acrescentar as funções.

    Reply
  11. Ricardo

    Ola Pedro, tudo bem? Segui seu tutorial e tudo está perfeito, só uma coisa que nao funcionou. Não consigo pingar o hostname.

    Reply
    1. Christopher Shneider Cerqueira

      Também estou com o mesmo problema. Conseguiu resolver?

      Reply

Deixe seu comentário