ARDUINO
LA CARTE WEMOS D1 MINI

Introduction

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.

Quelques caractéristiques :

Alimentation de la carte :

Premiers pas

Configuration de l'EDI

Il s'agit d'ajouter le module adéquat.

  1. Ouvrir l’EDI Arduino, aller dans Fichier / Préférences.
  2. Dans URL de gestionnaire de cartes supplémentaires, entrer :
        http://arduino.esp8266.com/stable/package_esp8266com_index.json
  3. Cliquer sur OK.
  4. Aller ensuite dans Outils / Type de carte / Gestionnaire de carte.
  5. Installer esp8266.

Repérage des connecteurs

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.

Test de fonctionnement

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);
}

Commande via une interface web

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.

Connexion à un point d'accès WIFI

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(""); //  A ne pas oublier!

  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é");
  Serial.println("");

}

Configuration en point d'accès WIFI

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(""); // A ne pas oublier!

  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é");
  Serial.println("");

}

Variantes pour l'IHM

Page HTML dans une variable

Le code ci-dessous, plus court à écrire, utilise une variable géante.

...
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 :

Dessins remplaçant les textes

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 :