Não seria ótimo se livrar dos cabos e programar o seu módulo ESP32 por wifi? Isso é possível com o OTA (Over-The-Air), um modo de programação onde você utiliza a rede wireless para transferir remotamente o sketch (programa) para a sua placa.
O uso do OTA leva os seu projeto de Internet das Coisas (IoT) para um outro patamar, minimizando erros causados por remontagem de circuitos e permitindo a atualização de um programa em poucos minutos.
O que é e por que você precisa do OTA
O OTA está disponível em várias placas do mercado, como a linha ESP8266 e a ESP32, e permite que você (re)programe o módulo remotamente via wifi, sem a necessidade de conectar o módulo em um computador.
Isso é muito útil quando o módulo está em um local de difícil acesso e você precisa alterar alguma coisa na programação. Em condições “normais”, você teria que retirar por exemplo o ESP32 do circuito, conectá-lo em um computador, reprogramá-lo e depois devolver o módulo para o circuito.
Um grande transtorno se o seu módulo estiver dentro de algum equipamento, no meio de uma plantação coletando dados ou em algum outro local onde montar e desmontar um circuito não seja uma tarefa fácil.
Com o OTA, basta que o módulo esteja na mesma rede do computador, e toda a programação será feita via rede wireless.
Preparação do módulo ESP32 na IDE Arduino
Antes de mais nada, precisamos preparar a IDE do Arduino para utilização com o ESP32. Entre na IDE e no menu Arquivo -> Preferências, adicione a URL abaixo no campo URLs Adicionais para Gerenciadores de Placas:
https://dl.espressif.com/dl/package_esp32_index.json
Sua tela ficará assim:
Clique em OK e em seguida vá até o menu Ferramentas -> Placa -> Gerenciador de Placas e procure por ESP32, selecionando ESP32 by Espressif Systems e clique em Instalar:
Aguarde alguns instantes e as placas da linha ESP32 serão instaladas na IDE do Arduino. Novamente no menu Ferramentas -> Placa, selecione agora ESP32 Dev Module, conforme a imagem abaixo:
Com a seleção desta placa, serão adicionados novos exemplos na IDE do Arduino específicos para utilização com o ESP32.
Atenção: Recomendo a instalação do Python e da biblioteca pyserial para evitar erros de compilação do programa. A versão mais recente do Python para instalação você encontra neste link. Caso ainda esteja enfrentando problemas, recomendo seguir o tutorial Como programar o módulo ESP32 com IDE Arduino aqui mesmo no Arduino e Cia.
Carregando o BasicOTA no módulo ESP32 wifi
Um desses exemplos é o que vamos utilizar para configurar o módulo ESP32 para que ele fique “esperando” uma conexão via rede wifi para atualização do programa. Esse exemplo é o BasicOTA, e você pode carregá-lo no menu Arquivo -> Exemplos -> ArduinoOTA -> BasicOTA:
No programa BasicOTA, que eu reproduzo abaixo, configure nas linhas 6 e 7 o nome e senha, respectivamente, da sua rede wifi. É a única alteração no programa:
#include <WiFi.h> #include <ESPmDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> const char* ssid = "SUA-REDE-WIFI"; const char* password = "SUA-SENHA-WIFI-AQUI"; 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(); } // Port defaults to 3232 // ArduinoOTA.setPort(3232); // Hostname defaults to esp3232-[MAC] // ArduinoOTA.setHostname("myesp32"); // No authentication by default // ArduinoOTA.setPassword("admin"); // Password can be set with it's md5 value as well // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3 // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3"); 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); }) .onEnd([]() { Serial.println("nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%r", (progress / (total / 100))); }) .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"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { ArduinoOTA.handle(); }
Observe que nessa parte ainda estamos com o módulo fisicamente conectado no computador, acessando o ESP32 via porta serial (COM). Transfira então o BasicOTA normalmente para o módulo. Não esqueça que em alguns módulos é necessário manter pressionado o botão BOOT para que o programa seja transferido corretamente.
Reinicie o ESP32 (no meu módulo, é o botão EN) e aguarde o processo de configuração, que pode ser acompanhado pelo serial monitor:
Na última linha mostrada na imagem acima, temos o endereço IP que foi obtido pelo ESP32: 192.168.0.124.
Programando o ESP32 por Wifi usando OTA
Agora vamos desconectar o módulo ESP32 do computador e transferir um programa remotamente. Alimente o módulo com uma fonte externa (uma fonte de telefone celular, por exemplo).
Abra a IDE do Arduino e no menu Ferramentas -> Porta, observe que foi adicionada uma porta de rede com o endereço IP obtido anteriormente:
Selecione essa porta e carregue o programa abaixo na IDE. O grande “segredo” deste programa é a manutenção da estrutura usada anteriormente no BasicOTA, onde vamos manter as chamadas das bibliotecas, as configurações de acesso a rede wifi (para que o módulo permaneça conectado) e também as chamadas para o ArduinoOTA, que fará com que o ESP32 continue aguardando o carregamento de novos programas quando for necessário.
Temos então o mesmo programa usado anteriormente, mas agora com as configurações para que o led onboard do ESP32 pisque em intervalos regulares. Acrescentamos:
- Na linha 10 a definição da porta 2 como saída
- Dentro do loop, entre as linhas 69 e 72, a rotina para que o led acenda e apague em intervalos de 1 segundo
Nosso programa então fica assim. Não esqueça de novamente colocar o nome e senha da sua rede wifi nas linhas 6 e 7:
#include <WiFi.h> #include <ESPmDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> const char* ssid = "SUA-REDE-WIFI"; const char* password = "SUA-SENHA-WIFI-AQUI"; void setup() { pinMode(2, OUTPUT); //Linha incluida 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(); } // Port defaults to 3232 // ArduinoOTA.setPort(3232); // Hostname defaults to esp3232-[MAC] // ArduinoOTA.setHostname("myesp32"); // No authentication by default // ArduinoOTA.setPassword("admin"); // Password can be set with it's md5 value as well // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3 // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3"); 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); }) .onEnd([]() { Serial.println("nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%r", (progress / (total / 100))); }) .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"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { ArduinoOTA.handle(); digitalWrite(2, HIGH); //Linha incluida delay(1000); //Linha incluida digitalWrite(2, LOW); //Linha incluida delay(1000); //Linha incluida }
Se você estiver usando Windows, na primeira vez que você tentar transferir o programa ele vai mostrar um aviso do firewall, indicando que o espota.exe está tentando acessar a rede. No nosso caso habilitamos as opções de acesso a rede pública e privada e selecionamos Allow Access (Permitir Acesso):
Por causa desse aviso, a IDE do Arduino pode mostrar uma mensagem de erro. Observe que no lado inferior direito da IDE estamos usando como porta para transferência o IP 192.168.0.124:
Refaça o procedimento de upload do programa, e se tudo estiver ok, o programa será carregado corretamente e o led onboard do módulo ESP32 começara a piscar:
Gostou? Confira outros posts com módulo ESP32 Wifi aqui mesmo no Arduino e Cia!