La librairie ArduinoOTA est une librairie qui permet de mettre à jour le programme Arduino (et ESP8266, ESP32) sans fil en Wi-Fi. C’est une librairie essentielle lorsqu’on développe des objets connectés. Elle permet de mettre à jour le programme sans avoir à démonter le micro-contrôleur (Arduino, ESP8266, ESP32) pour le connecter à son ordinateur.
Cette librairie initialement développée pour mettre à jour les programmes Arduino, elle est parfaitement supportée par les ESP8266 et ESP32. Pour ce tutoriel, nous allons aborder uniquement le cas des ESP8266.
Installer la librairie ArduinoOTA pour ESP8266 sur l’IDE Arduino
La librairie ArduinoOTA est intégrée dans la librairie des cartes ESP8266. Il n’y a donc rien de plus à installer. Si vous débutez avec les ESP, voici comment installer le librairies et le support des cartes ESP. Ouvrez les préférences (depuis le menu Arduino) et ajoutez à la liste des packages celui-ci
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Ensuite, allez dans le gestionnaire de carte et cherchez esp8266, puis cliquez sur installer.
Après l’installation, de nouveaux exemples ont été ajoutés dans le menu des exemples. Sélectionnez votre carte ESP8266 pour faire apparaître les exemples disponibles. Ouvrez l’exemple BasicOTA qui se trouve dans le sous-menu ArduinoOTA.
Ce programme contient tout ce qu’il faut pour gérer la mise à jour sans fil dans vos projets ESP.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char* ssid = "..........";
const char* password = "..........";
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 8266
// ArduinoOTA.setPort(8266);
// Hostname defaults to esp8266-[ChipID]
ArduinoOTA.setHostname("Demo OTA ESP8266");
// No authentication by default
ArduinoOTA.setPassword((const char *)"123");
ArduinoOTA.onStart([]() {
Serial.println("Start");
});
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());
}
void loop() {
ArduinoOTA.handle();
}
Avant de teléverser le programme, modifiez les variables ssid (réseau Wi-Fi sur lequel se connecter) et password (mot de passe).
Ici, le programme utilise la librairie ESP8266WiFi pour se connecter au réseau. Vous pouvez également utiliser la librairie WiFiManager présentée précédemment.
Une fois que la connexion est établie, il est possible de définir des paramètres complémentaires (optionnels) :
- setPort() : par défaut le port de communication est le 8266. Il n’est pas très utile de la changer sauf à ce qu’il soit déjà utiliser. Par exemple pour un projet intégrant de la communication UDP.
- setHostname() : c’est probablement l’option la plus importante. Elle permet d’attribuer un nom à l’ESP8266. Si vous avez beaucoup d’objets sur votre réseau, il sera beaucoup plus facile de l’identifier par son nom que par un identifiant construit automatiquement à partir du numéro de série.
- setPassword() : permet de demander un mot de passe depuis l’IDE Arduino avant d’exécuter une mise à jour. Pratique si vous travaillez à plusieurs ou dans un établissement scolaire.
Quatre autres méthodes permettent de brancher des traitements dans les cas suivants :
- onStart() : code à exécuter au démarrage de la mise à jour
- onEnd() : idem à la fin
- onProgress() : durant la progression
- onError() : et en cas d’erreur
Vous n’aurez pas besoin d’ajouter des traitements dans la plupart des cas. Ces fonctions permettent surtout de rester informé du bon déroulement des opérations.
A la fin du setup, une fois que toutes les fonctions ont été définies, on démarre la prise en charge de la mise à jour sans fil en appelant la méthode begin().
Enfin, pour que tout fonctionne, il est nécessaire d’appeler la méthode ArduinoOTA.handle() dans la boucle loop().
Tester la mise à jour sans fil
Téléversez le programme et ouvrez le Terminal pour vérifier que l’ESP8266 est correctement connecté au réseau Wi-Fi.
L’IDE Arduino détecte automatiquement les appareils supportant la mise à jour à distance. Ils sont ajoutés à la liste des ports dans une nouvelle section appelée Network ports.
Pour mettre à jour le programme, il suffit de sélectionner l’ESP comme port à la place du port série habituel. Puis téléverser le programme comme d’habitude. Ici, comme un mot de passe est obligatoire, une fenêtre de saisie apparaît dans l’IDE. Il n’est demandé qu’une seule fois.
On peut suivre le bon déroulement (ou l’échec) de la mise à jour à distance directement depuis l’IDE Arduino.
Il n’est pas possible d’ouvrir le moniteur série avec la mise à sans fil. Il faudra prévoir une petite interface Web. Lisez ce tutoriel pour comprendre comment ajouter un serveur Web et une interface HTML à une projet ESP8266. Pour allez plus loin, voici une série d’articles qui traite du sujet
Autres tutoriels ESP8266
Voici d’autres projets et tutoriels pour continuer sur le même sujet
ESP8266, Serveur Web (Interface)- Projet de station météo avec interface HTML sur ESP8266 (DHT22 + BMP180) 14 août 2020
- Projet station météo ESP8266 (Partie 3). Récupérer l’heure avec NTPClient et stockage SPIFFS 28 juin 2017
- ESP8266. Comment utiliser la librairie WiFiManager pour gérer les connexions WiFi 26 juin 2017
- Piloter le GPIO de l’ESP8266 (Serveur Web) depuis Jeedom en TCP/IP sans fil – Partie 2 14 avril 2017
- Piloter le GPIO de l’ESP8266 (2) depuis Domoticz en TCP/IP sans fil. Serveur Web et requête HTTP 31 mars 2017
- Projet station météo ESP8266 (Partie 5). Afficher des jauges et graphiques Google Charts 20 mars 2017
- ESP8266. Développer et tester l’interface HTML avec Node.js et Pug (ancien Jade) 15 mars 2017
- Projet station météo ESP8266 (Partie 4). ArduinoJson, charger, enregistrer des fichiers (SPIFFS) 13 mars 2017
- Projet station météo ESP8266 (Partie 2). Piloter le code Arduino depuis l’interface HTML 27 février 2017
- Projet station météo ESP8266 (Partie 1). Créer l’interface HTML, stockage SPIFFS 22 février 2017
- Interface HTML pour ESP8266. Changer de thème Bootstrap avec Bootswatch et bootstrapCDN 15 février 2017
- Interface HTML pour ESP8266. Améliorer le design avec Bootstrap 13 février 2017
- ESP8266. Comprendre le code Arduino d’un serveur web avec interface HTML 10 février 2017
Mises à jour
4/09/2017 Installation de Python 2.7 pour les utilisateurs Windows
- Stocker des données sur une carte micro SD. Code Arduino compatible ESP32, ESP8266
- Débuter Arduino. Recevoir des commandes depuis le port série (compatible ESP32 ESP8266)
- Fonctions C++ print•println•printf•sprintf pour Arduino ESP32 ESP8266. Combiner•formater → port série
- String C++. concat•c_srt•indexOf•replace•subString… pour Arduino ESP32 ESP8266
- ESP01. Débuter avec l’IDE Arduino ou PlatformIO. Quel module choisir ? Repérage des broches
- Comment attribuer une IP fixe à un projet ESP32 ESP8266 ou ESP01
Bonjour,
Super tuto, Merci beaucoup !
J’ai connecté l’ESP8266-07 via “iHaospace ESP8266 Burner Fixture Test Board Minimum System Development Board” et non via un arduino.
Quand j’essaye de passer par le port, j’ai les messages :
Authenticating…OK
13:15:24 [ERROR]: No response from device
Q : Est ce que l’OTA permet de permettre à jour un ESP8266-07 à distance sans utiliser les boutons de reset et prog habituels ?
Bonsoir Phil. Pour mettre à jour en OTA, il faut déjà pré-installé un programme qui supporte cette fonctionnalité et je ne sais pas ce qui est pré-chargé dans votre ESP8266. Il faut mettre l’ESP8266 en mode bootload en appuyant sur Reset et Boot à la mise sous tension, ensuite ça devrait fonctionner.
Merci PROJETSDIY pour le retour.
depuis le post effectué, j’ai beaucoup cherché sur le web et testé. Y a plein d’info.
Mais c’est pas bien bien documenté in fine.
Le programme d’exemple BasicOTA fonctionne
Mais plusieurs questions / remarques :
– on peut trouver une déclaration comme :
MDNSResponder mdns;
mais sans plus d’explication, utile ? absolument nécessaire ? ne sert à rien ?
ce type de déclaration .. sort toujours en erreur :
if (!mdns.begin(“”)) { // Start the mDNS responder for esp8266.local
Serial.println(“Error setting up MDNS responder!”);
}
Serial.println(“mDNS responder started”);
sous linux le programme à utiliser pour afficher les périphériques qui répondent au protocole “bonjour”
fedora : avahi-browse –all
ubuntu : avahi-discover
il semblerait que dans la partie “loop”, si le programme est trop long etc etc alors l’OTA n’est pas détecté et y a l’erreur bien connu sur le web : [ERROR]: No response from device.
void loop() {
ArduinoOTA.handle();
}
Avec plaisir Phil. Oui c’est toujours le même problème, les techniques évoluent et on doit s’y retrouver entre les vieux tutos, les tutos qui reprennent les exemples livrés avec les librairies 🤐, les mises à jours… j’essai de tenir à jour mes tutos
Si vous pouvez m’en dire un peu plus sur votre projet, je pourrais mieux cibler comment vous orienter.
Pour répondre à vos questions :
mdns permet de diffuser un nom de machine pour retrouver plus facilement l’ESP8266 sur le réseau local. Ce n’est pas obligatoire, on peut s’en sortir avec l’IP et même la fixer. J’ai échoué à l’utiliser également, je n’ai pas été plus loin, peut être que la librairie est obsolète.
Effectivement, plutot que de “pousser” la mise à jour depuis l’IDE Arduino ou un serveur, vous pourriez interroger au démarrage un serveur ou faire une page HTML pour le faire manuellement depuis l’ESP8266. Si ça vous intéresse je peux ajouter le sujet dans ma todo list.
Merci beaucoup pour ce tuto, sous ubuntu 20.04 la commande a utiliser dans un terminal est :
sudo apt install python2.
Après installation pour verifier la version python installée on peut taper dans le terminal:
python2 -V
Bonjour Francis et merci beaucoup pour l’info
Merci pour le tuto, très pratique.
J’avais une erreur car il faut que python 2.7 soit installé en ajoutant Add python.exe à l’installation comme préciser ici.
http://esp8266.github.io/Arduino/versions/2.0.0/doc/ota_updates/ota_updates.html
Merci beaucoup pour l’info Jeff. Je l’ajoute au tuto