ARDUINO
LA CARTE WEMOS D1 MINI

Introduction

La carte de développement WeMos D1 Mini est une mini carte WIFI basée sur le circuit intégré à microcontrôleur ESP-8266EX. Elle se programme avec l'EDI Arduino, à condition toutefois s'y ajouter le module adéquat. La documentation pour installer ce module se retrouve aisément sur internet. Quelques caractéristiques :

Comme avec les autres cartes, la WeMos D1 Mini possède une petite DEL permettant d'effectuer des tests. Elle est associée au connecteur dont le numéro, donné par la variable LED_BUILTIN a pour valeur 2. Une particularité : La DEL s'éteint en mettant le connecteur 2 au niveau logique 1. Elle s'allume en le mettant au niveau logique 0. Le code ci-dessous permet de vérifier ces informations.

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  Serial.print(LED_BUILTIN);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(2000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(400);
}

Commande via une interface web

Principe

L'idée est de placer la carte Wemos D1 Mini sur un objet (ou un robot), de commander celle-ci depuis une tablette (ou un ordinateur, un ordiphone). La carte Wemos D1 Mini est équipé 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>

int num_del = D5;
const char* ssid = "nom_du_reseau";
const char* password = "mot_de_passe";

WiFiServer server(80);
 
void setup() {
  Serial.begin(115200);
  delay(10);
 
  pinMode(num_del, OUTPUT);
  digitalWrite(num_del, LOW);
 
  // 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("Utilisé cette URL : ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  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
  int value = LOW;
  if (request.indexOf("/LED=ON") != -1) {
    digitalWrite(num_del, HIGH);
    value = HIGH;
  } 
  if (request.indexOf("/LED=OFF") != -1) {
    digitalWrite(num_del, LOW);
    value = LOW;
  }
 
  // 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(value == HIGH) client.print(" allumée.");  
  else client.print(" éteinte.");
  client.println("<br><br>");
  client.println("Cliquer <a href=\"/LED=ON\">ici</a> pour mettre la broche 5 au niveau logique 1.<br>");
  client.println("Cliquer <a href=\"/LED=OFF\">ici</a> pour mettre la broche 5 au niveau logique 0.");
  client.println("</body>");
  client.println("</html>");
 
  delay(10);
  Serial.println("Client disconnected");
  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() {

  pinMode(LED_BUILTIN, OUTPUT);
  
  Serial.begin(115200);
  Serial.println();

  Serial.print("Setting soft-AP configuration ... ");
  Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");

  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP(ssid,password) ? "Ready" : "Failed!");

  Serial.print("Soft-AP IP address = ");
  Serial.println(WiFi.softAPIP());
     
  // Démarrer le serveur
  server.begin();
  Serial.println("Serveur démarré");
  digitalWrite(LED_BUILTIN, HIGH);
}

     
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 == HIGH) client.print(" allumée.");  
  else client.print(" éteinte.");
  client.println("<br><br>");
  client.println("Cliquer <a href=\"/LED=ON\">ici</a> pour mettre la broche 5 au niveau logique 1.<br>");
  client.println("Cliquer <a href=\"/LED=OFF\">ici</a> pour mettre la broche 5 au niveau logique 0.");
  client.println("</body>");
  client.println("</html>");
     
  delay(10);
  Serial.println("Client disconnected");
  Serial.println("");

}