Files
abonnel-www/e5652004-dbab-44f0-b4fa-85948b357769/index.md
T
2026-05-15 23:45:44 +02:00

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

Carte ESP-12F avec la LED intégrée allumée.

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 LOW sur la broche et on l'éteint en écrivant HIGH. 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 :

  1. L'ESP8266 se connecte au réseau Wifi et démarre un serveur sur le port 80.
  2. Depuis un navigateur (smartphone ou ordinateur connecté au même réseau), l'utilisateur saisit l'adresse IP de l'ESP.
  3. L'ESP reçoit la requête HTTP, l'analyse pour détecter une commande (/LED=ON ou /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.