Les Carnets de Byfeel domotique , Objets connectés , DIY , Programmation, Nouvelles Technologies ….

Activer OTA sur ESP8266 ( WEMOS ou autres )

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.

Selection des ports du réseau dans l’interface IDE Arduino

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.

Fichier source

Maintenant , on a toutes les bases , pour faire des projets interéssants.