La carte WeMos D1 Mini est une petite carte de développement WIFI, basée sur le microcontrôleur ESP-8266EX d'Espressif Systems. Elle se programme avec l'EDI Arduino, à condition d'y ajouter le module adéquat.
Il s'agit d'ajouter le module adéquat.
Fichier / Préférences.
URL de gestionnaire de cartes supplémentaires, entrer :
OK.
Outils / Type de carte / Gestionnaire de carte.
esp8266.
Les repères des connecteurs sur la carte et leurs numéros dans les programmes en C/C++ diffèrent. Ils correspondent selon le dessin ci-dessous.
De même que pour d'autres cartes, la carte WeMos D1 Mini possède une petite DEL permettant d'effectuer des tests.
Le code ci-dessous permet de vérifier ces informations.
void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1500); digitalWrite(LED_BUILTIN, LOW); delay(500); Serial.println(LED_BUILTIN); }
L'idée est de placer la carte Wemos D1 Mini sur un objet (ou un robot), de commander celle-ci depuis une tablette, un ordinateur ou un ordiphone. La carte Wemos D1 Mini est équipée d'un serveur web auquel on accède via le navigateur de la tablette. On entre dans la barre d'adresse du navigateur l'adresse IP de la carte Wemos D1 Mini, pour obtenir une page web permettant de piloter l'objet.
Les exemples ci-après se basent sur la bibliothèque ESP8266WiFi.h
.
Une documentation sur cette bibliothèque se trouve sur le site :
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html
La tablette et la carte Wemos D1 Mini se connectent au même un point d'accès WIFI. Ci-dessous, "nom_du_reseau" et "mot_de_passe" doivent être adaptés au réseau utilisé. La liaison série est utile pour connaître l'adresse IP de la carte Wemos D1 Mini.
#include <ESP8266WiFi.h> const char* ssid = "nom_du_reseau"; const char* password = "mot_de_passe"; WiFiServer server(80); int etat_led = 0; void setup() { Serial.begin(9600); delay(500); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); // Connection au WiFi Serial.println(""); Serial.print("Connecté à "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connecté"); // Démarrer le serveur server.begin(); Serial.println("Serveur démarré"); // Indiquer l'adresse IP Serial.print("Utiliser cette URL : http://"); Serial.print(WiFi.localIP()); Serial.println("/"); Serial.println(""); } void loop() { // Vérifier si le client est connecté WiFiClient client = server.available(); if (!client) { return; } // Attendre jusqu'à ce que le client envoie des données Serial.println("Nouveau client"); while (!client.available()) { delay(100); } // Lire la première ligne de la requête String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Vérifier la requête if (request.indexOf("LED=ON") != -1) { digitalWrite(LED_BUILTIN, LOW); etat_led = 1; } if (request.indexOf("LED=OFF") != -1) { digitalWrite(LED_BUILTIN, HIGH); etat_led = 0; } // Retourner la réponse client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head><meta charset=\"utf-8\"></head>"); client.println("<body>"); client.print("La DEL est maintenant : "); if (etat_led == 1) client.print(" allumée."); else client.print(" éteinte."); client.println("<br><br>"); client.println("Cliquer <a href=\"/LED=ON\">ici</a> pour mettre D4 à 0 et allumer la DEL.<br>"); client.println("Cliquer <a href=\"/LED=OFF\">ici</a> pour mettre D4 à 1 et éteindre la DEL."); client.println("</body>"); client.println("</html>"); delay(10); Serial.println("Client déconnecté\n"); }
La carte Wemos D1 Mini est un point d'accès WIFI auquel on connecte la tablette. La liaison série est utile pour détecter un éventuel problème.
#include <ESP8266WiFi.h> const char* ssid = "WEMOS_D1"; const char* password = "987654321"; IPAddress local_IP(192,168,0,222); IPAddress gateway(192,168,4,9); IPAddress subnet(255,255,255,0); WiFiServer server(80); int etat_led = 0; void setup() { Serial.begin(9600); delay(500); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); Serial.println(""); Serial.print("Configuration en point d'accès Wifi ... "); Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Prêt" : "Erreur!"); Serial.print("Démarrage du point d'accès Wifi ... "); Serial.println(WiFi.softAP(ssid,password) ? "Prêt" : "Erreur!"); Serial.print("Adresse IP du point d'accès Wifi : "); Serial.println(WiFi.softAPIP()); // Démarrer le serveur server.begin(); Serial.println("Serveur Web démarré"); Serial.println(""); } void loop() { // Vérifier si le client est connecté WiFiClient client = server.available(); if (!client) { return; } // Attendre jusqu'à ce que le client envoie des données Serial.println("Nouveau client"); while (!client.available()) { delay(100); } // Lire la première ligne de la requête String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Vérifier la requête if (request.indexOf("LED=ON") != -1) { digitalWrite(LED_BUILTIN, LOW); etat_led = 1; } if (request.indexOf("LED=OFF") != -1) { digitalWrite(LED_BUILTIN, HIGH); etat_led = 0; } // Retourner la réponse client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head><meta charset=\"utf-8\"></head>"); client.println("<body>"); client.print("La DEL est maintenant : "); if (etat_led == 1) client.print(" allumée."); else client.print(" éteinte."); client.println("<br><br>"); client.println("Cliquer <a href=\"/LED=ON\">ici</a> pour mettre D4 à 0 et allumer la DEL.<br>"); client.println("Cliquer <a href=\"/LED=OFF\">ici</a> pour mettre D4 à 1 et éteindre la DEL."); client.println("</body>"); client.println("</html>"); delay(10); Serial.println("Client déconnecté\n"); }
Le code ci-dessous, plus court à écrire, utilise une variable géante. Une feuille de style rend les boutons pus élégants.
... String html="HTTP/1.1 200 OK\n" "Content-Type: text/html\n\n" "<!DOCTYPE HTML>" "<html>" "<head>" "<meta charset=\"utf-8\">" "<style>" "body { background-color: #080; text-align: center; font-size: 3em; }" "a { display: block; background-color: #cfc; margin: 20px; text-decoration: none; border-radius: 25px; }" "a:hover { opacity: 0.8; }" "</style>" "</head>" "<body>" "<a href=\"/LED=ON\">Allumer</a>" "<a href=\"/LED=OFF\">Eteindre</a>" "</body>" "</html>" client.print(html); ...
Affichage :
Ici, l'utilisateur clique sur des dessins au format SVG plutôt que sur des textes.
... String html="HTTP/1.1 200 OK\n" "Content-Type: text/html\n\n" "<!DOCTYPE HTML>" "<html>" "<head>" "<meta charset=\"utf-8\">" "<style>" "body { background-color: #003; text-align: center; }" "svg { width: 100px; height: 100px; background-color: #cfc; border-radius: 25px; margin: 20px; }" "</style>" "</head>" "<body>" "<a href=\"/LED=ON\"><svg><path d=\"M 25 75 L 50 20 L 75 75\"/></svg></a>" "<a href=\"/LED=OFF\"><svg><path d=\"M 25 25 L 50 80 L 75 25\"/></svg></a>" "</body>" "</html>"; client.print(html); ...
Affichage :