vendredi 17 mars 2017

Mise en oeuvre du module ESP8266-12E

Bonjour!
Vous brulez d'envie d'acheter un de ces petit module sur AliExpress...
 Wemos D1 R2 rev2 ESP8266-EX compatible Uno R3 Arduino ESP-12E 80MHZ 160Mhz 4M
Hé bien, bon courage!!!


Le "vrai" nom de ce module est " ESP8266-12E".


Ma configuration de base:
-Windows XP Pro et/ou  Lubuntu 14
-Logiciel Arduino version 1.6.12

Ce tuto s'inspire beaucoup de l'excellent tuto de "Jainrk"édité sur Instructable.com.
En effet, ce Monsieur donne dans ces exemples beaucoup de mots-clés qui fonctionnent, contrairement a d'autres sites...
Je vous confirme que c'est un vrai casse tête pour trouver ce qui peut fonctionner correctement sur cette carte et que même l'agencement des pins-programme et pins-carte ne sont pas les mêmes!

Première déception:
Si vous raccordez votre module a votre PC, vous vous rendrez compte qu'il n'est pas reconnu par les traditionnels ports COM...
(pas de problemes apparents sous Lubuntu...)
Il va falloir télécharger un driver USB-Com spécial nommé “CP1201 USB to UART drivers”.

Jainrk propose celui-ci:
 http://www.chinstruments.com/USB_416.shtml

Pour ma part, j'ai téléchargé et installé celui de Wemos:
 https://www.wemos.cc/downloads/CH341SER_win.zip

Mon module, une fois connecté, a été reconnu sur le port COM5, mais sur votre PC, ce peut être sur un port différent.
Pour lire les infos de base sur le moniteur série de l'Arduino, il faut paramétrer a 74880bauds.
(bizarre, pour un truc qui envoie ses datas a 115200 bauds...)

Pour que votre module soit programmable avec l'IDE Arduino, il va falloir installer de nouvelles librairies.
Ouvrir le logiciel Arduino, aller dans "préférences",
puis dans "URL de gestionnaire de cartes supplémentaires", copier-coller cette URL:
 http://arduino.esp8266.com/stable/package_esp8266com_index.json
Cette adresse va donc aller chercher "toute" les librairies nécessaires pour pouvoir programmer votre carte et vous installer pleins de cartes et de choses inutiles...

 Ensuite, il faut ouvrir "Outils | Type de carte | Gestionnaire de cartes ".
Quelque part plus-bas vous verrez l'entrée "esp8266 de Communauté ESP8266"
Sélectionnez la. ( cliquez sur "more info")
Cliquez alors sur le bouton Installer. Attendez un moment ... Ce processus prendra un certain temps à télécharger et à terminer.
Après l'installation, fermer le programme Arduino et le redémarrer.

Votre carte sera donc nommée:
NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)

Il va surement vous manquer, comme moi, une saleté de petit fichier, nommé
cxxabi_tweaks.h, qui devrait se trouver dans le répertoire:
C:\documents and settings\self\local settings\application data\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits
qui empêchera même le skelch le plus simple d'être compilé!
Il va falloir télécharger ce petit fichier et le placer dans le dossier "bits".

Voici le code Arduino de base pour tester votre module. Il doit fonctionner, sinon, ce n'est pas la peine d'aller plus loin... (erreur de carte...?):


#include <ESP8266WiFi.h>

WiFiServer server(80); //Initialise le serveur sur le Port 80

void setup() {

WiFi.mode(WIFI_AP); //Votre ESP8266-12E est configuré en AccessPoint
WiFi.softAP("MonServeuraMoi", "12345678"); // Indiquer ici le (SSID, password); .
server.begin(); // Démarre le serveur HTTP

}

void loop() { }

Pour l'instant, le module ne fait rien, puisque la boucle Loop est vide, mais vous pouvez déjà détecter la présence active du circuit en scannant le réseau wifi avec votre mobile, une tablette...(portée: environ 80 mètres...)

Voici un nouveau programme qui vous renvoie des données lues par le module. J'ai dû récupérer par-ci, par-là des morceaux de codes...

#include <ESP8266WiFi.h>

WiFiServer server(80); //Initialise le serveur sur le Port 80

void setup() {

WiFi.mode(WIFI_AP); //Votre ESP8266-12E est configuré en AccessPoint
WiFi.softAP("MonServeuraMoi", "12345678"); // Indiquer ici le (SSID, password); .
server.begin(); // Démarre le serveur HTTP
printWifiStatus();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  //La page html est rafraichit toute les 5 secondes.
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");     
          }
          client.println("</html>");
           break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
  
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}
void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Pour ma part, je l'ai testé ensuite, en indiquant dans le navigateur de mon mobile l'adresse 192.168.2.1
Mon module est passé derniérement en  192.168.4.1 .... cause d'un DHCP??

 ATTENTION ! Les pins ne correpondent pas a ceux d'une carte Arduino Uno!
- Certains pins sont en doublons, voire en triplons...
- Quand on solicite le pin (D4) en programme, c'est le pin (D9) qui est actif sur la carte...
En fabriquant le montage suivant, vous pourrez voir les variations de la tension sur A0.
ATTENTION: Prendre entre la broche 3,3 Volts et GND et non pas sur 5Volts!
Le résultat sera sous forme. 0.....1023.


Cela signifie que si vous devez mesurer des tensions supérieures a 3,3Volts, il vous faudra utiliser un diviseur de tension simple constitué d'un potentiomètre ou deux résistances...
Pour notre part, par exemple, nous aurons a brancher un capteur de particules fines Siemens qui envoie ses résultats sous forme analogique de 0 à 5V.

Un autre programme qui active un servo à droite ou a gauche par le biais d'une page HTML affichée sur un mobile...
#include <ESP8266WiFi.h>
#include <Servo.h>  
Servo servoRoue;   // Nom du servo qui gère la roue

WiFiServer server(80); //Initialize the server on Port 80

void setup() {
  
   servoRoue.attach(D4); // mettre fil orange servo sur pin TX1/D9 du wemos D1 !!!

WiFi.mode(WIFI_AP); //Our ESP8266-12E is an AccessPoint
WiFi.softAP("Roue_Code", "12345678"); // Provide the (SSID, password); .
server.begin(); // Start the HTTP Server

Serial.begin(115200); //Start communication between the ESP8266-12E and the monitor window
IPAddress HTTPS_ServerIP= WiFi.softAPIP(); // Obtain the IP of the Server
Serial.print("IP du serveur: "); // Print the IP to the monitor window
Serial.println(HTTPS_ServerIP);

}

void loop() { 
  WiFiClient client = server.available();
if (!client) {
return;
}

Serial.println("Quelqu'un est connecté!!   :)");

// Lis ce que le navigateur a envoyé dans une classe String et imprime la demande au moniteur.
//String Requette = client.readString();
String Requette = client.readStringUntil('\r'); 
Serial.println(Requette);

//Le navigateur envoie une requête GET au serveur. 
//Avis "/ PARAM" suite à la demande GET.
//Sur tout le texte envoyé, nous ne sommes intéressés que par la première ligne de la demande.
//Ainsi nous remplaçons le code
//String Requette = client.readString();
//par :
//String Requette = client.readStringUntil('\r'); 
 if ( Requette.indexOf("/GAUCHE") != -1)
{
  Serial.println("SIGNAL ROTATION ROUE A GAUCHE!!");
  servoRoue.write(70);
}
if ( Requette.indexOf("/DROITE") != -1 )
{
  Serial.println("SIGNAL ROTATION ROUE A DROITE!!");
   servoRoue.write(140);
}
//----------------------------Preparation page html--------------------------
String pageWeb = "<!DOCTYPE HTML>\r\n";
  pageWeb += "<html>\r\n";
  pageWeb += "<center>";    //On ouvre la balise qui va centrer les boutons
  pageWeb += "<h1 style=\"font-size:300%;\"\> Roue Codee";
  pageWeb += "<style type=\"text/css\">  body { color: #212121; background-color: #CC0C59 } </style>";
  pageWeb += "</h1>";
  pageWeb += "<br>"; //aller à la ligne
  pageWeb += "<br>"; //aller à la ligne
  pageWeb += "<a href=\"/DROITE\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Droite </button></a>\r\n";
  pageWeb += "<a href=\"/GAUCHE\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Gauche </button></a><br />\r\n";
  pageWeb += "</center>"; // tout est centré sur la page
  pageWeb += "</html>\n"; //Fin de la page Web


client.flush(); //nettoie le tampon...
client.print(pageWeb); // Send the response to the client
delay(100);
Serial.println("Client disonnected"); //Looking under the hood
}



Bon tests!
Note: La valeur du bouton, quand il est cliqué, est transmis automatiquement dans la requette comme, par exemple "192.169.4.1/DROITE"
La fonction Arduino "indexOf" recherche si la chaine "/DROITE" ou la chaine "/GAUCHE" se trouve dans la chaine d'URL.
Si la sous-chaine n'est pas trouvé, la fonction retourne "-1".
Le pin ou brancher la commande du servo n'est pas celui qu'on croit!
Attention aux caractéres d'échappement dans la construction de la page web: une erreur, et votre navigateur considérera votre page comme un fichier a télécharger et n'affichera donc jamais votre page!...



6 commentaires:

  1. Bonjour,
    Très bon tuto, mais je n'arrive pas à voir mon wifi sur mon téléphone ou sur mon PC.
    Merci de mon donner plus d'info car je suis bloqué
    Cordialement
    Antoine

    RépondreSupprimer
    Réponses
    1. Bonjour Antoine.
      normalement, si tu es bien parvenu a entrer le premier bout de code sans encombres dans la bête, tu devrais le détecter facilement en scannant le wifi alentour...
      Bon courage

      Supprimer
  2. Merci pour ta rapidité et ta réponse.
    Comment changer l'adresse IP (Je débute dans ce domaine)
    Merci
    Cdlt

    RépondreSupprimer
    Réponses
    1. L'adresse de base 192.168.2.1 est un peu une adresse "passe partout" qui sert a configurer box et routeurs...(regarde sur internet)
      Pour changer ou fixer une adresse IP dans la Wemos, je ne sais pas si il y a des fonctions toutes prêtes ou si il faut modifier carrément des choses dans les fichiers de config (fichiers .h)avant de téléverser le programme dans le circuit...
      Nous, on a l'intention de fabriquer un relai wifi qui collecte des données d'un capteur de particules fines... en autre, dans nos nombreux projets qui aboutissent rarement. Mais on s'en fout;on s'amuse!
      (Fablab PCLight, Cheny 89 )

      Supprimer
  3. BSR et merci ce tuto va beaucoup m'aider car je debute aussi dans le domaine et j'aimerais m'amuser dans la domotique, du genre allumer et eteindre une lampe a partir de mon telephone

    RépondreSupprimer
  4. Ce commentaire a été supprimé par un administrateur du blog.

    RépondreSupprimer