Programmer l’ESP8266 avec l’IDE Arduino : librairies, GPIO, Web Serveur, Client Web

Les modules WiFi ESP8266 peuvent remplacer dans beaucoup d’applications l’Arduino en ajoutant à moindre coût la connectivité Wi-Fi. Au lancement des modules ESP8266 (en 2014), la langage de programmation de prédilection était de Lua (on peut d’ailleurs toujours programmer dans ce langage !). Rapidement, la grande majorité des librairies Arduino ont été adaptées pour fonctionner sur l’ESP8266. Aujourd’hui il est aussi simple de programmer un module ESP8266 qu’un Arduino en C++. Nous allons découvrir dans ce tutoriel comment installer les librairies nécessaires sur l’IDE Arduino, et découvrir au travers d’exemples simples les bases de la programmations de l’ESP8266.

Installer les cartes et les librairies pour les modules ESP8266 sur l’IDE Arduino

Lancez l’IDE Arduino et ouvrez les préférences depuis le menu Fichier. Sur macOS, allez dans le menu Arduino puis Préférences… Cliquez sur l’icône indiquée par la flèche rouge sur la photo ci-dessous.

ide arduino esp8266 preference

Dans le champ de saisie, collez l’adresse internet suivante puis validez

ide arduino libraire url esp8266

Cela permet d’indiquer à l’IDE Arduino qu’il doit aller sur le site arduino.esp8266.com afin d’aller y récupérer d’autres cartes compatibles. Maintenant, allez dans le menu Outils puis Type de Cartes et enfin Gestionnaire de carte

 ide arduino gestionnaire carte

Dans le champ de recherche, saisissez esp8266 pour trouver les nouvelles cartes à installer. Si les cartes n’apparaissent pas, vérifiez dans les préférences que l’URL est correcte. vérifiez également la connexion Internet. Cliquer sur Installer.

ide arduino install esp8266 board

L’installation ne dure que quelques minutes. L’installation terminée, fermez le gestionnaire de carte et ouvrez de nouveau le menu Outils. Dans le sous-menu Type de Carte, vous avez maintenant une nouvelle section appelée ESP8266 Modules.

ide arduino esp8266 board list

Les principaux fabricants qui contribuent le plus à la communauté (Adafruit, ESPresso, Olimex, Sparkfun, WeMos…) se trouvent dans le menu. Pour les autres modules, choisissez simplement Generic ESP8266 Module.

Pour afficher le exemples installés avec les cartes ESP826, if suffit de choisir dans la liste puis d’aller dans le Fichier -> Exemples.

Avant d’aller plus loin, remarque sur l’ESP-01

esp8266 esp-01 module WifiL’ESP-01 est une version plus limitée de l’ESP8266. Il ne dispose que de 2 GPIO. Le module dispose d’une mémoire flash plus petite (de 512Ko à 1MB). La programmation est identique mais “plus pénible” car il faut mettre le module dans un mode particulier avant de pouvoir téléverser le programme (Bootload mode). Ce n’est pas un module adapté pour l’apprentissage et débuter avec l’ESP8266. Si toutefois vous avez besoin d’infos, vous trouverez plusieurs tutoriels sur le blog en faisant une recherche avec le mot clé ESP-01 dans le champ de recherche situé dans le coin supérieur droit de la page.

Différences entre Arduino et ESP8266, repérage des broches

L’ESP8266 dispose de 9 E/S numériques au lieu de 14 pour l’Arduino Uno. Alors que sur l’Arduino Uno il n’y a que 6 sorties qui supportent le mode PWM (3, 5, 6, 9, 10 et 11), toutes les sorties de l’ESP8266 peuvent générer un signal PWM.

En résumé

Arduino / Genuino 101 ESP8266 (ESP-12x)
Micro-contrôleur Arduio Uno et la plupart des cartes compatibles : ATmel ATmega328p

Le nouveau Genuino 101 : Intel Curie

Tensilica Xtensa LX106
WiFi
Bluetooth LE
Adressage 8…32bits 32bits
Fréquence d’horloge 16 MHz 80 MHz
Mémoire flash 32ko 512…4Mo (1)
Nombre d’E/S x14 x11 (D0…D8 + RX/TX)
Nombre de sorties PWM Arduino Uno et clones : x6 (3, 5, 6, 9, 10, 11)

Arduino 101 : x4

Toutes les sorties sont PWM
Nombre d’entrées analogiques x6 (A0..A5), 10bits, 5V max. x1 (A0), 10 bits, 1V max. (2) 
UART (port série) x1 x1 (3)
I2C x1 x1
SPI x1 x1
Documentation technique Arduino Uno R3

Genuino 101

version 5.4

Le repérage des broches est légèrement différent sur l’ESP8266. Chaque sortie est précédée d’un D (pour Digital probablement). Dans un programme Arduino, on peut directement utiliser le repère indiqué sur la carte D1 ou l’équivalent Arduino 5.

(1) Mémoire externe. Aujourd’hui, presque tous les modèles disposent de 4Mo de mémoire flash. La totalité n’est pas exploitable toutefois. Une partie est réservée au stockage de données (stockage de données utilisateur, interface HTML et code javascript de l’interface…). C’est la zone SPIFFS présentée dans cet article.

(2) L’ESP8266 accepte 1V maximum sur la broche analogique. Certains modules de intègrent un pont diviseur de tension qui permet de monter la tension. Par exemple la Wemos d1 mini accepte 3,3V max. 

(3) Un seul port série utilisable. L’autre broche TX est utilisée durant l’écriture de la mémoire flash

Attention. Chaque fabricant est libre d’attribuer les broches. C’est notamment le cas des broches des bus I2C et SPI. Il faudra vérifier la documentation technique de la carte. Vous pouvez également consulter cet article qui récapitule les broches des principales cartes en vente

Broches ESP8266 Remarque Equivalent Arduino / Genuino 101 Autre utilisation
TX 1 CS1, TXD0
RX 3 RXD0
D0 PWM (1) 16 WAKE
D1 PWM 5
D2 PWM 4
D3 PWM 0 CS2
D4 PWM 2 TXD1
D5 PWM 14 CLK
D6 PWM 12 MISO
D7 PWM 13 MOSI, RXD2, CTS0
D8 PWM 15 CS, TXD2, RTS0
RST RST
A0 3.3V max. A0
3V3 3V
5V 800 mA maxi.
G GND (x3)

(1) Relié à la broche GND à la mise sous tension pour mettre l’ESP en bootload mode. Ce mode permet de ré-installer le firmware d’origine ou charger un programme Arduino. Sur certaines cartes, WeMos d1 mini par exemple, cette opération est prise en charge par le gestionnaire de carte. Cette opération est donc inutile, le téléversement est transparent.

Généralement, les fabricants publient un schéma des broches (pinout) qui indique la broche équivalente sur un Arduino Uno. Ici, par exemple, les broches d’une WeMos d1 mini. Ce schéma de branchement est valable pour toutes les cartes à base de module ESP-12x.

Correspondance Pins GPIO WeMos D1 mini

Si vous voulez vous lancer dans la programmation en Lua, le numéro de broche à utiliser dans le code est également indiqué.

Attention au GPIO qui fonctionne à une tension de 3.3V

Particularité de l’ESP8266 par rapport à l’Arduino Uno (ce n’est plus le cas pour le Genuino 101 et les nouvelles cartes à base d’Intel Curie), le GPIO fonctionne sous une tension de 3,3V. Il faudra donc dans certain cas adapter vos montages. Pour cela, il existe des diviseurs de tension (5V vers 3.3V) ou l’inverse (3.3V vers 5V).

Comment programmer l’ESP8266 avec l’IDE Arduino ?

Matériel et circuit de test

Voici un petit montage à réaliser avec un ESP8266 (ici une WeMos d1 mini) et une Led qui vous permettra de tester les différents codes proposés dans ce tutoriel.

Pour mémoire, voici un tableau récapitulatif de la tension d’alimentation typique en fonction de la couleur et du diamètre de la Led.

Couleur Longueur d’onde (nm) Tension (V) pour diamètre  3mm Tension(V) pour diamètre  5mm
Rouge 625-630  1,9-2,1 2,1-2,2
Bleu 460-470 3,0-3,2 3,2-3,4
Vert 520-525 2,0-2,2 2,0-2,2
Jaune 585-595 2,0-2,2 3,0-3,2
Blanc  460-470 3,0-3,2 1,9-2,1

La programmation classique

La première chose à savoir lorsqu’on débute avec un module ESP8266, c’est qu’on peut le programmer exactement comme un Arduino. Contrairement aux micro-contrôleurs ATTiny, moins puissants, le SoC de l’ESP8266 est capable d’exécuter toutes les commandes C++ du code Arduino. La seule condition à respecter est d’utiliser la librairie adaptée pour ce dernier dès qu’on veut utiliser le WiFi (paragraphe suivant).

Ouvrez l’IDE Arduino et collez ce code dans un nouveau projet avant de le téléverser.

Que fait ce programme ?

  • Une variable de type entier (int) permet d’indiquer sur quelle sortie la Led est branchée
  • Dans la boucle setup(), on indique que la broche (ici 16) est une sortie (OUTPUT)
  • La boucle loop() s’execute à l’infini. A chaque passage
    • On met la sortie (16) au niveau bas (LOW), c’est à dire que la tension de sortie est nulle (pas de courant)
    • On attend 1 seconde. Le délais (Delay) est indiqué en millisecondes (1000ms = 1s)
    • On met la sortie (16) au niveau haut (HIGH), c’est à dire que la tension de sortie est de 5V (le courant passe)
    • On attend 2 secondes
    • Et ainsi de suite

Maintenant, remplacez dans la sortie 16 par le repérage équivalent de l’ESP8266, à savoir D0, ce qui donne  int led = D0;

Comme vous pouvez le constater, le programme fonctionne à l’identique.

Remarque. Même si la variable est de type int (integer), on écrit une chaine de caractère dans le code. C’est normal. Au moment de la compilation, la référence à la broche sera remplacée dans le code par la librairie ESP8266.

Programmation Web Serveur : connecter l’ESP8266 au réseau WiFi

La programmation Web Serveur permet d’ajouter une interface Web (écrite dans le langage HTML et javascript) à un projet ESP8266. C’est également possible avec un Arduino mais cela prend tout son sens avec un ESP8266 qui nativement dispose d’une connexion WiFi.

Reprenons le code précédent et ajoutons les deux librairies nécessaires

On va créer deux variables pour définir le SSID (identifiant du réseau WiFi) et le mot de passe avant de créer un objet qui va contenir le serveur Web (objet C++)

Le code de la fonction setup fait les opérations suivantes

  • Serial.begin(115200)  on ouvre le port série à 115200 bauds
  • WiFi.begin(ssid, password)  l’ESP8266 se connecte au réseau WiFi
  • La boucle while écrit un point sur le port série toute les 500ms jusqu’à ce que l’ESP8266 soit connecté au WiFi WiFi.status() != WL_CONNECTED (très mauvaise idée lorsqu’on fonctionne sur batterie d’ailleurs, mais c’est juste pour comprendre le fonctionnement)
  • Serial.println(WiFi.localIP()) écrit sur le port série l’adresse IP attribuée par la box internet ou le routeur à l’ESP8266

  • On ajoute un point d’entrée, c’est à dire une adresse internet (URL) sur laquelle on affichera pour le moment un simple texte

  • Une seconde page qui pourrait être une page de paramètres
  • server.begin() enfin, on démarre le serveur web

Il ne reste plus qu’à demander à l’ESP8266 d’écouter les demandes et d’afficher les pages correspondantes. Pour cela on ajoute la commande  server.handleClient() dans la fonction loop().

Collez le code complet dans un nouveau projet et téléversez le sur la WeMos.

Ouvrez le moniteur série pour récupérer l’adresse IP de l’ESP8266 sur le réseau local.

Ouvrez maintenant un navigateur internet er saisissez l’adresse IP ou IP_ESP8266/parametres.

Et voilà, en quelques lignes de code, vous venez de connecter l’ESP8266 au réseau local (et internet par la même occasion). Vous pouvez accéder à une interface WEB depuis n’importe quel ordinateur ou smartphone. En faisant une redirection de port sur votre box internet ou routeur, vous pouvez même accéder à l’interface hors de chez vous avec une connexion 3G/4G.

Attention. La connexion n’est pas chiffrée. Elle n’est pas protégée. Tout le monde peut avoir accès aux commandes de votre interface. Il faudra ajouter des protections (mot de passe…)

Programmation Web Serveur : piloter le GPIO depuis internet !

Nous allons maintenant voir comment ajouter des commandes pour piloter le GPIO depuis une interface. Il existe plusieurs méthodes pour générer le code HTML de l’interface qui sera envoyée au navigateur internet. Ici, on va simplement créer une chaine (String) qui va contenir le code HTML. Tout est expliqué en détail dans ce tutoriel. Chaque ligne est expliquée dans le code. Ce qu’il faut retenir :

  • Le code HTML est construit en assemblant des chaines de caractères
  • Il est possible d’intégrer le contenu de variable. Ici l’état de la sortie D0contenu dans la chaine etatD0.
  • Chaque changement d’état est envoyé au serveur web qui tourne sur l’ESP8266 à l’aide d’un formulaire sous la forme d’une requête HTTP de type POST.
  • Ici, l’actualisation est déclenchée manuellement en appuyant sur un bouton (submit)

Maintenant, on modifie dans le setup le point d’entrée vers la page d’accueil. On branche le point d’entrée “/” vers la fonction handleRoot.

Lorsqu’on affiche la page principale (“/”) ou que le serveur web reçoit une requête POST (actualisation du GPIO), la fonction handleRoot est appelée. La fonction server.hasArg permet brancher des actions. Ici, si la requête contient l’argument (hasArg), alors c’est qu’on doit changer l’état du GPIO. On exécute la fonction handleSubmit, sinon on actualise la page.

La fonction handleSubmit récupère la valeur de l’argument “D0” avec la fonction server.arg puis il suffit de tester la valeur de celle-ci pour réaliser le bon traitement. Attention, c’est une chaine de caractère. Il faut donc tester comme ceci == “1” et non pas == 1. On en profite pour stocker l’état de la sortie dans la variable etatD0.

Collez le code complet suivant en modifiant identifiant et mot de passe WiFi.

Voici l’interface obtenue

Maintenant que c’est plus clair, vous pouvez aller encore un peu plus loin dans les détails de la programmation Web Serveur de l’ESP8266 en lisant cet article. Vous pourrez réaliser ce type d’interface en suivant ce projet de station météo en 5 étapes.

esp8266 web server spiffs bootstrap dht22 bmp180 google charts

Tous les tutoriels sur la programmation Web Server des ESP8266

Serveur Web (Interface)

Programmation Client Web :

La programmation Client Web permet de faire communiquer un module ESP8266 avec un autre serveur, un autre ESP8266, une application mobile… Voici quelques exemples d’application :

  • Transmettre des mesures (température, humidité, taux de particules, pression atmosphérique, luminosité, bruit…)
  • Transmettre des états (détecteur d’ouverture de porte ou fenêtre, contacteur…)

Voici plusieurs articles sur le sujet avec des exemples d’application pour faire communiquer l’ESP8266 avec Jeedom ou Domoticz (affichage déporté)

Client Web (communication)

Questions courantes (FAQ)

Sur quelles plateformes l’IDE Arduino est-il disponible ?

L’IDE Arduino est disponible sur tous les systèmes d’exploitation (Windows, macOS, Linux, Linux ARM). Quelque soit votre environnement, vous pouvez donc développer vos projets ESP8266 avec l’IDE Arduino. Allez sur le site de la fonction Arduino pour récupérer l’installeur qui convient à votre ordinateur ou mini-PC.

Peut-on programmer un ESP8266 sur un Mac ?

Oui, l’IDE Arduino est disponible sur macOS également. Le kit de développement (SDK) d’Espressif étant écrit en python, il est possible de programmer les modules ESP8266 comme sur un PC Windows.

Peut-on programmer l’ESP8266 depuis Linux ARM ?

Oui, si vous possédez un Raspberry Pi ou un mini-PC équivalent fonctionnant sous Linux ARM (un Orange Pi par exemple), il est tout à fait possible d’utiliser l’IDE Arduino.

Comment développer sans programmation avec le Firmware ESP Easy

Si vous débutez avec les micro-contrôleurs et que tout ce que vous avez lu précédemment vous a un peu effrayé, pas de problème. Le projet ESP Easy est fait pour vous ! ESP Easy est une interface qui permet de développer des sondes ou des actionneurs par simple configuration. L’interface est en anglais mais tout est expliqué dans ces tutoriels en français.

Quel modèle d’ESP8266 choisir  pour débuter ?

Les cartes de développement à base d’ESP-12x (WeMos d1 Mini, Geekcreit…) sont les mieux pour débuter. Le téléversement est géré de façon totalement transparente par le SDK ESP8266 depuis l’IDE Arduino. Vous pouvez utiliser le comparateur de prix pour trouver la meilleure offre sur Internet.

Peut-on utiliser des cartes NodeMCU ou micropython ?

Oui absolument. Ce sont d’autres firmwares. NodeMCU permet d’exécuter du code Lua. Dès le premier téléversement, le firmware sera remplacé par le code Arduino. Vous pourrez ré-installer le firmware NodeMCU (suivez ce tutoriel pour cela) ou micropython ultérieurement.

C’est quoi le modèle ESP-WROOM-32 ?

LoLin32 Lite de Wemos.cc

Le module ESP-WROOM-32 est le nom de code du successeur de l’ESP8266, l’ESP32. Il est plus puissant, moins gourmand, plus sécurisé, plus pro (bus CAN), il apporte également le support du Bluetooth en plus du WiFi. Le prix des cartes de développement ESP32 à fortement chuté ces derniers mois. Elles sont maintenant quasiment au même prix. Pour en savoir plus, rendez-vous sur la catégorie ESP32 de Projets DIY. Ici, la Lolin32 Lite de Wemos.cc

Quelques livres pour débuter en C/C++

La programmation Arduino fait appel à des notions de programmation objet du C/C++. Il existe de très bons livres d’initiation ainsi que des tutoriels sur le Web pour aller plus loin que les notions abordées ici

Programmez avec le langage C++

32,00
Buy This Item
amazon.fr

Apprenez à programmer en C - 2e édition, Mathieu Nebra

26,00
Buy This Item
amazon.fr

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous désinscrire à tout moment.

  • Migui Pda

    Lorsque vous écrivez :

    “La boucle while écrit un point sur le port série toute les 500ms jusqu’à ce que l’ESP8266 soit connecté au WiFi WiFi.status() != WL_CONNECTED (très mauvaise idée lorsqu’on fonctionne sur batterie d’ailleurs, mais c’est juste pour comprendre le fonctionnement)”
    Quelle est alors la meilleure solution/recommendation q dans le cas d’une connexion batterie ?
    Merci.

    • Bonjour Migui. Merci beaucoup ! Pour éviter de drainer la batterie, le mieux est de mettre un compteur en place. Au bout de n tentatives deux solutions :
      – On attend un long moment mais ce n’est pas ce qu’il y a de plus économe en énergie
      – On met le module en sommeil (deep sleep) avec la commande ESP.deepSleep(durée). La durée doit être indiquée en ms. Pour que ça fonctionne, il faut relier la broche D0 à la broche RST. Par contre, Il faudra débrancher avant de téléverser, cette broche est aussi utilisée pour passer le module en “flash mode”.
      D’ailleurs, rien n’interdit de mettre le module en deep sleep dans la bouche loop() après les traitements. Par contre dans ce mode, impossible de joindre le module pour lui demander de faire quelque chose (niveau de batterie, actionner un relais…). Voilà. Bonne journée

      • Migui Pda

        Merci de ta réponse.
        J’avais en effet repéré à droite ou gauche des sujets traitant dudit “deep sleep”. Ce qui me faisait forcément envie en envisageant d’utiliser un (ou des) Wemos D1 Mini connecté à une batterie de recharge solaire.
        Ceci étant la solution la plus simple à mettre en oeuvre puisque ladite batterie solaire s’achète pour une quinzaine d’euros et se chargeant (auto-contrôle de charge) toute seule, elle est alors facile à remplacer si nécessaire (sans besoin de souder/désouder quoique ce soit).
        Et vu les besoins de recharge (après décharge éventuelle), la faiblesse du soleil de nos belges régions nécessiterait cet usage du “deep sleep”.
        Quant à la disponibilité de l’info, je la vois traitée comme ceci :
        1) quand il est hors “deep sleep” mode, le Wemos envoi l’info en MQTT vers un RPi (broker) et attend l’info en retour d’action à prendre
        2) le RPi (broker) décide ce que doit faire le Wemos suivant l’info reçue et retourne donc sa réponse
        3) le Wemos suit donc la décision du RPi (broker) d’action à effectuer avant d’entrer d’office en “deep sleep” (action = valve d’arrosage, relais d’allumage, son contre nuisible (animaux, jeunes (mosquitto), …)

      • Migui Pda

        Sur cet ancien article, un besoin rejoint les nouveaux articles.
        1) RPi sur lequel fonctionne l’assistant vocal Jarvis () nécessite un MQTT Broker (tel Mosquitto) léger

        2) je viens de découvrir ce Gateway qui pourrait être le pont entre les senseurs (tels Wemos D1 avec DHT22 et autre utilisant MQTT client) : https://github.com/1technop

        3) il faut juste trouver un Dashboard qui permet alors de ne pas alourdir le RPi (puisque Jarvis tourne dessus) et juste disposer des données reçues des senseurs dans du JSON :
        http://crouton.mybluemix.ne
        https://github.com/edfungus

        4) permettant alors de suivre la situation du jardin avec du 433 mHz ou du WiFi (via MQTT) suivant que l’un ou l’autre consommerait moins (voir article du “deep sleep” de ce jour 😉 ) :https://1technophile.blogsp

        A plus pour un nouvel article montrant alors ledit RPi broker avec son Dashboard Crouton (utilisant les données JSON reçues via MQTT des clients Wemos D1 DHT22 😉 et lui renvoyant une commande d’activation d’un relais (arrosage, ventiler la pièce trop humide, …)

  • Migui Pda

    Magnifique article. Merci.