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 le driver CH340 ou CH341 du programmateur intégré
A priori, tous les systèmes d’exploitation (Windows, macOS et Linux) détectent et installent automatiquement le driver du programmateur intégré (convertisseur UART / USB) sur les cartes de développement ESP8266.
Si la carte ESP8266 n’est pas détectée, suivez les instructions de cet article pour installer manuellement le drivers CH340 ou CH342
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.
Dans le champ de saisie, collez l’adresse internet suivante puis validez
https://arduino.esp8266.com/stable/package_esp8266com_index.json
http://arduino.esp8266.com/staging/package_esp8266com_index.json
Pour les cartes ESP32, ajoutez la source suivante
https://dl.espressif.com/dl/package_esp32_index.json
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
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.
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.
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.
Problèmes avec le bus I2C et la librairie SD à partir de la version 2.5
La version 2.5 du SDK ESP8266 semble introduire des changements importants qui peuvent poser des problèmes d’incompatibilité avec certaines libraires. J’ai par exemple rencontré des problèmes de compilation avec la librairie SD qui permet d’enregistrer et lire sur une carte micro SD. Un problème similaire avait été signalé en 2016 sur le forum officiel. Le compilateur refuse de compiler le programme sans que le chip select de la carte SD soit indiqué. ce paramètre est normalement facultatif. Si on indique un chip select, la compilation et le téléversement s’effectue correctement mais on perd la communication avec le bus I2C.
Si vous rencontrez un problème similaire, vous pouvez (temporairement) revenir à une version précédente du SDK.
Comment installer une version précédente du SDK ESP8266 ?
En cas de problème, il est toutefois possible d’utiliser une version précédente du SDK. Pour cela, ouvrez le gestionnaire de carte et cherchez la carte ESP8266. Cliquez sur Supprimer pour effacer tout le SDK.
Choisissez ensuite la version désirée, par exemple la version 2.4.2 puis cliquez sur installer. Ne cliquez par sur mettre à jour car l’IDE Arduino installe automatiquement la dernière version publiée (latest) !
Avant d’aller plus loin, remarque sur l’ESP-01
L’ESP-01 est une version plus limitée de l’ESP8266. Il ne dispose que de 2 entrées / sorties (GPIO). Il existe deux versions dont la différence réside dans la quantité de mémoire flash installée
- ESP-01 équipé de 512Ko de mémoire flash
- ESP-01S équipé d’1Mo de mémoire flash
Pour en savoir plus, tout est expliqué en détail dans cet article
Les cartes ESP-01 ne disposent pas de convertisseur UART vers USB. A chaque fois qu’on souhaite téléverser un programme Arduino, il faut mettre le module dans un mode particulier, le Bootload ou Flashing Mode. Il existe une petite carte pour faciliter la programmation. Pour en savoir plus, tout est expliqué en détail dans cet article
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 11), toutes les sorties de l’ESP8266 peuvent générer un signal PWM. Si vous avez besoin d’un plus grande nombre d’E/S, vous pouvez passer à l’ESP32.
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 | 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.
1Mé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
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 LoLin WeMos d1 mini. Ce schéma de branchement est valable pour toutes les cartes à base de module ESP-12x.
Attention, le GPIO fonctionne avec 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 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
int led = 16;
void setup() {
pinMode(led, OUTPUT); // Initialise la broche "led" comme une sortie - Initialize the "LED" pin as an output
}
// Cette boucle s'exécute à l'infini
// the loop function runs over and over again forever
void loop() {
digitalWrite(led, LOW); // Eteint la Led - Turn the LED OFF
delay(1000); // Attendre 1 seconde - Wait for a second
digitalWrite(led, HIGH); // Allume la Led - Turn the LED off by making the voltage HIGH
delay(2000); // Pause de 2 secondes - Wait 2 secondes
}
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.
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
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
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++)
const char* ssid = "xxxx"; // Identifiant WiFi
const char* password = "xxxxxxxxx"; // Mot de passe WiFi
ESP8266WebServer server(80); // On démarre un serveur qui écoute sur le port 80 les demande du client, l'utilisateur sur son navigateur internet
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
-
server.on("/", [](){ server.send(200, "text/plain", "Page d'accueil"); // Ajoute un point d'entree, une page web });
On ajoute un point d’entrée, c’est à dire une adresse internet (URL) sur laquelle on affichera pour le moment un simple texte
-
server.on("/parametres", [](){ server.send(200, "text/plain", "Une page de parametres"); });
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.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char* ssid = "XXXX"; // Identifiant WiFi
const char* password = "XXXXXXXXX"; // Mot de passe WiFi
ESP8266WebServer server(80); // On instancie un serveur qui ecoute sur le port 80
int led = D0;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// on attend d'etre connecte au WiFi avant de continuer
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// on affiche l'adresse IP attribuee pour le serveur DSN
Serial.println("");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// on definit les points d'entree (les URL a saisir dans le navigateur web) et on affiche un simple texte
server.on("/", [](){
server.send(200, "text/plain", "Page d'accueil");
});
server.on("/parametres", [](){
server.send(200, "text/plain", "Une page de parametres");
});
// on demarre le serveur web
server.begin();
pinMode(led, OUTPUT); // Initialise la broche "led" comme une sortie - Initialize the "LED" pin as an output
}
// Cette boucle s'exécute à l'infini - the loop function runs over and over again forever
void loop() {
// a chaque iteration, la fonction handleClient traite les requetes
server.handleClient();
digitalWrite(led, LOW); // Eteint la Led - Turn the LED OFF
delay(1000); // Attendre 1 seconde - Wait for a second
digitalWrite(led, HIGH); // Allume la Led - Turn the LED off by making the voltage HIGH
delay(1000); // Pause de 2 secondes - Wait 2 secondes
}
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.
Programmation Web Serveur : piloter le GPIO depuis un smarphone 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)
String getPage(){
String page = "<html lang=fr-FR><head><meta http-equiv='refresh' content='10'/>";
page += "<title>ESP8266 Web Server Demo - www.projetsdiy.fr</title>";
page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
page += "</head><body><h1>ESP8266 Web Server Demo</h1>";
page += "<h3>GPIO</h3>";
page += "<form action='/' method='POST'>";
page += "<ul><li>D0 (etat: ";
page += etatD0;
page += ") ";
page += "<INPUT type='radio' name='D0' value='1'>ON";
page += "<INPUT type='radio' name='D0' value='0'>OFF</li></ul>";
page += "<INPUT type='submit' value='Actualiser'>";
page += "<br><br><p><a hrf='http://www.projetsdiy.fr'>www.projetsdiy.fr</p>";
page += "</body></html>";
return page;
}
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.
server.on ( "/", 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.
void handleRoot(){
if ( server.hasArg("D0") ) {
handleSubmit();
} else {
server.send ( 200, "text/html", getPage() );
}
}
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.
void handleSubmit() {
// Actualise le GPIO / Update GPIO
String LEDValue;
LEDValue = server.arg("D0");
Serial.print("Set GPIO to "); Serial.println(LEDValue);
if ( LEDValue == "1" ) {
digitalWrite(D0, 1);
etatD0 = "On";
server.send ( 200, "text/html", getPage() );
} else if ( LEDValue == "0" ) {
digitalWrite(D0, 0);
etatD0 = "Off";
server.send ( 200, "text/html", getPage() );
} else {
Serial.println("Err Led Value");
}
}
Collez le code complet suivant en modifiant identifiant et mot de passe WiFi.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char* ssid = "XXXX"; // Identifiant WiFi
const char* password = "XXXXXXXX"; // Mot de passe WiFi
ESP8266WebServer server(80); // On instancie un serveur qui ecoute sur le port 80
int led = D0;
String etatD0 = "Off";
String getPage(){
String page = "<html lang=fr-FR><head><meta http-equiv='refresh' content='10'/>"; // C'est du code HTML, la page s'auto-actualise
page += "<title>ESP8266 Web Server Demo - www.projetsdiy.fr</title>"; // Titre de la barre du navigateur
page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>"; // style de la page
page += "</head><body><h1>ESP8266 Web Server Demo</h1>"; // Titre de la page (H1)
page += "<h3>GPIO</h3>"; // Sous-titre (H3)
page += "<form action='/' method='POST'>"; // Le formulaire sera envoye avec une requete de type POST
page += "<ul><li>D0 (etat: "; // Premiere ligne de la liste (ul) avec D0
page += etatD0; // on concatene la chaine contenant l'etat de la sortie
page += ") ";
page += "<INPUT type='radio' name='D0' value='1'>ON"; // Bouton pour activer D0
page += "<INPUT type='radio' name='D0' value='0'>OFF</li></ul>"; // et le desactiver
page += "<INPUT type='submit' value='Actualiser'>"; // Bouton d'actualisation
page += "<br><br><p><a hrf='http://www.projetsdiy.fr'>www.projetsdiy.fr</p>";
page += "</body></html>";
return page;
}
void handleRoot(){
if ( server.hasArg("D0") ) {
handleSubmit();
} else {
server.send ( 200, "text/html", getPage() );
}
}
void handleSubmit() {
// Actualise le GPIO / Update GPIO
String LEDValue;
LEDValue = server.arg("D0");
Serial.print("Set GPIO to "); Serial.println(LEDValue);
if ( LEDValue == "1" ) {
digitalWrite(D0, 1);
etatD0 = "On";
server.send ( 200, "text/html", getPage() );
} else if ( LEDValue == "0" ) {
digitalWrite(D0, 0);
etatD0 = "Off";
server.send ( 200, "text/html", getPage() );
} else {
Serial.println("Err Led Value");
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// on attend d'etre connecte au WiFi avant de continuer
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// on affiche l'adresse IP qui nous a ete attribuee
Serial.println("");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// on definit les points d'entree (les URL a saisir dans le navigateur web) et on affiche un simple texte
server.on ( "/", handleRoot );
// on demarre le serveur web
server.begin();
pinMode(led, OUTPUT); // Initialise la broche "led" comme une sortie - Initialize the "LED" pin as an output
}
// Cette boucle s'exécute à l'infini - the loop function runs over and over again forever
void loop() {
// a chaque iteration, on appelle handleClient pour que les requetes soient traitees
server.handleClient();
}
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.
Tous les tutoriels sur la programmation Web Server des ESP8266
ESP8266, Serveur Web (Interface)- Projet de station météo avec interface HTML sur ESP8266 (DHT22 + BMP180) 14 août 2020
- Projet station météo ESP8266 (Partie 3). Récupérer l’heure avec NTPClient et stockage SPIFFS 28 juin 2017
- ESP8266. Comment utiliser la librairie WiFiManager pour gérer les connexions WiFi 26 juin 2017
- Piloter le GPIO de l’ESP8266 (Serveur Web) depuis Jeedom en TCP/IP sans fil – Partie 2 14 avril 2017
- Piloter le GPIO de l’ESP8266 (2) depuis Domoticz en TCP/IP sans fil. Serveur Web et requête HTTP 31 mars 2017
- Projet station météo ESP8266 (Partie 5). Afficher des jauges et graphiques Google Charts 20 mars 2017
- ESP8266. Développer et tester l’interface HTML avec Node.js et Pug (ancien Jade) 15 mars 2017
- Projet station météo ESP8266 (Partie 4). ArduinoJson, charger, enregistrer des fichiers (SPIFFS) 13 mars 2017
- Projet station météo ESP8266 (Partie 2). Piloter le code Arduino depuis l’interface HTML 27 février 2017
- Projet station météo ESP8266 (Partie 1). Créer l’interface HTML, stockage SPIFFS 22 février 2017
- Interface HTML pour ESP8266. Changer de thème Bootstrap avec Bootswatch et bootstrapCDN 15 février 2017
- Interface HTML pour ESP8266. Améliorer le design avec Bootstrap 13 février 2017
- ESP8266. Comprendre le code Arduino d’un serveur web avec interface HTML 10 février 2017
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é)
ESP8266, Client Web (communication)- Mesure de température DS18B20, code Arduino compatible ESP8266 et ESP32, publication sur Domoticz en HTTP 13 décembre 2017
- ESP8266. Comment utiliser la librairie WiFiManager pour gérer les connexions WiFi 26 juin 2017
- Comment envoyer des données à Jeedom via l’API JSON depuis un IoT ESP8266 7 avril 2017
- Domoticz. Comment envoyer des données via l’API/JSON depuis un IoT ESP8266 24 mars 2017
- ESP8266. Comment se connecter au réseau WiFi (ESP8266WiFi et ESP8266WiFiMulti) 22 mars 2017
Questions fréquentes (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 la version qui convient à votre ordinateur ou mini-PC. Il existe également une version en ligne si vous ne voulez rien installer sur votre ordinateur.
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 (Raspberry Pi par exemple) ?
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.
Je n’y connais rien en programmation, essayez le projet 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.
- ESP Easy Mega. Installation facile avec PlatformIO sur ESP8266 (R120 obsolète)
- Hack . Prise connectée SONOFF S20 pour en faire un super smart plug avec ESP Easy R120
- ESP Easy R120 ou Mega. Flasher le firmware avec esptool.py sur ESP8266
- ESP Easy R120. Ecran d’affichage OLED SSD1306 déporté avec un script Lua
- ESP Easy R120. Utiliser les Rules pour créer la consigne d’un thermostat connecté (Jeedom, Domoticz, Node-RED…)
- Test du shield LoLin d1 mini DHT11 ou DHT22 avec du code Arduino ou ESP Easy
- ESP Easy + MQTT + Node-RED. Communication bi-directionnelle + dashboard
- ESP Easy R120. Ecran d’affichage OLED SSD1306 pour Jeedom actualisé par requête HTTP
- ESP Easy 120. Exploiter des accessoires domotiques DIY connectés à Jeedom
- Débuter avec les Rules d’ESP Easy. Créer un mini serveur domotique à base d’ESP8266
Quel modèle d’ESP8266 ou ESP32 choisir pour débuter ?
Si votre projet nécessite une connectivité WiFi ou Bluetooth, l’ESP8266 (guide complet) est un module compatible avec le code Arduino. L’ESP32 est une version améliorée qui dispose d’un plus grand nombre d’entrées / sorties (GPIO), plus de puissance et consomme encore moins.
Quelques tutoriels et projets à base d’ESP8266
- Stocker des données sur une carte micro SD. Code Arduino compatible ESP32, ESP8266
- Débuter Arduino. Recevoir des commandes depuis le port série (compatible ESP32 ESP8266)
- Fonctions C++ print•println•printf•sprintf pour Arduino ESP32 ESP8266. Combiner•formater → port série
- String C++. concat•c_srt•indexOf•replace•subString… pour Arduino ESP32 ESP8266
- ESP01. Débuter avec l’IDE Arduino ou PlatformIO. Quel module choisir ? Repérage des broches
- Comment attribuer une IP fixe à un projet ESP32 ESP8266 ou ESP01
- ESP01. Quel programmeur choisir ? Modification pour passer en Flash Mode
- Débuter avec ArduinoJSON v6, librairie Arduino pour manipuler des objets JSON
- Débuter avec le bus I2C sur Arduino ESP8266 ESP32. Librairie Wire.h
- ESP8266. Téléverser le dossier data (SPIFFS ou LittleFS) depuis PlatformIO
Quelques tutoriels et projets à base d’ESP32
- ESP32, broches GPIO et fonctions associées. I/O, PWM, RTC, I2C, SPI, ADC, DAC
- M5Stack Atomic GPS. Tracker ESP32 TinyGPS++, export GPX sur carte SD, visualisation sur Google Maps ou VSCode
- Stocker des données sur une carte micro SD. Code Arduino compatible ESP32, ESP8266
- Débuter Arduino. Recevoir des commandes depuis le port série (compatible ESP32 ESP8266)
- Fonctions C++ print•println•printf•sprintf pour Arduino ESP32 ESP8266. Combiner•formater → port série
- String C++. concat•c_srt•indexOf•replace•subString… pour Arduino ESP32 ESP8266
- ESP32. Utiliser les Timers et alarmes avec du code Arduino
- ESP32. Utiliser les interruptions externes avec du code Arduino
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.
Tutoriels et projets MicroPython
- Projet MicroPython, publier le taux de CO2 avec un capteur MH-Z19 vers Domoticz (ESP32/ESP8266)
- ESP32, lire la température de plusieurs sondes DS18B20 en MicroPython et publier vers Domoticz
- Affichage OLED SSD1306 en MicroPython, exemple avec un baromètre numérique BME280 I2C
- MicroPython, gérer la connexion WiFi au démarrage sur ESP8266/ESP32
- uPiCraft, un IDE dédié au développement d’objets connectés en MicroPython pour ESP8266, ESP32, microbit, pyBoard
Tous les projets en Micro Pyton
Problèmes et solutions avec l’ESP8266
Erreur python3 not found sur macOS
Si vous rencontrez cette erreur au moment de la compilation sur macOS, voici une solution qui fonctionne. Ouvrez le Terminal puis exécutez les commandes suivantes
cd ~/Library/Arduino15/packages/esp8266/tools/python3/3.7.2-post1
unlink python3
ln -s /usr/local/bin/python3 python3
Source : https://github.com/esp8266/Arduino/issues/6931
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
Mises à jour
17/06/2020 Solution à l’erreur python3 not found sur macOS
24/04/2020 Actualisation de l’article
3/06/2019 Nouvelle url vers le SDK ESP8266. Régression SDK remarquée depuis la version 2.5.x. Comment installer une version précédente du SDK
- Stocker des données sur une carte micro SD. Code Arduino compatible ESP32, ESP8266
- Débuter Arduino. Recevoir des commandes depuis le port série (compatible ESP32 ESP8266)
- Fonctions C++ print•println•printf•sprintf pour Arduino ESP32 ESP8266. Combiner•formater → port série
- String C++. concat•c_srt•indexOf•replace•subString… pour Arduino ESP32 ESP8266
- ESP01. Débuter avec l’IDE Arduino ou PlatformIO. Quel module choisir ? Repérage des broches
- Comment attribuer une IP fixe à un projet ESP32 ESP8266 ou ESP01
bonjour ,merci pour le temps passe a ecrire ces tutos qui mon permis d’apprendre beaucoup
j,ai probleme une connection sans”graphisme”fonctionne tres bien allume ete teind une LED sans problememais dans ce tuto plus rien pas de connection hormis avec ma box message recopie ecran
Connected to Livebox-1712
IP address: 192.168.1.29
HTTP server started
————— CUT HERE FOR EXCEPTION DECODER —————
Exception (0):
epc1=0x4000dce5 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
ctx: cont
sp: 3ffffde0 end: 3fffffc0 offset: 0190
3fffff70: 0000ffff 00ffff00 3ffee72c 40205692
3fffff80: 3fffdad0 00000000 3ffee72c 402056ec
3fffff90: 3fffdad0 00000000 3ffee744 402037cc
3fffffa0: 3fffdad0 00000000 3ffee8fc 40207230
3fffffb0: feefeffe feefeffe 3ffe84e4 40100c95
<<<stack<<<
————— CUT HERE FOR EXCEPTION DECODER —————
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld
compilation sans PB mais au flash message suivant
esptool.py v2.8
Serial port COM5
Connecting….
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 10:52:1c:02:46:32
Uploading stub…
Running stub…
Stub running…
Changing baud rate to 460800
Changed.
Configuring flash size…
Auto-detected Flash size: 4MB
Compressed 298416 bytes to 217810…
Writing at 0x00000000… (7 %)
Writing at 0x00004000… (14 %)
Writing at 0x00008000… (21 %)
Writing at 0x0000c000… (28 %)
Writing at 0x00010000… (35 %)
Writing at 0x00014000… (42 %)
Writing at 0x00018000… (50 %)
Writing at 0x0001c000… (57 %)
Writing at 0x00020000… (64 %)
Writing at 0x00024000… (71 %)
Writing at 0x00028000… (78 %)
Writing at 0x0002c000… (85 %)
Writing at 0x00030000… (92 %)
Writing at 0x00034000… (100 %)
Wrote 298416 bytes (217810 compressed) at 0x00000000 in 5.1 seconds (effective 463.8 kbit/s)…
Hash of data verified.
Leaving…
Hard resetting via RTS pin…
Bibliothèque non valide trouvée dans C:\Users\Jperso\Documents\Arduino\libraries\Downloads : no headers files (.h) found in C:\Users\Jperso\Documents\Arduino\libraries\Downloads
Bibliothèque non valide trouvée dans C:\Users\Jperso\Documents\Arduino\libraries\Downloads : no headers files (.h) found in C:\Users\Jperso\Documents\Arduino\libraries\Downloads
avez vou sune idee de ce qui ce passe
merci de votre aide
Dans le §Comment programmer l’ESP8266 avec l’IDE Arduino ?
L’illustration est le D1 Mini… Sauf que le téléversement ne se fait pas si le driver CH340 est absent.
C’est à ajouter avant ce § avec pourquoi pas en fin d’installation de l’IDE un § : Pour finaliser l’installation du IDE.
Vous avez de plus un billet sur le CH340
https://projetsdiy.fr/installer-le-drivers-ch340x-sur-macos-pour-wemos-d1-mini/
Bonjour V. Oui effectivement, comme je travaille toujours sur le même ordi depuis qq années et que le système détecte parfaitement les cartes, j’ai un peu zappé cette étape 🙂 Heureusement que vous êtes passé par là !
Bonjour, le lien qu’il faut ajouter dans les préférences ne fonctionne pas pour moi… Il me met une erreur. Pourriez-vous m’aider s’il vous plaît ?
Bonjour, je viens de tester et tout semble correct. Il faut bien mettre une seule url par ligne.
Bonjour,
Je souhaite réaliser une prise connectée à l’aide d’un ESP-01, je fabriquerais mon propre shield relais (pour ma formation perso), mon soucis est que l’esp01 fonctionne sous 3,3V et le relais en 5v, la dessus ça va encore, mais concernant le GPIO de l’esp vers le signal du relais, dois-je repartir de 3,3V a 5v pour piloter la bobine ?
Merci
Bonjour Christian. La plupart des relais supportent une tension plus faible. C’est le cas par exemple pour le relai des shields Wemos https://projetsdiy.fr/produit/deal-shield-1x-relais-250vac10a-30vdc10a-wemos-d1-mini/ Ca devrait donc fonctionner sans trop de problème.
Bonjour,
Félicitation pour cette superbe documentation.
Cependant, débutant sur le sujet je ne parviens pas a compiler le code et ne trouve pas la solution
J’ai une erreur sur int led = “D0”; ‘D0’ was not declared in this scope
Pouvez vous m’apporter de l’aide sur le sujet ?
Merci d’avance
Bonjour Cyrille. Il ne faut pas encadre D0 entre guillemets. C’est une constante qui sera remplacée lors de la compilation.
Ce guide est très complet et va beaucoup m’aider pour des projets diverses!! Je débute avec la wemos! Cependant au tout début de cet article (installation de la librairie) vous n’avez pas précisez qu’il faut penser à installer le driver CH340G pour les cartes wemos! (ça aurait été un petit plus). Sinon bravo pour ce travail.
Bonjour Weldy. Oui c’est vrai, un oubli de ma part, c’est corrigé.
Super tuto,
Merci beaucoup et bravo pour votre site!
Merci beaucoup Jean-Pierre. Avec plaisir
Magnifique article. Merci.
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
Sur cet ancien article, un besoin rejoint les nouveaux articles.
1) RPi sur lequel fonctionne l’assistant vocal Jarvis (https://www.openjarvis.com/) nécessite un MQTT Broker (tel Mosquitto) léger. Le choix de Jarvis se justifiant dans son côté sécurité. En effet, à contrario des autres solutions d’assistant vocal qui écoute constamment (en connexion avec les outils web d’écoute), Jarvis n’échange pas d’info avec l’extérieur tant qu’il n’a pas localement entendu qu’on l’appelle. C’est seulement alors qu’il s’ouvre au monde pour utiliser ses outils de communication.
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.blogspot.be/2016/08/low-cost-low-power-6ua-garden-433mhz.html
5) l’intérêt étant bien entendu de permettre alors à Jarvis de nous signaler les réactions sur senseurs pré-sélectionnés (exemple : oubli d’une fenêtre en partant, détection d’intrusion durant le sommeil, …). Tout en lui permettant de faire des actions sur sénarios (scripts) ou à la demande.
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, …)
Très bonne idée. A tester !
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), …)