L’ESP32 est un microcontrĂŽleur trĂšs intĂ©ressant, car il regroupe des entrĂ©es sorties analogiques et numĂ©riques ainsi qu’un accĂšs WIFI et Bluetooth. Une fois mis en place pour une application donnĂ©e, il peut ĂȘtre nĂ©cessaire de modifier son programme. Mais s’il se trouve Ă©loignĂ© ou inaccessible de votre PC servant Ă  la programmation, il est possible de le modifier en passant par le Wifi. Cette technique est appelĂ©e OTA (Over The Air).

Choix de la carte ESP32

Il existe de nombreuses cartes sur le marchĂ© Ă  base d’ESP32. Cela peut-ĂȘtre difficile parfois de trouver la dĂ©finition des broches de sorties (GPIO). Ici on utilise une carte de dĂ©veloppement AZ-Delivery avec un ESP32-Wroom et 2×19 broches. Achat possible chez Amazon.

IDE Arduino

La programmation de la carte se fait Ă  l’aide de l’outil de dĂ©veloppement IDE d’Arduino. Il faut dans les prĂ©fĂ©rences faire appel au gestionnaire de carte de « Espressif » qui dĂ©veloppe l’ESP32. Allez dans Fichier / PrĂ©fĂ©rences et mettez l’adresse : https://dl.espressif.com/dl/package_esp32_index.json

Dans le gestionnaire de cartes, choisissez la votre. Dans notre cas ce sera « ESP 32 Dev Module ».

Basic OTA

Dans les exemples, sélectionnez le programme « Basic OTA ».

On va lĂ©gĂšrement modifier le programme proposĂ© pour imposer une adresse IP Ă  l’ESP32.

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "YOUR SSID";
const char* password = "THE PASSWORD";

// Set your Static IP address
IPAddress local_IP(192, 168, 0, 208); //HERE DEFINE YOUR IP ADRESS
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 254);  //DEFINE THE GATEWAY

IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);   //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional


void setup() {
  Serial.begin(115200);
  Serial.println("Booting");

  
 // Configures static IP address
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("STA Failed to configure");
  }
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }


  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();
}

Adaptez le code, « SSID du WIFI, Password et adresse IP.
TĂ©lĂ©chargez ce code par la liaison sĂ©rie. Sur le moniteur, vous retrouverez l’adresse IP prise en compte. Un appui sur le bouton RST permet de bien tester l’ensemble. À ce stade, il vous sera possible de mettre Ă  jour la programmation via le web en choisissant non plus le port sĂ©rie dans l’Ide Arduino, mais le port rĂ©seau, dans notre cas 192.168.0.208. Dans votre code, il faudra intĂ©grer la partie ArduinoOTA afin de conserver cette possibilitĂ©.

Exemple avec « Debug »

En passant par le Wifi vous allez perdre la possibilitĂ© de debug par le port sĂ©rie. La biblothĂšque « RemoteDebug » va nous permettre de retrouver cette possibilitĂ© par une Ă©coute Telnet sur le port 23. A titre d’exemple, on va faire un petit serveur web sur le port 80.

#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ArduinoOTA.h>
#include <RemoteDebug.h>

const char* ssid = "MyWIFI";
const char* password = "12345678";
RemoteDebug Debug;
unsigned long previousMillis;


// Set your Static IP address
IPAddress local_IP(192, 168, 0, 208);
// Set your Gateway IP address
IPAddress gateway(192, 168, 0, 254);

IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);   //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional

WebServer server(80);
  

void handleRoot() {
  Debug.println(F("Client Web"));
  server.send(200, "text/plain", "Hello Client");
 
}

void handleNotFound() {
 Debug.println(F("File Not Found"));
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup() {
 // Configures static IP address
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Debug.println("STA Failed to configure");
  }

 WiFi.begin(ssid, password);
 while (WiFi.waitForConnectResult() != WL_CONNECTED) {
   Debug.println("Connection Failed! Rebooting...");
   delay(5000);
   ESP.restart();
 }
 // init remote debug
 Debug.begin("ESP32");  
 
 initOTA();
 Debug.println("Ready");
 Debug.print("IP address: ");
 Debug.println(WiFi.localIP());

server.on("/", handleRoot);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Debug.println("HTTP server started");
 
}
void loop() {
 ArduinoOTA.handle();
 Debug.handle();
 server.handleClient();
 if (millis() - previousMillis >= 5000) {
   previousMillis = millis();
   Debug.println(F("Code has been update"));
 }
}
void initOTA() {
 // Port defaults to 3232
 // ArduinoOTA.setPort(3232);
 // Hostname defaults to esp3232-[MAC]
 ArduinoOTA.setHostname("ESP32");
 // 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()
   Debug.println("Start updating " + type);
 })
 .onEnd([]() {
   Debug.println("\nEnd");
 })
 .onProgress([](unsigned int progress, unsigned int total) {
   Debug.printf("Progress: %u%%\r", (progress / (total / 100)));
 })
 .onError([](ota_error_t error) {
   Debug.printf("Error[%u]: ", error);
   if (error == OTA_AUTH_ERROR) Debug.println("Auth Failed");
   else if (error == OTA_BEGIN_ERROR) Debug.println("Begin Failed");
   else if (error == OTA_CONNECT_ERROR) Debug.println("Connect Failed");
   else if (error == OTA_RECEIVE_ERROR) Debug.println("Receive Failed");
   else if (error == OTA_END_ERROR) Debug.println("End Failed");
 });
 ArduinoOTA.begin();
}

Cette fois-ci, tĂ©lĂ©chargez le code via le rĂ©seau Wifi. En parallĂšle, ouvrez une session Telnet avec un programme comme Putty. Rentrez l’adresse IP de l’ESP32 et le port 23. Ouvrez votre navigateur web, et rentrez l’adresse IP de l’ESP.

Vous pouvez à présent vous inspirer de cette exemple pour votre application à mettre à jour via le Wifi.

Bugs IDE Arduino

En attendant des corrections, l’IDE Arduino a 2 dĂ©sagrĂ©ments :
– il demande un mot de passe pour tĂ©lĂ©charger en mode OTA bien que la programmation n’en impose pas. Il suffit de rentrer une lettre quelconque.
– parfois en fin de tĂ©lĂ©chargement la flĂšche reste orange. Il faut relancer l’IDE pour tĂ©lĂ©charger Ă  nouveau.

Cet article a 31 commentaires

  1. Eric Ndjulu

    Intéressant, du bon travail Mr André ! Merci !
    Je vais m’en inspirer !

  2. Serge 11

    Bonjour,
    A quoi correspond la ligne: IPAddress gateway(192, 168, 0, 254) par rapport a IPAddress local_IP(192, 168, 0, 208) qui est l’adresse local.
    Ou trouver ou comment déterminer IPAddress gateway.
    D’avance merci.

    1. F1ATB André

      Gateway, c’est la passerelle qui vous permet d’accĂ©der au monde extĂ©rieur. En pratique c’est l’adresse IP de votre box internet sur le rĂ©seau interne Ă  la maison. 192.168. et se termine souvent en 0.1 ou 0.254 ou 1.0 ou 1.254.

  3. Serge 11

    Bonjour,
    Je viens de tester l’OTA.
    Avant chaque tĂ©lĂ©versement, il me demande un MP? Dans le doute j’ai saisie celui du MD5(admin) et cela fonctionne mais je ne comprends pas pourquoi vu que dans le sketch il est en commentaire?
    A la fin du tĂ©lĂ©chargement, l’IDE ne le dĂ©tecte pas et l’animation de tĂ©lĂ©chargement continue. le bouton « tĂ©lĂ©verser » reste en jaune. Je dois fermer Arduino IDE pour pouvoir refaire un tĂ©lĂ©chargement!
    Vous avez une idée de la portée du WiFi?
    Prendre un ESP avec antenne externe est vraiment un plus?
    Merci d’avance pour vos rĂ©ponses.

    1. F1ATB André

      Ce sont les petits dĂ©sagrĂ©ments de l’IDE d’Arduino.
      Pour le mot de passe, mettez n’importe quoi. Une lettre suffit.
      Pour le tĂ©lĂ©verser en jaune, je peste aussi. Mais certains jours cela marche. Je n’ai pas encore compris pourquoi.

  4. pat34

    Bonjour Mr Andre,
    Me suis inspirer de cet excellent travail pour monter un routeur solaire….Mais j »ai un souci pour communiquer en WIFI .
    voici le rapport arduino IDE 2.0.4 :

    Le croquis utilise 846766 octets (64%) de l’espace de stockage de programmes. Le maximum est de 1310720 octets.
    Les variables globales utilisent 47112 octets (14%) de mémoire dynamique, ce qui laisse 280568 octets pour les variables locales. Le maximum est de 327680 octets.
    Sending invitation to 192.168.1.60
    12:11:36 [ERROR]: No response from device
    Failed uploading: uploading error: exit status 1

    E t voici le rapport via putty de ESP32 :

    (D) Power:95.00
    * Debug: Command received: d
    * Debug level set to Debug
    (D) V25:-401.43
    (D) Idx0:21
    (D) Power:98.00
    (D) V25:-432.51
    (D) Idx0:45
    (D) Power:99.00
    (D) Start updating sketch
    Error[3]: Receive Failed
    (D) V25:-403.28

    Je n’arrive pas a trouver ce qui ne va pas …. ça semble communiquer … mais rien ne se transfert …
    Si vous avez une idĂ©e …
    Merci
    Cordialement
    Pat34

    PS:
    J’ai fait des sauvegardes Ă©cran que je peux vous transfĂ©rer par mail

    1. F1ATB André

      Au moment ou l’IDE Arduino veut lancer le transfert. Appuyez sur le bouton reset de la carte. Certaines cartes l’exigent.
      Cdlt

      1. pat34

        xfert OK . Merci

        Pour avoir 231V au display sur la WEB, la valeur Kv a été mise a 0,2141.
        Cette valeur est bien lue au display sur le web a 231V au démarrage

        Le problĂšme : Cette valeur dĂ©croit dans le temps pour passer au bout de 30mn a …. 40V.

        Avez vous rencontré ce pb ?
        Merci de votre aide.
        Pat34
        Pour info, l’intensitĂ© est stable et conforme a la rĂ©alitĂ© …

        1. F1ATB André

          Alors lĂ , vous me laissez sans voix… Je n’ai aucune idĂ©e de la cause.
          Cdlt
          André

  5. F1GSM

    Bonjour André
    Merci pour ce beau travail !
    Tout ce passe bien sauf au moment de la compilation.J’ai le message d’erreur suivant :
    fatal error: RemoteDebug.h: No such file or directory
    compilation terminated.Manque t il quelque chose ?
    Merci par avance pour votre lumiĂšre.
    Cordialement,
    Christophe

    1. F1ATB André

      Vous avez oubliĂ© je pense d’installer la bibliothĂšque RemoteDebug de JaoLopes
      73

  6. david powolny

    Bonjour , nous sommes intĂ©ressĂ©s par le projet mais la version du EP32 nous fais douter , pouvez vous nous confirmer quelle est la version ESP32D-CH9102X WROOM 32 qu’il faut acheter svp ? sachant qu’il y a des USB C … merci beaucoup

    1. F1ATB André

      Oui mais je pense qu’il y a une faute (D) dans votre rĂ©fĂ©rence. C’est plutĂŽt ESP32-CH9102X WROOM 32D
      Cdlt

  7. Dupont Dan

    Bonjour, comment changer le nom d’un nouveau SSID et un nouveau mot de passe? Merci

  8. Dupont Dan

    J’ai oublier de mentionner que c’est la version V 3.04Uxl que j’ai tĂ©lĂ©charger ssid et mot de passe avec 192.168.4.1. Mais je voudrai changer de rĂ©seau oĂč modifier le ssid et le nouveau mot de passe? Impossible de rouvrir le site 192.168.4.1 pour mofifier. Cordialement

  9. Dupont Dan

    Bonjour,j’ai tĂ©lĂ©charger la version V 3.04Uxl mis le ssid et le mot de passe avec 192.168.4.1. Mais je voudrai changer de rĂ©seau , comment modifier le ssid et le nouveau mot de passe? Impossible de rouvrir le site 192.168.4.1 pour modifier. Cordialement

    1. F1ATB André

      A la ligne 19 vous changez un chiffre quelconque de la constante.
      #define CLE_Rom_Init 1234567892

      1. Dupont Dan

        Merci.

  10. Jean-Yves

    Bonjour, J’ai enfin rĂ©ussi mon installation non sans difficultĂ©s, ce n’est pas la partie hardware qui me pose problĂšme mais logiciel par manque de connaissances. Je suis enfin arrivĂ© Ă  l’Ă©tape oĂč la led clignote toutes les 2s mais en voulant me connecter via le navigateur Ă  l’aide de l’adresse IP de l’esp32, rien ne se passe, aucun accĂšs. Ai-je loupĂ© quelque chose ? Merci !

    1. F1ATB André

      Avez vous rĂ©cupĂ©rez l’adresse IP attribuĂ©e par votre box? Elle est donnĂ©e sur le moniteur serie de l’IDE Arduino quand vous ĂȘtes connectĂ© en USB.

      Cdlt

  11. MATHIEU Jean

    Bonsoir André,
    Pour rappel, je suis avec deux ESP32 qui sont en service avec la version V6_01, tout ça fonctionne trÚs bien, « je suis sur un nuage »
    LĂ  ou « je ne suis plus sur un nuage » c’est avec la fonction OTA, oĂč je n’y comprends pas grand chose, pour simplifier, je vais vous dire se que je crois avoir compris.
    1_ Si j’ai bien compris il faut adapter BasicOTA, est ce qu’il faut copier/coller l’intĂ©gralitĂ© de l’exemple que vous donnez ici, mettre le nom de ma BOX et de son mot de passe, lĂ  ou je suis noyĂ© c’est avec cette adresse IP: IPAddress local_IP(192, 168, 0, 208);
    est ce qu’il faut sauvegarder ces modifications et oĂč.
    2_ Est ce qu’il faut passer par l’adresse IP d’une de mes deux cartes, adresses IP que je vois bien dans Outils/RĂ©seaux ports.
    3_ Comme se n’est pas correctement configurait quelque part, pour le moment ça ne fonctionne pas, oui, ça tĂ©lĂ©verse, puis message d’erreur
    https://ibb.co/wKt83Cf
    https://ibb.co/DWzJWT1
    https://ibb.co/ydyjqDS
    https://ibb.co/Hz40Qtr
    Peut ĂȘtre qu’avec de l’aide je vais finir par comprendre quelque chose. Merci.
    Jean

    1. F1ATB André

      L’OTA est dĂ©jĂ  implantĂ© dans le programme du routeur. Vous n’avez rien Ă  changer.
      Cela peut vous servir Ă  installer la version 6.02 en lieu et place de la 6.01
      Vous ouvrez la version 6.02 dans l’IDE, vous sĂ©lectionnez la carte comme sur votre premiĂšre photo. Le logiciel sera chargĂ© en passant par le Wifi (OTA=On The Air, par Radio) et non pas par cĂąble USB comme la premiĂšre fois.
      Les messages « No Monitor available.. » sont normaux et pas gĂȘnants. C’est juste pour dire que vous ne pouvez pas avoir de sortie sur moniteur comme lorsque vous ĂȘtes branchĂ©s en USB.

      Cdlt

      1. MATHIEU Jean

        Merci André,
        Je viens d’essayer de nouveau, avec l’adresse IP du routeur de la salle de bain 192.168.1.163, message d’erreur Ă  la fin du tĂ©lĂ©versement.
        https://ibb.co/ctrMWVc
        Bien sur je vĂ©rifie sur la page web du routeur, et voir si ça a changĂ© de version en bas de la page d’accueil

  12. MENOU denis

    Bonjour,
    Je ne suis pas trés alaise en informatique , je voudrai contruire votre routeur
    je rencontre des probléme avec les erreurs au moment de verifier le programme
    quel sont les programmes à téléchargeur sur la biblioteque Arduino et les drivers

    fatal error: hwcrypto/sha.h: No such file or directory
    #include

    je vous remercie pour votre aide

  13. DEBAVI

    Bonjour, je tente de compiler les le SOLAR_ROUTER _V8_RMS.ino et j’obtiens le message suivant en fin de compilation : Compilation error: RemoteDebug.h: No such file or directory
    J’ai tentĂ© des debug mais rien n’y fait.
    Aussi je n’arrive pas Ă  ouvrir l’adresse IP 192.168.4.1 que vous indiquez mais il n’y a pas d’accĂšs possible.
    Je vous remercie pour votre aide
    Cordialement

  14. Fano

    Bonjour, j’essaie de compiler le programme de routeur Solar_Router_V8_09_RMS mais je reçois le message d’erreur intitulĂ© :
    pageHtmlBrute.h
    introuvable dans la bibliothĂšque.
    merci pour votre retour

    1. F1ATB André

      Vous avez du oublier de déziper (extraire) le fichier .zip dans un dossier.

      Cdlt

      1. Fano

        En effet.
        Merci beaucoup.
        J’ai un autre souci, lorsque je me connecte sur le rĂ©seau wifi de la carte esp32 et que je rentre son adresse IP dans la barre de recherche internet, je reçois le message « serveur introuvable ».
        Comment régler ce problÚme svp?
        merci

        1. F1ATB André

          Regardez sur le port sĂ©rie, le moniteur, l’adresse IP auquel se connecte l’ESP. L’info est donnĂ©e toutes les 30s. Il y a une erreur quelque part.

Les commentaires sont fermés.