ESP8266 + ArduinoOTA: Uploadez vos programmes par WiFI

Présentation

Dans l'article Programmer l'ESP8266 avec l'IDE Arduino, nous avons vu comment utiliser l'ESP8266 de manière autonome. Pour téléverser nos programmes sur le module, nous le connections à l'ordinateur par une liaison série. Dans cet article nous allons voir une façon beaucoup plus pratique, rapide, et fiable de téléverser nos programmes sur l'ESP8266 : la mise à jour OTA ("Other The Air"), autrement dit la mise à jour par WiFI.

Il suffira que vote module soit connecté au même réseau WiFi que votre ordinateur pour que vous puissiez y uploader vos nouveaux programmes.

Circuit

Nous allons utiliser le montage décrit dans l'article Programmer l'ESP8266 avec l'IDE Arduino, à savoir un ESP8266 ESP-12, connecté à une interface série FT232RL (consultez l'article pour les détails). Bien que l'objectif soit de se passer de cette liaison série, nous en aurons quand même besoin pour téléverser notre premier programme.

Désignation Prix unitaire Quantité Prix

ESP8266 ESP-12

Le module WIFI ESP8266-12

2.93 €

sur Banggood

1 2.93 €

FTDI FT232RL

FTDI FT232RL USB to TTL Serial Converter Adapter Module 5V&3.3V For Arduino GU

3.7 €

sur Banggood

1 3.7 €

Platine d'essais

Platine de prototypage, ou breadboard

1.3 €

sur Banggood

1 1.3 €

LM3940IT-3.3

Régulateur 5v -> 3.3v

0.48 €

sur Ebay

1 0.48 €

L7805CV

Régulateur 5v

0.1 €

sur Banggood

1 0.1 €
total 8.51 €

Le code

Nous partons d'un programme très simple qui ne fait qu'une chose: se connecter au réseau WiFi :

#include <ESP8266WiFi.h>

const char* ssid = "Livebox-xxx"; // le SSID de votre WiFi
const char* password = "...."; // le mode de passe de votre WiFi

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(3000);
    ESP.restart();
  }
}

void loop() {
}

Pour activer les téléversements OTA sur l'ESP8266, nous n'avons que trois instructions à ajouter :

#include <ESP8266WiFi.h>
// includes necessaires au fonctionnement de l'OTA :
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "Livebox-xxx"; // le SSID de votre WiFi
const char* password = "...."; // le mode de passe de votre WiFi

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(3000);
    ESP.restart();
  }  
  
  ArduinoOTA.setHostname("monEsp"); // on donne une petit nom a notre module
  ArduinoOTA.begin(); // initialisation de l'OTA
}

void loop() {
  // a chaque iteration, on verifie si une mise a jour nous est envoyee
  // si tel est cas, la lib ArduinoOTA se charge de gerer la suite :)
  ArduinoOTA.handle(); 
}

Avant de téléverser ce programme via la liaison série, vérifier dans le menu "Outils" que la "Flash size" sélectionné correspond bien à votre module ESP8266. Logiquement pour un ESP8266 ESP-12, il s'agit de 4M (1M SPIFFS). Vous pouvez maintenant téléverser le programme.

Redémarrez ensuite l'IDE Arduino, et dans "Outils > Port" vous devriez voir une nouvelle option :

<bound method PublicationPicture.alt of <PublicationPicture: Arduino IDE OTA port ESP8266>>

Sélectionnez "monEsp at...". Vous pouvez débrancher votre liaison série et tenter à nouveau de téléverser votre programme, et ça devrait fonctionner :).

Intégrer l'OTA à un programme existant

Pour pouvoir faire des mises à jour du code de vos programme déjà existant par WiFi, vous n'avez que les modifications suivantes à effectuer :

  • ajouter #include <WiFiUdp.h> et <ArduinoOTA.h> aux includes
  • ajouter ArduinoOTA.setHostname("..."); et ArduinoOTA.begin(); à la fin de la fonction setup()
  • ajouter ArduinoOTA.handle(); dans la fonction loop()

Attention: Si vous supprimez par inadvertance ArduinoOTA.begin() ou ArduinoOTA.handle(), vous serez obligé de reconnecter votre ESP8266 à l'ordinateur via la connexion série pour y envoyer un nouveau programme.

Un peu plus de sécurité...

En l'état, une personne mal intentionnée connectée à votre réseau WiFi pourrait aisément modifier le code exécuté sur votre ESP8266. Si vous souhaitez ajouter un peu de sécurité à tout ça, vous pouvez exiger qu'un mot de passe soit demandé lors des mises à jour. Pour se faire, ajoutez simplement l'instruction ArduinoOTA.setPassword("my_password"). Ainsi, l'IDE Arduino nous demandera de saisir le mot de passe (ici "my_password") à chaque fois que vous téléverserez un programme.

Debug

Se passer de liaison série est appréciable, mais on y perd quand même une fonctionnalité bien utile: la possibilité d'envoyer des messages de debug par le biais de la commande Serial.print().

Pour pallier ce problème, il existe une librairie fort pratique qui va nous permettre de nous connecter en telnet à notre ESP8266, et de lui recépetionner les messages qu'il nous envoie. Cette librairie s'appelle RemoteDebug, elle est disponible ici : https://github.com/JoaoLopesF/RemoteDebug. Téléchargez l'archive ZIP de la librairie et ajoutez là à vos librairies Arduino ("Croquis" > "Include une librairie" > "Ajouter la bibliothèque .ZIP").

Voici un petit exemple d'utilisation de la librairie. Il s'agit d'un simple serveur répondant "ok" lorsqu'on appelle l'url "/". A chaque fois que cette url sera appelée, un message de debug sera envoyé.

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>
#include <RemoteDebug.h>

const char* ssid = "Livebox-xxx"; // votre SSID
const char* password = "..."; // votre mot de passe

RemoteDebug Debug;
ESP8266WebServer server(80);

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(3000);
    ESP.restart();
  }  

  // initialisation de la librairie de debug
  Debug.begin("monEsp");  
  
  // initialisation de l'OTA
  ArduinoOTA.setHostname("monEsp"); 
  ArduinoOTA.begin(); 

  // initialisation du serveur
  server.on("/", [](){
 // a chaque requete recue, on envoie un message de debug
    Debug.println("request received");
    server.send(200, "text/plain", "ok :)");
  });
  server.begin();
}

void loop() {
  ArduinoOTA.handle();   
  Debug.handle();
  server.handleClient();
}

Téléversez ce programme sur votre ESP8266, ouvrez un terminal et saisissez telnet IP_DE_VOTRE_ESP8266 (remplacez IP_DE_VOTRE_ESP8266 par l'ip :) ). Vous devriez voir apparaître quelque chose ressemblant à ça :

$ telnet 192.168.1.29

Trying 192.168.1.29...
Connected to esp0abe36.home.
Escape character is '^]'.
*** Remote debug - over telnet - for ESP8266 (NodeMCU)
* Host name: monEsp (192.168.1.29)
* Free Heap RAM: 40696
******************************************************
* Commands:
    ? or help -> display these help of commands
    q -> quit (close this connection)
    m -> display memory available
    v -> set debug level to verbose
    d -> set debug level to debug
    i -> set debug level to info
    w -> set debug level to warning
    e -> set debug level to errors
    l -> show debug level
    t -> show time (millis)
    p -> profiler - show time between actual and last message (in millis)

* Please type the command and press enter to execute.(? or h for this help)
***

Maintenant, saisissez l'ip de votre ESP8266 dans votre navitageur internet. Vous devriez voir votre message de debug apparaître dans le terminal :

(d) request received

Discussion