5.6 KiB
Commander une LED en Wifi
Nous avons vu dans le chapitre précédent comment la carte ESP8266 peut se connecter à un point d'accès Wifi. Nous nous fixons maintenant comme objectif de connecter l'ESP8266 au même réseau qu'un smartphone ou un ordinateur afin de commander une LED depuis ces derniers. Pour ce faire, nous allons configurer l'ESP8266 de manière à ce qu'il joue le rôle de serveur : il offrira une page Web à l'utilisateur, et cette page permettra de commander la LED intégrée à la carte de développement.
La LED intégrée à la carte
La plupart des cartes de développement à base d'ESP8266 (NodeMCU, Wemos D1 mini, ESP-12F sur platine, etc.) embarquent une LED soudée directement sur la carte. C'est cette LED qui clignote faiblement lors du téléversement d'un programme, et c'est également elle qui s'allume avec l'exemple classique Blink.
Le GPIO sur lequel cette LED est câblée dépend de la carte : il s'agit le plus souvent du GPIO 2 (NodeMCU, Wemos D1 mini), mais sur certains modules c'est le GPIO 16. Plutôt que de retenir ce numéro, nous utiliserons la constante LED_BUILTIN, définie par le cœur Arduino pour l'ESP8266 et qui pointe automatiquement vers le bon GPIO selon la carte sélectionnée dans l'IDE.
À noter — logique inversée. Sur la quasi-totalité des cartes ESP8266, la LED intégrée est active à l'état bas : on l'allume en écrivant
LOWsur la broche et on l'éteint en écrivantHIGH. C'est l'inverse de ce que l'on observerait avec une LED externe câblée classiquement entre le GPIO et la masse.
Principe de fonctionnement
Le programme suit un schéma client / serveur HTTP très simple :
- L'ESP8266 se connecte au réseau Wifi et démarre un serveur sur le port 80.
- Depuis un navigateur (smartphone ou ordinateur connecté au même réseau), l'utilisateur saisit l'adresse IP de l'ESP.
- L'ESP reçoit la requête HTTP, l'analyse pour détecter une commande (
/LED=ONou/LED=OFF), agit sur la LED en conséquence, puis renvoie une page HTML contenant deux liens de commande ainsi que l'état courant de la LED.
Le code
#include <ESP8266WiFi.h>
const char* ssid = "MON-RESEAU-WIFI";
const char* password = "leMotDePasseDuReseauWifi";
// Variable globale : état courant de la LED.
// La LED étant active à l'état bas, HIGH = éteinte au démarrage.
int valeurLED = HIGH;
// Déclaration du serveur sur le port 80
WiFiServer server(80);
void setup() {
// Initialisation de la communication série
Serial.begin(115200);
delay(100);
// Initialisation de la sortie pour la LED
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, valeurLED);
// Connexion au Wifi
Serial.println();
Serial.print("Connexion au réseau Wifi ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// Connexion en cours...
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Réseau Wifi connecté");
// Démarrage du serveur
server.begin();
Serial.println("Serveur démarré !");
// Affichage de l'adresse IP à utiliser dans le navigateur
Serial.print("Utiliser cette adresse URL pour la connexion : http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Attente de connexion d'un client
WiFiClient client = server.available();
if (!client) {
return;
}
Serial.println("Nouveau client");
// Attendre que le client envoie des données
while (!client.available()) {
delay(1);
}
// Lecture de la première ligne de la requête HTTP
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Interprétation de la requête
if (request.indexOf("/LED=ON") != -1) {
valeurLED = LOW; // logique inversée : LOW allume
digitalWrite(LED_BUILTIN, valeurLED);
}
if (request.indexOf("/LED=OFF") != -1) {
valeurLED = HIGH; // HIGH éteint
digitalWrite(LED_BUILTIN, valeurLED);
}
// Réponse HTTP : page HTML simple
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html><head><meta charset=\"utf-8\"></head><body>");
client.print("<p>La LED est actuellement : <b>");
client.print(valeurLED == LOW ? "ALLUMÉE" : "ÉTEINTE");
client.println("</b></p>");
client.println("<p><a href=\"/LED=ON\">Allumer la LED</a></p>");
client.println("<p><a href=\"/LED=OFF\">Éteindre la LED</a></p>");
client.println("</body></html>");
// Fermeture propre de la connexion
delay(1);
client.stop();
Serial.println("Client déconnecté");
Serial.println();
}
Pour aller plus loin
Jusqu'à présent, l'ESP a assumé trois rôles à lui seul : présenter une page Web, commander la LED et informer de son état. Cette approche est pratique pour apprendre, mais elle ne correspond pas vraiment à ce qui se fait dans l'écosystème des objets connectés.
Dans un déploiement réel, l'ESP se contente le plus souvent d'exposer une API (par exemple en JSON), et c'est un service centralisé comme Domoticz, Home Assistant ou OpenHAB qui fournit l'interface utilisateur, agrège les différents objets et orchestre les automatisations. Dans le chapitre suivant, nous modifierons donc ce programme pour qu'il renvoie une réponse JSON plutôt qu'une page HTML, ce qui en fera un véritable objet connecté prêt à être intégré à une plateforme domotique.
