Pour faire suite aux précédents articles :
Projet Wemos et Wifi et Wemos , voici comment activer l’OTA ( Over The Air ) , qui permet de faire les mises à jour par wifi , sans avoir besoin de brancher votre module par cable usb. Très pratique , pour les objets connectés ou autres modules , pas forcément proche d’un PC.
Si on reprend l’article précèdent , on s’est arrêté à la mise en place du WIFI et d’un serveur WEB. Nous allons ajouter les services OTA.
Pour cela, nous allons récupérer la bibliothèque , directement sur le Github ArduinoOTA.
Puis, il suffit de la copier dans le dossier bibliothèque.
Afin d’intégrer les services OTA , il suffit d’ajouter :
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
Puis dans la section Setup :
ArduinoOTA.setHostname(« EspTestOTA »); // si pas précisé , le nom par défaut sera constitué par esp8266-[ChipID]
ArduinoOTA.begin();
et enfin dans la boucle loop
ArduinoOTA.handle();
Si l’on ajoute ces lignes à l’article précèdent, on obtient le code source suivant :
include <ESP8266WiFi.h> #include <ESP8266WebServer.h> // WIFI Manager , afin de gérer la connexion au WIFI de façon plus intuitive #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager ///includes nécessaires au fonctionnement de l'OTA : #include <WiFiUdp.h> #include <ArduinoOTA.h> ESP8266WebServer server(80); // serveur WEB sur port 80 // définition du numero de LED interne int led = 2; // led built IN void setup() { Serial.begin(115200); // on démarre le moniteur serie //******** WiFiManager ************ //Local intialization. Once its business is done, there is no need to keep it around WiFiManager wifiManager; //Si besoin de fixer une adresse IP //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); //Forcer à effacer les données WIFI dans l'eprom , permet de changer d'AP à chaque démarrage ou effacer les infos d'une AP dans la mémoire ( à valider , lors du premier lancement) //wifiManager.resetSettings(); //Récupère les identifiants ssid et Mot de passe dans l'eprom et essaye de se connecter //Si pas de connexion possible , il démarre un nouveau point d'accés avec comme nom , celui définit dans la commande autoconnect ( ici : AutoconnectAP ) wifiManager.autoConnect("AutoConnectAP"); //Si rien indiqué le nom par défaut est ESP + ChipID //wifiManager.autoConnect(); // ****** Fin config WIFI Manager ************ //******* OTA *************** // Hostname defaults to esp8266-[ChipID] ArduinoOTA.setHostname("ESPTEST"); ArduinoOTA.begin(); //********* Fin OTA *************** Serial.println(""); // on attend d'être connecté au WiFi avant de continuer while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // on affiche l'adresse IP attribuée pour le serveur DSN Serial.println(""); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // on définit les points d'entrée (les URL à saisir dans le navigateur web) et on affiche un simple texte server.on("/", [](){ server.send(200, "text/plain", "Page d'accueil"); }); server.on("/led", []() { String Etat=server.arg("etat"); if (Etat == "on") digitalWrite(led, LOW); else if (Etat == "off") digitalWrite(led, HIGH); server.send(200, "text/plain", "la led est " + Etat); }); // on démarre le serveur web server.begin(); pinMode(led, OUTPUT); // Initialise la broche "led" comme une sortie digitalWrite(led, HIGH); } void loop() { // à chaque itération, la fonction handleClient traite les requêtes server.handleClient(); // Surveillance des demandes de mise à jour en OTA ArduinoOTA.handle(); }[adsense]
Il suffit maintenant de redémarrer l’interface IDE , et vous devriez voir apparaître dans la liste des ports disponibles votre module en OTA.
Si le port n’apparaît pas , fermer l’application IDE Arduino , éteindre le module ( débranché ). Puis, rebranché le module , attendre une dizaine de secondes et relancer l’application IDE arduino.
L’inconvénient en mode OTA , c’est que nous n’avons pas de remontée d’info , car le moniteur série n’est pas disponible.
Il y a la possibilité de passer par la bibliothèque remotedebug ( via telnet ) , mais je n’ai pas eu encore l’occasion de la tester . Vous pouvez avoir plus d’info sur cette bibliothèque en suivant ce lien. RemoteDebug
Dans l’exemple qui suit j’ai choisi de signaler le début et la fin de la mise à jour OTA par un changement d’état sur la led Interne.
Afin de pouvoir suivre l’avancement des mises à jour , il y a quatre fonctions implémentées .
OnStart , OnProgress , OnEnd et OnError .
ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) type = "sketch"; else // U_SPIFFS type = "filesystem"; digitalWrite(led, HIGH); // allume led au début du transfert // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() //Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { digitalWrite(led, LOW); // éteint à la fin de la mise à jour }); 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"); });
Dans cette exemple , j’ai choisi d’allumer la LED interne lors du début de la mise à jour , et de l’éteindre lors de la fin. J’utilise donc , les fonctions OnStart et OnEnd.
A ajouter dans le setup.
Maintenant , on a toutes les bases , pour faire des projets interéssants.
2 commentaires sur “Activer OTA sur ESP8266 ( WEMOS ou autres )”