Programmation de l’ESP32 par le Wifi

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.

F1ATB André

Radio Amateur - Domotique - Photovoltaïque

Vous aimerez aussi...

27 réponses

  1. Eric Ndjulu dit :

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

  2. Serge 11 dit :

    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.

    • F1ATB André dit :

      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 dit :

    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.

    • F1ATB André dit :

      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 dit :

    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

    • F1ATB André dit :

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

      • pat34 dit :

        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é …

  5. F1GSM dit :

    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

  6. david powolny dit :

    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

  7. Dupont Dan dit :

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

  8. Dupont Dan dit :

    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 dit :

    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

  10. Jean-Yves dit :

    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 !

    • F1ATB André dit :

      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 dit :

    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

    • F1ATB André dit :

      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

  12. MENOU denis dit :

    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 dit :

    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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *