banner

Ir para o Forum

ESP32 e ESP8266: Programação no Ar



É possível programar um ESP pelo ar? Sim. Essa é a resposta. E o que isso significa? Que você não vai mais gravar o microcontrolador pelo cabo USB, mas, sim, através de WiFi. Essa possibilidade é legal por facilitar a nossa vida, pois permite que façamos a atualização de software de um dispositivo que está fixado em um telhado, por exemplo, sem precisar retirá-lo do lugar.
Então, neste artigo e no vídeo abaixo vou tratar de um exemplo básico de programação OTA (Over The Air) no ESP32 e mostro também como adaptar o mesmo projeto para o ESP8266 com uma pequena mudança no código. Esse nosso programa foi desenvolvido na linguagem C do Arduino IDE.


Recursos usados


2 Leds
2 Resistores de 220 ohm
ESP32
Protoboard


Código OTA

Organização do código e códigos obrigatórios


É preciso que você tenha um pedaço do código dentro do Setup, além de um grupo de funções que chamei de OTA, e mais um pedacinho de código dentro do Loop. Isso porque, quando você grava pelo ar, você tem que colocar um código dentro do ESP que permite que esse dispositivo passe a se comunicar pela rede IP com a IDE do Arduino. Então, ao invés de você escolher uma COM serial (porta de comunicação) você vai escolher um IP.
Esse código, portanto, precisa estar dentro do ESP. A parte que trato aqui exibe primeiramente três funções que devem obrigatoriamente estar dentro do Setup. Na sequência coloco outras quatro funções envolvendo OTA que fazem parte do código fonte vindo pelo ar.

Setup – ESP32


Nesta parte do código eu trago os defines. O código OTA traz pedaços que você precisa colocar dentro do seu programa e, aqui, trato de algumas partes obrigatórias. Nesta etapa também trabalhamos os Leds, sendo que o vermelho vai confirmar quando o dispositivo for atualizado pelo ar, por exemplo.

#include <WiFi.h> //lib para configuração do Wifi
#include <ArduinoOTA.h> //lib do ArduinoOTA 
#include <ESPmDNS.h> //lib necessária para comunicação network
#include <WiFiUdp.h> //lib necessária para comunicação network

#define ledVerde 23 //este led sinaliza que o ESP foi conectado
//#define ledVermelho 22 //este led é usado como exemplo de atualização

const char* ssid = "robotica"; //nome da rede
const char* password = "12345678"; //senha da rede

void setup()
{
  //define pino como saída
  pinMode(ledVerde,OUTPUT);
  
  //define pino como saída
  //código da atualização  
  //pinMode(ledVermelho,OUTPUT);

  //inicia serial com 115200 bits por segundo
  Serial.begin(115200);
  
  Serial.println("Booting");

  //define wifi como station (estação)
  WiFi.mode(WIFI_STA);

  //inicializa wifi
  WiFi.begin(ssid, password);


Setup – ESP8266


Exibo aqui as partes do código fonte do ESP32 que devem ser modificadas para aplicação no ESP8266. Lembro, no entanto, que deixo as duas versões disponíveis para download ao fim deste artigo.

#include <ESP8266WiFi.h> //lib do wifi para o ESP8266
#include <ESP8266WiFiMulti.h> //lib do wifi para o ESP8266
#include <ArduinoOTA.h> //lib do ArduinoOTA

#define ledVerde 23 //este led sinaliza que o ESP foi conectado
//#define ledVermelho 22 //este led é usado como exemplo de atualização

ESP8266WiFiMulti wifiMulti;

const char* ssid = "robotica"; //nome da rede
const char* password = "12345678"; //senha da rede

void setup()
{
   //define pino como saída
   pinMode(ledVerde,OUTPUT);
   
   //define pino como saída
   //código da atualização 
   //pinMode(ledVermelho,OUTPUT);
   
   //inicia serial com 115200 bits por segundo
   Serial.begin(115200);
   
   Serial.println("Booting");   
   
   wifiMulti.addAP(ssid, password); 
   
   Serial.println("Connecting ...");
   
   while (wifiMulti.run() != WL_CONNECTED)
   {       
       delay(250);
       Serial.print('.');
   }

Continuação - Setup ESP32

Prosseguimos aqui com o código fonte do OTA com definições que são padrão.

//enquanto o wifi não for conectado aguarda
  while (WiFi.waitForConnectResult() != WL_CONNECTED) 
  {
    //caso falha da conexão, reinicia esp
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // A porta fica default como 3232
  // ArduinoOTA.setPort(3232);

  // Define o hostname (opcional)
  ArduinoOTA.setHostname("myesp32");

  // Define a senha (opcional)
  ArduinoOTA.setPassword("password123");

  // É possível definir uma criptografia hash md5 para a senha usando a função "setPasswordHash"
  // Exemplo de MD5 para senha "admin" = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

Setup – Configuração da instância ArduinoOTA

Fiz algumas alterações no código fonte original para facilitar a leitura, as quais podem ser bem percebidas nesta etapa.

//define o que será executado quando o ArduinoOTA iniciar
  ArduinoOTA.onStart( startOTA ); //startOTA é uma função criada para simplificar o código 

  //define o que será executado quando o ArduinoOTA terminar
  ArduinoOTA.onEnd( endOTA ); //endOTA é uma função criada para simplificar o código 

  //define o que será executado quando o ArduinoOTA estiver gravando
  ArduinoOTA.onProgress( progressOTA ); //progressOTA é uma função criada para simplificar o código 

  //define o que será executado quando o ArduinoOTA encontrar um erro
  ArduinoOTA.onError( errorOTA );//errorOTA é uma função criada para simplificar o código 
  
  //inicializa ArduinoOTA
  ArduinoOTA.begin();

  //exibe pronto e o ip utilizado pelo ESP
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  digitalWrite(ledVerde,HIGH);
}


Funções de exibição dos estágios de upload (start, progress e end)

Trago novamente todas as funções comentadas.

//funções de exibição dos estágios de upload (start, progress, end e error) do ArduinoOTA
void startOTA()
{
   String type;
   
   //caso a atualização esteja sendo gravada na memória flash externa, então informa "flash"
    if (ArduinoOTA.getCommand() == U_FLASH)
      type = "flash";
    else  //caso a atualização seja feita pela memória interna (file system), então informa "filesystem"
      type = "filesystem"; // U_SPIFFS

    //exibe mensagem junto ao tipo de gravação
    Serial.println("Start updating " + type);

    digitalWrite(ledVerde,HIGH);
    delay(300);
    digitalWrite(ledVerde,LOW);
    delay(300);
    digitalWrite(ledVerde,HIGH);
    delay(300);
    digitalWrite(ledVerde,LOW);
    delay(300);
}

//exibe mensagem
void endOTA()
{
  Serial.println("\nEnd");
}

//exibe progresso em porcentagem
void progressOTA(unsigned int progress, unsigned int total)
{
   Serial.printf("Progress: %u%%\r", (progress / (total / 100))); 
}


Funções de exibição dos estágios de upload (error)

O mesmo fiz nesta parte do código que trata de possível erro.

//caso aconteça algum erro, exibe especificamente o tipo do erro
void errorOTA(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");
}

Loop

Por fim, exibo aqui o nosso programa.

void loop() 
{
  //Handle é descritor que referencia variáveis no bloco de memória
  //Ele é usado como um "guia" para que o ESP possa se comunicar com o computador pela rede
  ArduinoOTA.handle();

  //código de atualização    
  /*
  digitalWrite(ledVermelho,HIGH);
  delay(1000);
  digitalWrite(ledVermelho,LOW);
  delay(1000);  
  */
}

Seleção de porta de rede no Arduino IDE

Após a primeira gravação feita pela porta Serial, deve-se selecionar a porta de rede conforme a figura abaixo. Para isso é fundamental que o computador esteja conectado na mesma rede que o ESP.


Montagem do ESP32


Na nossa montagem colocamos dois resistores e dois Leds. O projeto é bastante simples e basta seguir a imagem para reproduzi-lo. No nosso exemplo, o Led verde indica que o ESP está conectado, enquanto o Led vermelho é usado para visualizar a atualização feita pelo OTA, como pode ser visto no vídeo, na nossa demonstração.


Faça o download dos arquivos:



35 comentários:

  1. E tanto OTA que me senti um idi no meio de tudo isso!
    Sou inscrito e sempre dou meu like.

    ResponderExcluir
  2. Bom dia Fernando, muito bom seu trabalho, parabéns.
    Vc poderia disponibilizar o link da library ESP8266WiFiMulti.h.
    Eu não estou achando e não faz parte do repositório do Arduino.
    Gostaria de testar o seu código OTA.
    Obrigado.

    ResponderExcluir
    Respostas
    1. Bom dia Roberto.

      A biblioteca ESP8266WifiMulti.h é baixada junto ao módulo do ESP8266. Siga estes passos para baixar:
      1. Vá em Arquivo->Preferências;
      2. Em "URLs Adicionais para Gerenciadores de Placas" adicione o link http://arduino.esp8266.com/stable/package_esp8266com_index.json e clique em OK;
      3. Vá em Ferramentas->Placa->Gerenciador de Placas
      4. Procure por "esp8266", selecione o pacote encontrado como "esp8266 by ESP8266 Community" e clique em Instalar.

      Para mais detalhes veja em "Introdução ao ESP8266" (https://www.youtube.com/watch?v=QXB5WHH9GOE&t=997s), aos 16:50 ensino como baixar o módulo.

      Para evitar possíveis problemas de compilação sugiro que baixe novamente o código ESP8266_OTA.ino pois ele foi atualizado aqui no meu blog!

      Um abraço!

      Excluir
  3. Boa tarde Fernando. Tentei usar o seu código OTA ESP32, apresentou o seguinte erro [1432], pode me ajudar? que erro é esse?

    ResponderExcluir
    Respostas
    1. Este comentário foi removido pelo autor.

      Excluir
    2. Boa tarde, Roberto!
      A biblioteca ESP8266WifiMulti.h é instalada junto ao módulo do ESP8266. Verifique se este módulo está instalado. O correto seria instalar este módulo na Arduino IDE.

      Excluir
  4. Bom dia, Fernando.
    Realmente o modulo ESP8266 não estava instalado "corretamente", reinstalei o modulo esp-8266, última versão e a biblioteca foi instalado também.
    Porém ao tentar compilar o código ESP8266_OTA, aparece este erro:
    ESP8266_OTA:54: error: invalid use of void expression

    ESP8266_OTA:57: error: 'progress' was not declared in this scope

    ESP8266_OTA:57: error: 'total' was not declared in this scope

    ESP8266_OTA:57: error: expected primary-expression before ')' token

    ESP8266_OTA:57: error: expected ';' before ')' token

    ESP8266_OTA:60: error: 'error' was not declared in this scope

    ESP8266_OTA:60: error: expected primary-expression before ')' token

    ESP8266_OTA:60: error: expected ';' before ')' token

    exit status 1
    invalid use of void expression

    Pode me ajudar?
    Desde já muito obrigado.

    ResponderExcluir
    Respostas
    1. Olá Roberto.
      O código do ESP8266 estava com erros de sintaxe nas funções OTA, já atualizei e ele está compilando sem erros agora.
      Obrigado pelo comentário!

      Excluir
  5. Oi Fernando.
    Muito obrigado pela resposta e correção do código.
    Está funcionando perfeitamente com a placa ESP8266.
    Agora eu consigo fazer upload via OTA do sketch.
    Excelente trabalho o que vc faz.
    Parabéns.

    ResponderExcluir
  6. Oi Fernando.
    Tentei usar o seu código OTA ESP32, ele compila sem qualquer erro pela IDE Arduino, última versão.
    Mas, quando tento repassar o código via OTA para a placa ele apresentou o seguinte erro [1432], pode me ajudar? que erro é esse?

    obrigado.

    ResponderExcluir
  7. Este comentário foi removido por um administrador do blog.

    ResponderExcluir
    Respostas
    1. Após gravar o código OTA pela primeira vez (usando a porta serial) no ESP a rede deve aparecer na IDE automaticamente. Lembrando que o seu computador e o ESP devem estar na mesma rede. Tente também resetar o ESP após a primeira gravação.

      Excluir
  8. Oi Fernando. Fiz conforme sua orientação, apos repassar o código OTA para o ESP:
    resetei o ESP32; Conectei na mesma rede wifi do computador (desliguei o cabo de rede);
    Até desativei meu antivirús. Mas não deu certo, os mesmos erros, veja as mensagens.
    Sending invitation to 192.168.1.6
    Authenticating...OK
    12:35:55 [ERROR]: No response from device
    Sending invitation to 192.168.1.6 ......
    Authenticating...OK
    12:36:15 [ERROR]: No response from device
    Sending invitation to 192.168.1.6 ......
    Authenticating...OK
    12:36:35 [ERROR]: No response from device
    Sending invitation to 192.168.1.6
    Authenticating...OK
    Uploading...................................................................................................................................................................................................................................................................................................................................................................

    12:36:58 [ERROR]: 1432
    Sending invitation to 192.168.1.6
    Authenticating...OK
    Uploading...................................................................................................................................................................................................................................................................................................................................................................

    12:37:10 [ERROR]: 1432
    Sending invitation to 192.168.1.6
    Authenticating...OK
    Uploading...................................................................................................................................................................................................................................................................................................................................................................

    12:37:24 [ERROR]: 1432
    Sending invitation to 192.168.1.6
    Authenticating...OK
    Uploading...................................................................................................................................................................................................................................................................................................................................................................

    12:37:41 [ERROR]: 14321432

    ResponderExcluir
    Respostas
    1. Este erro "No response from device" geralmente ocorre quando o computador não está na mesma rede que o ESP.
      Já verificou se pode ser este o problema?
      Se não, abra o prompt de comando (cmd) e digite "ping 192.168.1.6" e veja se seu computador obtém resposta do ESP.

      Excluir
  9. Olá! Adorei o post e tudo, perfeito! Mas tenho uma duvida, e se eu não quiser utilizar um IP Local, quiser utilizar um IP remoto pela internet? por TCP ou HTTP? O que vc recomenda? Obrigado e parabens!

    ResponderExcluir
  10. Olá Fernando... estou adorando suas aulas e experimentos.
    , muito obrigado pela dedicação do seu tempo.
    Eu tentei baixar a ino da OTA do seu blog mas quando tento abri diz que o arquivo está em formato desconhecido ou danificado.
    Você pode me ajudar?
    muito obrigado

    ResponderExcluir
    Respostas
    1. Olá, Gilbert.
      Testamos o link aqui e está ok. Pode tentar denovo?
      O arquivo está em .rar!

      Excluir
  11. Olá, Fernando.
    Baixa o arquivo normal, o problema esta na hora de abrir.
    Mas de qualquer forma obrigado. Deve ser problema do meu pc.
    Mas gostei muito do seu suporte, responde muito rápido.
    Um grande abraço. Sou seu fã

    ResponderExcluir
  12. Ola Fernando, teria como disponibilizar o INO. Infelizmente o link esta com erro.

    ResponderExcluir
    Respostas
    1. Olá, Drielly. Desculpe. Fizemos umas atualizações ontem nos links e este ficou com erro. Pode tentar novamente, por favor? Atualizamos agora msm. Obrigado. Abraço

      Excluir
    2. Boa tarde Fernando.
      O arquivo ESP32eESP8266CodigoOTA.rar baixa entretanto não abre. Mensagem de formato invalido ou corrompido.
      Obrigado e super abraço!

      Excluir
    3. Olá, José Antonio.
      Substituímos o arquivo para ver se melhora. Pode tentar novamente, por favor?
      Se não der certo, me avise aqui, que lhe enviaremos por e-mail.
      Abraço

      Excluir
  13. Ola, bom dia.
    Programação no Ar para ESP32, na transferencia ocorre esse erro.
    Sera que vc pode me ajudar.

    esptool: error: argument --baud/-b: invalid arg_auto_int value: '{upload.speed}'

    ResponderExcluir
  14. DÚVIDAS???

    Seu ESP32 ou ESP8266 não aparece listado nas portas COM da Arduino IDE? Tente baixar o driver USB to UART seguindo os links abaixo de acordo com a versão do seu Windows:

    Para o Windows 10
    https://www.silabs.com/documents/public/software/CP210x_Universal_Windows_Driver.zip

    Para o Windows 7/8/8.1
    https://www.silabs.com/documents/public/software/CP210x_Windows_Drivers.zip

    Para o Windows XP/Server 2003/Vista
    https://www.silabs.com/documents/public/software/CP210x_VCP_Windows.zip

    Ou acesse esta página e procure o instalador:
    https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

    Feito isso, o ESP8266 e ESP32 deve aparecer nas portas COM normalmente.

    Abraço!

    ResponderExcluir
  15. Ola, Boa noite Fernando! Primeiramente gostaria de te agradecer imensamente suas aulas estão me ajudando muito em meu projeto para a faculdade. Gostaria de ter o pdf dessa aula mas o link esta quebrado. Tem como consertar?

    ResponderExcluir
  16. Excelente trabalho!
    Ficaria perfeito se pudesse integrar está solução com o Wi-Fi manager! É possível o Wi-Fi manager entrar caso não consiga acessar o Wi-fi?

    ResponderExcluir
  17. Muito boa sua didática, agora segundo entendi , montamos nossas aplicações com esse código e poderemos ter mais flexibilidade em cada projeto em relação a atualização !

    ResponderExcluir
  18. Oi Fernando!
    O endereço do arquivo PDF está errado: http://74.117.156.195/verify.php?arquivo=ESP32eESP8266Programa%C3%A7%C3%A3oOTA.pdf
    O correto deve ser: http://download.fernandok.com/ESP32eESP8266Programa%C3%A7%C3%A3oOTA.pdf

    Parabéns pelo trabalho!

    ResponderExcluir
  19. Ola Fernando, muito bons e didáticos seus artigos e videos, parabens !
    Tenho o ESP-12 já funcionando pelo OTA, mas senti falta das informações usando o monitor serial, que só funciona conectado via USB/FTDI. Existe alguma maneira de usar o monitor serial através do OTA / Wi-Fi ? Sei que o monitor serial funciona através de porta serial , mas tem alguma saída para isso ? A mensagem que obtenho na IDE do Arduino quando tento abrir o monitor serial é : "Serial monitor is not supported on network ports such as 0.0.0.0 for the null in this release". Grato.

    ResponderExcluir
    Respostas
    1. Alessandro, a interface do Arduino permite somente uma conexão por vez, e como o Monitor serial esta dentro você não conseguirá mesmo acessar ao mesmo tempo. Sugestão, monitore sua serial com outro SFT, por exemplo eu utilizo o Hércules: https://www.hw-group.com/software/hercules-setup-utility

      Excluir
  20. Bom dia Fernando não estou conseguindo baixar o arquivo em pdf.

    ResponderExcluir
  21. ola Fernando tenho uma duvida uma vez que eu gravei com o CÓDIGO OTA EU SEMPRE VOU PRECISAR DE COLOCA ESSE CÓDIGO EX: COLOQUEI ESSE CÓDIGO AI O OTA VOU FAZER OUTRO PROJETO COM ESP8266 PRECISO COLOCAR AS PRINCIPAIS COISAS QUE ESTA NO OTA?

    ResponderExcluir
  22. Professor eu gostaria de saber como usar esta biblioteca de programar no Ar junto com a "IRServer" poderia me ensinar por favor.

    ResponderExcluir
  23. Boa tarde Fernando, se eu tiver varias placas com programação pelo ar, tem como eu deixar o ip estático? se não como eu vou saber que cada nodemcu não será programada errado? Se eu colocar um rede e usuário diferente resolve o problema?

    ResponderExcluir
  24. Pessoal no meu teste aqui, o ide pede a senha eu digito, mas sempre da errado. Alguém poderia me dizer o que pode ser?

    ResponderExcluir

Tecnologia do Blogger.