ESP32. Comment utiliser la librairie WiFiManager pour gérer les connexions WiFi • Domotique et objets connectés à faire soi-même

La librairie WiFiManager permet de gérer très simplement la connexion Wi-Fi dans vos projets ESP32. La librairie WiFiManager pour ESP32 est en cours de développement. Elle démarre l’ESP32 en mode point d’accès (mode AP) sur lequel il suffit de se connecter pour configurer les paramètres du réseau WiFi sur lequel on souhaite se connecter.

Il est également possible de saisir d’autres paramètres (serveur MQTT, Token Blynk…) en même temps que les paramètres WiFi.

La librairie fonctionne également sur ESP8266

Installer la librairie WiFiManager sur l’IDE Arduino

La version ESP32 de librairie WiFiManager n’est pas encore disponible depuis le gestionnaire de bibliothèque de l’IDE Arduino.

La version ESP32 est encore en cours de développement. Il faut donc l’installer manuellement.

1 Pour cela, il faut se rendre directement sur la page GitHub du projet et choisir la version Development.

2 Télécharger le code source du projet sans décompresser l’archive ZIP.

3 Ouvrez le gestionnaire de librairie de l’IDE Arduino : Croquis -> Inclure une librairie -> Ajouter la bibliothèque .ZIP…

C’est prêt.

Ajouter la WiFiManager development à un projet PlatformIO

Pour ceux qui utilisent PlatformIO pour leurs projets, c’est encore plus facile pour installer la librairie, il suffit d’ajouter cette ligne aux dépendances

lib_deps =
    https://github.com/tzapu/WiFiManager.git#development

La librairie sera automatiquement téléchargée au prochain build (compilation du code source).

Comment fonctionne la librairie WiFiManager

Il peut aussi être très intéressant de ne pas embarquer d’identifiant et de mot de passe du réseau Wi-Fi dans le code Arduino.

Par exemple, l’objet devra se connecter sur un réseau dont vous ne connaissez pas les identifiants au moment du développement. Les identifiants peuvent changer. Par exemple, dans un établissement scolaire ou une entreprise, les identifiants et mot de passe sont changés régulièrement par sécurité. Le point d’accès a été remplacé et le nouveau mot de passe est différent.

Bref, vous l’avez compris, en évitant de coder “en dur”, vous n’aurez pas besoin de repasser par l’IDE Arduino à chaque changement de mot de passe ou de matériel.

Voici comment fonctionne le mode AutoConnect() par défaut

1 Lorsque l’ESP démarre, il le met en mode Station et tente de se connecter à un point d’accès (au réseau WiFi local) précédemment enregistré
2 Si l’ESP32 n’arrive pas à se connecter ou si aucun réseau n’a été enregistré précédemment, il place l’ESP32 en mode Point d’Accès (Mode AP). Un serveur Web accessible à l’adresse IP 192.168.4.1 est démarré sur l’ESP32
3 Utiliser n’importe quel appareil disposant d’une connexion WiFi avec un navigateur (ordinateur, smartphone, tablette) pour vous connecter sur la page de configuration

4 Si l’interface de configuration est protégée par un mot de passe, vous devez commencer par saisir ce dernier

5 Une fenêtre intitulé “Rejoindre le réseau….” apparaît

6 Cliquer sur Configure WiFi. Si le réseau WiFi sur lequel vous désirez connecter l’ESP32 n’est pas affiché, cliquer Refresh et attendez quelques secondes pour que la liste s’actualise.


7 Sélectionner le réseau WiFi et saisir le mot de passe. Cliquer sur Save pour enregistrer.

8 L’ESP32 redémarre et se connecte au réseau WiFi configuré. Si tout s’est bien passé, l’adresse IP attribuée est affichée dans le journal d’execution

Le fonctionnement de la méthode autoConnect() est bloquant, c’est à dire que jusqu’à ce que les paramètres de connexion soient enregistrés, tous les autres traitements sont en attente.

Il existe plusieurs solutions pour éviter ce comportement, par exemple

  • AutoConnectWithFSParameters pré-configurer les paramètres de connexion dans un fichier
  • OnDemandConfigPortal Convoquer le panneau de configuration uniquement lorsqu’on appuie sur un bouton ou une touche tactile
  • AutoConnectWithTimeout on spécifie un temps au delà duquel on continue l’exécution du programme (timeout). En testant l’état de la connexion, on pourra mettre l’ESP32 en veille si le réseau WiFi n’est pas accessible plutôt que de drainer la batterie

Les différents modes de connexion proposés par la librairie

Plusieurs méthodes

  • AutoConnect On laisse la librairie tenter de se connecter au réseau WiFi. C’est la méthode la plus simple. Deux possibilités
    • AutoConnect() le nom du point d’accès est attribué automatiquement par la librairie et prend la forme ESP_IDENTIFIANTCHIP
    • AutoConnect(“nom_point_acces”,”mot_de_passe”) Il est possible de personnaliser le nom du point d’accès et éventuellement protéger l’accès par un mot de passe.
  • startConfigPortal convoque la fenêtre de connexion à l’aide d’une condition (bouton, touche tactile…).

Exemples installés avec la librairie

Plusieurs exemples de connexion sont disponibles

Téléverser le projet WiFiManager pour ESP32

Voici un exemple pour tester la librairie Créer un nouveau croquis sur l’IDE Arduino ou un nouveau projet PlatformIO et coller le code suivant. Le programme appel la méthode autoConnect() par défaut pour permettre à l’utilisateur de choisir le réseau WiFi sur lequel il souhaite se connecter. Un bouton connecté sur le GPIO de l’ESP32 permet de réinitialiser les paramètres WiFi.

#include 
#include 
#include          

WebServer server(80);
WiFiManager wm;

#define PIN_RESET_BUTTON 4        
int RESET = 0; 

void handle_root();

void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);

    pinMode(PIN_RESET_BUTTON, INPUT);
    //WiFiManager
    //Local intialization. Once its business is done, there is no need to keep it around
    
    //reset saved settings
    //wm.resetSettings();
    
    //Permet d attribuer une IP fixe a l ESP32
    //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

    //Tente de se connecter sinon passe en mode AP.
    wm.autoConnect("ESP32_AP", "esp32_pwd");
    //Idem avec nom automatique de la forme ESP + ChipID et sans mot de passe
    //wifiManager.autoConnect();

    //La librairie est bloquante. Une fois connecte, le programme continue
    Serial.println("ESP32 is connected to Wi-Fi network");
    
    // Affiche une interface HTML au projet depuis un navigateur sur adresse_ip_esp32/
    server.on("/", handle_root);

    server.begin();
    Serial.println("HTTP server started");
    delay(100); 
}


void loop() {
    server.handleClient();
    
    RESET = digitalRead(PIN_RESET_BUTTON);
    if( RESET == HIGH) {                                 
      Serial.println("Erase settings and restart ...");
      delay(1000);
      wm.resetSettings();  
      ESP.restart();  
    }
}

// HTML & CSS contents which display on web server
String HTML = "\
\
  \
    

Welcome

\
    
Your first Iot Project made with ESP32\
😊\ \ "; // Handle root url (/) void handle_root() { server.send(200, "text/html", HTML); }

Comment fonctionne le code

Afin de pouvoir piloter la librairie WiFiManager à n’importe moment, on initialise un objet nommé vm a début du code

WiFiManager wm;

On créé également un serveur HTTP qui servira à afficher une page de paramètres ou toute autre information. Ce n’est pas nécessaire dans la plupart des projets

WebServer server(80);

On va ajouter un bouton sur la broche 4 (sur une carte ESP32 DevKitC v4) qui va permettre de réinitialiser les paramètres de connexion

#define PIN_RESET_BUTTON 4        
int RESET = 0; 

On lance la connexion au réseau WiFi dans le setup(). Si le réseau WiFi est disponible et que les paramètres sont connus, la connexion est directement établie, sinon l’ESP32 passe en mode AP et attend que l’utilisateur se connecte et renseigne les paramètres. Ici, l’accès à la page de configuration est protégée par un mot de passe

wm.autoConnect("ESP32_AP", "esp32_pwd");

Dès que l’ESP32 est connecté au réseau WiFi, on démarre le serveur HTPP et on attend les clients sur la page /

server.on("/", handle_root);
server.begin();
Serial.println("HTTP server started");

Dès qu’un utilisateur arrive sur la page, la méthode handleroot() lui renvoi la page de l’interface

void handle_root() {
  server.send(200, "text/html", HTML);
}

La page est pré-construite dans la variable HTML

String HTML = "\
\
  \
    

Welcome

\
    
Your first Iot Project made with ESP32\
😊\ \ ";

Pour que le serveur fonctionne, il faut l’appeler régulièrement dans la loop() principale. Attention à ne pas mettre de delay !

server.handleClient();

Ouvrez n’importe quel navigateur internet pour accéder à l’interface HTML de votre objet connecté. Pour cela, il suffit de saisir l’adresse IP de l’ESP32 dans la barre d’adresse (URL)

Enfin dès qu’on appuie sur le bouton connecté sur la broche 4, on ré-initialise les paramètres de connexion et on redémarre l’ESP32.

RESET = digitalRead(PIN_RESET_BUTTON);
if( RESET == HIGH) {                                 
      Serial.println("Erase settings and restart ...");
      delay(1000);
      wm.resetSettings();  
      ESP.restart();  
}

Peut-on combiner avec d’autres librairies : pubsubclient, ArduinoOTA… ?

Oui, la librairie WiFiManager est conçu pour être compatible avec les autres librairies. En effet, c’est une couche d’abstraction à la librairie WiFi. Elle n’intervient qu’au démarrage de l’ESP32.

Pour gérer la connexion à un serveur (broker) MQTT vous pouvez vous inspirer de cet exemple disponible sur GitHub. WiFiManager est capable d’intégrer la saisie de paramètres de connexion supplémentaires. Par contre, il faut gérer soit même l’enregistrement et la chargement des paramètres au lancement de l’ESP32 à l’aide de la méthode setSaveConfigCallback.

Concernant la mise à jour sans fil en Wi-Fi à l’aide de la librairie ArduinoOTA, c’est également possible. Par contre il faut sauvegarder et recharger les paramètres de connexion.

Mises à jour

24/09/2020 Publication de l’article

Avez-vous aimé cet article ?

[Total: 2 Moyenne: 5]