Mise à jour en OTA

Bonjour,

Je tenais a remercier la communauté d'avoir répondu à ma première question hier soir et en voici une autre.

J'ai trouvé un petit tuto (ESP8266 + ArduinoOTA: Uploadez vos programmes par WiFI) pour faire une mise à jour en OTA, car mon projet en cours est dans une boîte de dérivation électrique et quand je fais des correctifs ou amélioration, j'ai pas envie d'ouvrir la boîte à chaque fois, déconnecter mon câble USB, qui n'est pas un câble DATA car il y a un interrupteur, mettre un câble DATA, connecter sur un PC, etc..
J'ai découvert cette fonction OTA, par hasard, qui est parfait pour moi, car mon projet est connecté à mon WiFi.
Mais je sais pas trop comment le mettre dans mon code actuel, enfin je pense avoir une idée avec les exemples donnés, mais je sais pas où mettre la fonction du mot du passe, car oui même si le réseau wifi est sécurisé par un filtrage MAC c'est pas fiable à 100%, où dois-je mettre la fonction du mot de passe dans mon croquis ?

J'ai une carte D1 Mini (v2 je crois) et je sais pas si c'est possible avec cette carte de faire des mises à jour OTA, je pense que oui, vu que c'est un ESP8266, mais bon voilà je débute ^^

Merci d'avance pour vos réponses :wink:

Bonjour

Oui les cartes D1 Mini supportent la mise à jour par OTA
Partir de l'exemple basicOTA proposé avec l'extension ESP8266 pour IDE Arduino

Un autre tutoriel : ESP8266 OTA with Arduino IDE | Random Nerd Tutorials

pour le mot de passe facultatif , son activation éventuelle est positionnée (dans l'exemple basicOTA livré avec l'IDE Arduino) en ligne 32 et il suffit de supprimer le // de début de ligne pour l'activer dans le code

Donc si j'ai bien compris, tout ce code:

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";
    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.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());
}

Se met entre setup() et loop() ?

Mais je sais pas où mettre ceci:

  // Hostname defaults to esp8266-[ChipID]
  // ArduinoOTA.setHostname("myesp8266");

  // No authentication by default
  // ArduinoOTA.setPassword("admin");

  // Password can be set with it's md5 value as well
  // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
  // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");

C'est dans setup() ? Car dans l'exemple il ne mette pas :frowning:

C'est dans setup() ? Car dans l'exemple il ne mette pas

Bizarre...chez moi dans l'exemple basicOTA fourni dans l'IDE (je ne parle pas des tutos) tout ceci est entre les lignes 25 à 36 dans le setup()
exemple.jpg

menu Fichier/exemples/ArduinoOTA/BasicOTA

exemple.jpg

Oui tu as raison c'est moi qui est mal calculé les { } en effet c'est dans setup() par contre ça va fonctionner avec le hash MD5 ? Car c'est quand même un peu plus sécurisé comme cela :wink:

hash MD5, c'est "étudié pour" et ça doit fonctionner

Ok je vais essayer avec cela pour voir, sinon j'ai un doute sur le ArduinoOTA.handle(); qui est dans le loop(), je dois le mettre au tout début ou à la fin de tout mon code que j'ai écrit ?

s'il est dans loop() il sera exécuté à chaque tour de boucle, peu importe le moment à priori... laises le au début pour ne pas l'oublier et le mettre visuellement bien en évidence !!

al1fch:
s'il est dans loop() il sera exécuté à chaque tour de boucle, peu importe le moment à priori... laises le au début pour ne pas l'oublier et le mettre visuellement bien en évidence !!

Ok, oui je fais toujours une argumentation pour m'y retrouver quand je repasse plus tard après, une habitude que j'ai prise en codant en PHP/SQL :slight_smile:
Donc vu que j'ai une fonction qui fait que mon loop() est lancé tout les 6 secondes, il va donc vérifier toute les 6 secondes si une mise à jour est envoyée, donc si rien de tels, il fera rien de ce que j'ai compris. Je vais le mettre au début comme tu me le conseille :wink:

Voilà j'ai fais et envoyé le croquis sur le D1 mini, pas eu d'erreur mais par contre le IDE ne le trouve pas sur le réseau :confused:
Je suis sur un PC connecté avec un câble ethernet sur une livebox, c'est peut-être pour ça non ?

Alors, pour les personnes qui découvrent comme moi, je vais expliquer pourquoi j'ai eu des soucis.

Mon IDE ne voyant toujours pas mon ESP8266 D1 mini, je me suis dit que cela venait que mon PC de développement était connecté en ethernet sur ma box. J'ai donc installé IDE sur un PC qui se connecte en WiFi. J'ai tout installé, mis à jour et je ne voyais pas mon ESP8266... J'ai regardé dans la bibliothèque et là j'ai vu que le ArduinoOTA n'était pas installé.
J'ai donc été sur le PC de développement et j'ai constaté la même chose... J'ai dit installé la bibliothèque, fait un nouveau téléversement sur mon ESP8266, fermer IDE et relancé...
Et la miracle je le voit !!
Vu que la ligne #DEFINE de <ArduinoOTA.h> était orange, je me disais c'est bon pas de soucis, de plus le compilage ne m'a dit aucune erreur, je me suis pas douté de cela...

Bref là je le vois, il me reste à testé un autre téléversement pour voir si c'est OK :slight_smile:

al1fch:
hash MD5, c'est "étudié pour" et ça doit fonctionner

Juste pour te dire que dans mon cas, le MD5 ne fonctionne pas, je tape le bon mot de passe et ça me dit à chaque fois erreur...

Authenticating...OK
20:36:13 [ERROR]: No response from device
Authenticating...OK
Uploading...
20:36:33 [ERROR]: Error Uploading
Authenticating...OK
Uploading....
20:36:54 [ERROR]: Error Uploading

J'ai fais sans le hash donc et j'ai le même soucis...
Authenticating...OK
Uploading....
20:44:19 [ERROR]: Error Uploading
Authenticating...OK
Uploading...
20:44:38 [ERROR]: Error Uploading
Authenticating...FAIL
20:44:45 [ERROR]: Authentication Failed
Authenticating...OK
Uploading....
20:45:08 [ERROR]: Error Uploading
Authenticating...OK
Uploading...
20:45:40 [ERROR]: Error Uploading

Ma portion de code en question

    // Mise à jour OTA
    // Nom réseau de la carte
    ArduinoOTA.setHostname("MeteoCast_SQB");

    // Mot de passe d'accès OTA
    ArduinoOTA.setPassword("monmotdepasse");
    
    ArduinoOTA.onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH) {
        type = "sketch";
      } else { // U_FS
        type = "filesystem";
      }
      // NOTE: if updating FS this would be the place to unmount FS using FS.end()
      Serial.println("Démarrage de la mise à jour " + type);
      });
      
    ArduinoOTA.onEnd([]() {
      Serial.println("\nFin");
    });
    
    ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progression: %u%%\r", (progress / (total / 100)));
    });
    
    ArduinoOTA.onError([](ota_error_t error) {
      Serial.printf("Erreur[%u]: ", error);
      if (error == OTA_AUTH_ERROR) {
        Serial.println("Authentification échouée");
      } else if (error == OTA_BEGIN_ERROR) {
        Serial.println("Démarrage échoué");
      } else if (error == OTA_CONNECT_ERROR) {
        Serial.println("Connexion échouée");
      } else if (error == OTA_RECEIVE_ERROR) {
        Serial.println("Réception échouée");
      } else if (error == OTA_END_ERROR) {
        Serial.println("Fin échouée");
      }
    });
    
    ArduinoOTA.begin();

    // Affichage de la connexion au WIFI
    Serial.print(" Connecté - IP Réseau Local: ");
    Serial.println(WiFi.localIP());
    lcd.setCursor(14,0);     //
    lcd.print(char(7));      // Affichage sur le LCD de la connexion

Je rajoute l'information de la carte, c'est "Crazepony-UK D1 Mini NodeMcu 4M Bytes Lua WIFI Development Board ESP8266 ESP-12F" et joins des photos, car je comprends pas trop... Je choisi la carte LOLIN (wemos) D1 R2&mini mais est-ce que c'est ça ? ça téléverse bien en USB mais en OTA, je fais comme il faut ça bug toujours à l'upload mais ça fait relancer la carte...

Bonjour,

Donc vu que j'ai une fonction qui fait que mon loop() est lancé tout les 6 secondes, il va donc vérifier toute les 6 secondes

Si c'est à cause d'une fonction bloquante, je ne suis pas sûr que cela soit compatible avec l'OTA.
La loop doit être plus court...

Zlika:
Bonjour,

Si c'est à cause d'une fonction bloquante, je ne suis pas sûr que cela soit compatible avec l'OTA.
La loop doit être plus court...

Oui effectivement c'était pour faire une pause mais je peux m'en passer, je l'ai supprimé mais j'ai toujours le même soucis, j'ai cherché sur le forum et une personne avait eu le même soucis, ça plantait à l'upload. Une personne avait faire une installation de python et le soucis était réglé, moi ça règle pas à moins qu'il faut reboot le pc, une autre c'était un problème d'alimentation, mais là sur mes test je suis avec un powerbank qui peut délivrer 2.4A, j'ai tout essayé c'est toujours pareil :frowning:

Bonjour,
Voici un exemple qui fonctionne bien que j'ai réalisé:

volet Roulant

Il faut que le "port ota" soit créer dans la liste des port disponible sous l'ide arduino et le sélectionner

Bon développement!

Ok merci, je regarde votre projet, j'avoue pas tout comprendre mais je pense avoir fait pareil, en faisant des copier/coller de l'exemple, mais à chaque upload j'avoir une erreur et la carte à l'air de reboot.. Je sais pas trop pourquoi..
En passant une bonne partie de la nuit, j'ai vu que c'était une erreur: RST CAUSE: 4, BOOT MODE:(3,6)

J'ai essayé avec autre chose 8266httpupdateserver mais alors là ça fait planté en continue la carte...

Voilà ce que j'ai après avoir fait comme dans le projet de volet roulant...
Je vais péter une pile sérieux...

Le croquis utilise 323628 octets (30%) de l'espace de stockage de programmes. Le maximum est de 1044464 octets.
Les variables globales utilisent 30040 octets (36%) de mémoire dynamique, ce qui laisse 51880 octets pour les variables locales. Le maximum est de 81920 octets.

Authenticating...OK
Uploading...
15:54:31 [ERROR]: Error Uploading

15:54:46 [ERROR]: No Answer

Authenticating...OK
Uploading...
15:54:53 [ERROR]: Error Uploading

15:55:08 [ERROR]: No Answer

Authenticating...OK
Uploading...
15:55:14 [ERROR]: Error Uploading

Start OTA
Progress: 0%
Progress: 0%
Progress: 0%
Exception (0):
epc1=0x40201048 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

stack>>>

Voilà ce que je vois sur termite, j'ai recherché et beaucoup parle de chute de tension qui provoque cela lors de mise à jour OTA.

Pour toute personne ayant le même problème, assurez-vous que votre appareil est alimenté par une source d'alimentation de 3,3 V capable de fournir au moins 200 mA de courant. N'oubliez pas non plus d'ajouter un condensateur de 10 uF sur les rails et de positionner l'ESP8266 aussi près que possible du condensateur. J'avais aussi le problème ci-dessus jusqu'à ce que j'ajoute le condensateur; maintenant tout est solide comme le roc.

Si cela ne fonctionne toujours pas, le reflasher peut être une bonne idée.

RST CAUSE: 4,
Un 4 dans ce type de message spontané au redémarrage correspond à un reset par le chien de garde , pas un un défaut d'alimentation.

Tu as quelque part un boucle qui monopolise trop longtemps l'ESP8266 et ne permet pas au WiFi prendre la main régulièrement la main en tâche de fond lorsque c'est nécessaire pour maintenir la conection au point d'accès.

le causes de Reset sont expliquées dans ce document officiel : https://www.espressif.com/sites/default/files/documentation/esp8266_reset_causes_and_common_fatal_exception_causes_en.pdf voir la table 1.1 page 1

un conseil
1)mettre au point un programme perso sans OTA , tournant sans pb
2)prendre en mains l'OTA avec l'exemple basique
3)ajouter ensuite l'OTA au programme perso