Comment fonctionne un module wifi ? Comment contrôler une LED depuis votre téléphone ?

Introduction

Le module wifi esp8266 est un module de communication wifi utilisable sur Arduino et Raspberry Pi. Ce Module peut recevoir et transmettre des données avec la liaison TX/RX et donc se comporte comme hôte pour vos applications Wifi.

Ce module va vous permettre d’apporter du wifi à tous vos projets électroniques. Il possède deux modes :

  • Station mode 

 L’esp8266 se connecte à un réseau wifi existant ( celui crée par votre routeur).

En mode station, l’esp8266 obtient l’ip du routeur auquel il est connecté. Avec cette adresse, il peut configurer un serveur Web et fournir des pages Web à tous les appareils connectés sous le réseau Wifi existant.

  • Point d’accès Wifi Mode

  Dans ce mode l’esp8266 créer on propre réseau wifi et joue le rôle de routeur.

Plusieurs périphériques comme votre téléphone ou un ordinateur peuvent s’y connecter. Néanmoins le point d’accès wifi crée par l’esp8266 n’est pas relié à internet.

Enfin vous pouvez connecter un maximum de 5 périphériques en même temps sur le module.

Par défaut, le module Wifi est configuré en point d’accès wifi. Il faudra donc lui indiquer dans un programme s’il doit se connecter à un réseau ou bien jouer le rôle du point d’accès wifi.

  • Voici les pins du esp8266 :

GND : La masse

GPIO2 : Broche programmable

GPIO0 : Deuxième broche programmale

RX : Receveur liaison UART

TX : Transmetteur liaison UART

CH_PD : A connecter en 3.3V

REST : Reset : permet de reset le programme. On le connecte sur 3.3V pour un fonctionnement normal et GND pour le reset.

VCC : Tension d’alimentation

Dans notre cours, la broche RST, GPIO0 et GPIO2 ne seront pas utilisées.

Comment refaire nos circuits Fritzing ?

Pour reproduire nos circuits avec le module esp8266, vous avez besoin de télécharger le composant. On vous laisse regarder sur notre cours sur fritzing pour l’installer.

Librairie esp8266

Pour faire fonctionner votre programme, vous pouvez utiliser la librairie esp8266 qui va faciliter le contrôle du module. C’est une librairie en .zip, il vous faudra juste la télécharger puis indiquer au logiciel Arduino IDE ou la trouver.

Vous devez ensuite installer la carte Esp3266 afin que le programme se compile et téléverse en fonction de celle-ci. Pour cela vous devez aller dans outils puis manager de carte et taper esp8266 :

Une fois la carte installée, vous devez choisir la carte Esp8266 comme carte à programmer pour que le programme fonctionne :

Vous êtes maintenant prêt pour utiliser. Si vous avez du mal à l’installer, on vous conseille notre cours sur les librairies.

Schéma du circuit

Voici le schéma du circuit dont on aura besoin pour faire fonctionner les programmes.

Les premières broches en vert les plus haute corresponds à la première ligne de broche sur votre module wifi. La ligne de broche la plus en bas corresponds à la deuxième ligne sur le module wifi.

Le circuit en change pas pour tous les programmes.

Débrancher les bornes RX et TX avant de téléverser les programmes !

Comme vous avez pu voir dans le schéma du circuit, les bornes RX et TX de la carte arduino sont liés au module wifi. Les fils de liaison des bornes RX et TX doivent impérativement être débranché avant de téléverser un programme et rebranché après si vous souhaitez ne pas avoir d’erreur lors du téléversement.  Vous avez plus d’information dans problème de téléversement.

Se connecter à un point d'accès Wifi

On va maintenant voir comment connecter votre module esp8266 à votre réseau wifi. Pour cela on va utiliser le module en tant que client, car il va se connecter au réseau et pas en créer un. Le schéma lié avec le programme est celui montré dans la partie précédente.

/*  Ce code permet de se connecter au réseau wifi et envoie bonjour et attend la réponse */
#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "your-ssid" // Le nom de votre wifi chez vous
#define STAPSK  "your-password" // Votre mot de passe
#endif

const char* ssid     = STASSID;
const char* password = STAPSK;

const char* host = "djxmmx.net";
const uint16_t port = 17;

void setup() {
  Serial.begin(115200); // On démarre le moniteur série
  Serial.println();
  Serial.println();
  Serial.print("Connexion à ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA); // On dit au module esp3266 qui doit se connecter en client en wifi et pas en point d'accès.
  WiFi.begin(ssid, password); // On alnce la connexion

  while (WiFi.status() != WL_CONNECTED) { // Tant que le module n'est pas connecté, on attend
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Connexion au Wifi réussi");
  Serial.println("Votre Adresse IP : ");
  Serial.println(WiFi.localIP());
}

void loop() {
}

Scanner les points d'accès wifi

Une autre manière de voir notre réseau wifi est de scanner tout les réseaux wifi aux alentours. Pour cela on va utilisé la fonction Wifi scan network qui va permettre de faire la recherche :

/* Ce code scan les points d'accès wifi autour du module */

#include <ESP8266WiFi.h>

void setup() {
  Serial.begin(115200);

  // On met le module en mode station wifi
  WiFi.mode(WIFI_STA);

  // On deconnecte le module d'une éventuel précédente connexion
  WiFi.disconnect();
  delay(100);
}

void loop() {
  String ssid;
  int32_t rssi;
  uint8_t encryptionType;
  uint8_t* bssid;
  int32_t channel;
  bool hidden;
  int scanResult;

  Serial.println(F("Démarrage du scan Wifi..."));

  scanResult = WiFi.scanNetworks(/*async=*/false, /*hidden=*/true);

  if (scanResult == 0) {
    Serial.println(F("Pas de réseau wifi trouvé"));
  } else if (scanResult > 0) {
    Serial.printf(PSTR("%d Voici les points d'accès Wifi \n"), scanResult);

    for (int8_t i = 0; i < scanResult; i++) { // On fait une boucle pour tous les points d'accès trouvé
      WiFi.getNetworkInfo(i, ssid, encryptionType, rssi, bssid, channel, hidden);

      Serial.printf(PSTR("  %02d: [CH %02d] [%02X:%02X:%02X:%02X:%02X:%02X] %ddBm %c %c %s\n"), // On affiche les réseaux en fonction de leur syntaxe
                    i,
                    channel,
                    bssid[0], bssid[1], bssid[2],
                    bssid[3], bssid[4], bssid[5],
                    rssi,
                    (encryptionType == ENC_TYPE_NONE) ? ' ' : '*',
                    hidden ? 'H' : 'V',
                    ssid.c_str());
      yield();
    }
  } else {
    Serial.printf(PSTR("Problème avec le scan wifi %d"), scanResult);
  }

  // On attends un peu avant de re-scanner
  delay(5000);
}

Envoyer un message sur le réseau Wifi

On va maintenant voir comment se connecter à un réseau et envoyer un message dessus. On verra ensuite la réponse du réseau par rapport à notre requête :

/* Ce code permet de se connecter à un réseau wifi et d'envoyer Hello World et d'attendre la réponse */

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#ifndef STASSID
#define STASSID "your-ssid" // Nom du wifi ou vous voulez vous connecter
#define STAPSK  "your-password" // Le mot de passe du wifi
#endif

const char* ssid     = STASSID;
const char* password = STAPSK;

const char* host = "192.168.1.1";
const uint16_t port = 3000;

ESP8266WiFiMulti WiFiMulti;

void setup() {
  Serial.begin(115200); // Démarrage du moniteur série

  // On démarre la connexion Wifi
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, password);

  Serial.println();
  Serial.println();
  Serial.print("Connexion en cours... ");

  while (WiFiMulti.run() != WL_CONNECTED) { // On patiente dans que la connexion n'est pas établie
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("Connecté au Wifi");
  Serial.println("Votre adresse IP : ");
  Serial.println(WiFi.localIP());

  delay(500);
}


void loop() {
  Serial.print("connecting to ");// On se connecte maintenant pour envoyer le message
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);

  //On créer une connexion TCP
  WiFiClient client;

  if (!client.connect(host, port)) {
    Serial.println("Tentative de connexion à échouer");
    Serial.println("Attendez 5 secondes...");
    delay(5000);
    return;
  }

  // Cela va envoyer une requête au serveur
  client.println("Hello World");

  // On attend la réponse du serveur
  Serial.println("Voici la réponse du serveur : ");
  String line = client.readStringUntil('\r');
  Serial.println(line);

  Serial.println("On ferme la connexion");
  client.stop();

  Serial.println("Attendez 5 secondes...");
  delay(5000);
}

Créer un point d'accès Wifi

On va maintenant voir comment utiliser le module esp8266 comme un hôte. Il va donc prendre la place du routeur et les périphériques pourront se connecter dessus. Néanmoins il ne sera pas relié à internet. Ici le ssid et le mot de passe pour se connecter sont :

  • ssid : Arduino_Factory
  • Mot de passe  : Arduino_Factory_12!

Vous pouvez le changer à votre convenance dans le programme.

/* Créer un point d'accès Wifi*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#ifndef APSSID
#define APSSID "Arduino_Factory"
#define APPSK  "Arduino_Factory_12!"
#endif

const char *ssid = APSSID; // Le nom de votre wifi que vous voulez créer
const char *password = APPSK; // Le mot de passe de votre wifi 

ESP8266WebServer server(80);

/* Vous devez vous connecter sur  http://192.168.4.1  dans votre navigateur pour voir le point d'accès wifi */
void handleRoot() {
  server.send(200, "text/html", "<h1>Vous êtes connecté </h1>"); // On renvoie connecté sur fois que vous êtes sur la page
}

void setup() {
  delay(1000);
  Serial.begin(115200); // On ouvre le moniteur série
  Serial.println();
  Serial.print("Configuration du point d'accès wifi..."); // On configure le point d'accès wifi
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.softAP(ssid, password); // On associe le point d'accès wifi avec le login et le mot de passe 

  IPAddress myIP = WiFi.softAPIP(); // On assigne une addresse IP au point d'accès Wifi
  Serial.print("Adresse IP du point d'accès wifi : ");
  Serial.println(myIP);
}

void loop() {
}

Créer un serveur HTTP

Maintenant que l’on sait comment utiliser le module esp8266 en tant qu’hôte, nous allons créer un serveur HTTP pour y partager des informations à tous les périphériques connecté à notre réseau wifi.

Qu'est-ce qu'un serveur HTTP ?

Un serveur HTTP est une page web que l’on peut voir tapant la bonne adresse sur votre navigateur web. Ici le routeur n’est pas connecté à internet, donc vous devez taper une adresse bien spécifique pour accéder à la page hebergé par celui-ci . Cette adresse sera affiché dans le moniteur série.

Avec cette page http vous pouvez créer une application pour contrôler une led avec des boutons par exemple.

Vous allez avoir besoin de vous conencter au réseau wifi crée par le module. Voici les codes par défaut :

  • ssid : Arduino_Factory
  • Mot de passe  : Arduino_Factory_12!
/* Créer un point d'accès Wifi et initialiser un serveur web sur le esp8266 */

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#ifndef APSSID
#define APSSID "Arduino_Factory"
#define APPSK  "Arduino_Factory_12"
#endif

const char *ssid = Arduino_Factory; // Le nom de votre wifi que vous voulez créer
const char *password = Arduino_Factory_12!; // Le mot de passe de votre wifi 

ESP8266WebServer server(80);

/* Vous devez vous connecter sur  http://192.168.4.1  dans votre navigateur pour voir le point d'accès wifi */
void handleRoot() {
  server.send(200, "text/html", "<h1>Vous êtes connecté </h1>"); // On renvoie connecté sur fois que vous êtes sur la page
}

void setup() {
  delay(1000);
  Serial.begin(115200); // On ouvre le moniteur série
  Serial.println();
  Serial.print("Configuration du point d'accès wifi..."); // On configure le point d'accès wifi
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.softAP(ssid, password); // On associe le point d'accès wifi avec le login et le mot de passe 

  IPAddress myIP = WiFi.softAPIP(); // On assigne une addresse IP au point d'accès Wifi
  Serial.print("Adresse IP du point d'accès wifi : ");
  Serial.println(myIP);
  server.on("/", handleRoot);
  server.begin(); // On lance le serveur HTTP
  Serial.println("Le serveur HTTP a été lancé");
}

void loop() {
  server.handleClient();
}

Controler une led depuis une application

On va maintenant voir comment contrôler une led depuis votre téléphone grâce à l’application Blynk et le module esp8266.

Le module Wifi va jouer le rôle d’interpreteur entre le téléphone et la led. Pour cela il va falloir connecter votre téléphone et le module wifi sur le même réseau.

a) Installation de la librairie

La première chose à faire est d’installer la librairie Blynk qui va permettre la liaison entre l’application et la carte Arduino. Pour cela vous devez aller dans le manageur de librairie et taper blynk :

b) Téléverser le Programme

Une fois la librairie installée, il vous reste qu’à téléverser le programme sur votre carte Arduino. N’oubliez d’installer la librairie du module esp8266 qui se trouve dans la partie Librairie esp8266.

#define BLYNK_PRINT Serial 
#include <ESP8266WiFi.h> // Librairie du module esp8266
#include <BlynkSimpleEsp8266.h> // Librairie de l'application Blynk
char auth[] = "token_Arduino_Factory"; // Le token que l'on a mis sur blynk
char ssid[] = "nom de votre wifi";
char pass[] = "Mot de passe de votre wifi";

void setup() {
  Serial.begin(9600); // On démarre le moniteur série
  Blynk.begin(auth, ssid, pass); // On initialise la connexion avec l'application
}

void loop() {
  Blynk.run();// On lance la connexion
}

c) Installer l’application Blynk

Il vous reste ensuite à installer l’application Blynk et vous pourrez controler votre LED !

Les problèmes de téléversement

En faisant ce cours, on a voulu lister les erreurs possible de téléversement de votre programme sur le module wifi.

a) Oublier de débrancher RX/TX

Comme vous avez pu le voir sur le circuit, les bornes RX et TX de la carte arduino sont reliés au module wifi. Les deux fils qui relie le module à la carte doivent être impérativement débranché juste avant l’upload de votre programme et les rebrancher après avoir téléverser le programme.

Voici l’erreur d’erreur si on oublie de le faire :

b) Mauvais branchement  

Il se peut que vous vous êtes trompé dans les branchements,  vous obtiendrez cette erreur :

c) Oublier de télécharger la librairie ou de choisir le module

Il se peut que d’autre problèmes appraraissent, comme des problèmes de compilation de votre programme ou bien des problèmes de téléversement de celui-ci. On vous laisse regarder nos cours sur le sujet.

Pour aller plus loin...

Il existe d’autre modules permettent de contrôler la carte Arduino à distance…

On peut notamment cité le capteur bluetooth HC-05 qui permet aussi de contrôler des composants comme des LED et le moteur à courant continu à partir de notre application Arduino Factory !

module Bluetooth hc05