Fabriquer un objet connecté

De Wikidebrouillard.

Nous avons suivi le MOOC de l'institut Mines Telecom sur la plateforme FUN (France Université Numérique) qui s'intitule "Fabriquer un objet connecté".

Il s'agit de Fabriquer un objet, Nelson, qu'on connectera à internet en Wifi.

Nelson a été inventé par Maxime Castelli.

Sommaire

Matériel

  • Module NodeMCU ESP12E Amica (une sorte d'Arduino avec le Wifi intégré).
  • Mini platine de prototypage (170 trous 4,5×3,5 cm).
  • Câbles de prototypages (mâle/mâle.
  • Mini servomoteur à retour d'information (Adafruit/Batan S1123).
  • Câble USB/micro USB.
  • Chargeur de smartphone à prise USB.

Le Nelson à imprimer en 3D !

Attention deux pièces nécessitent un réglage particulier !!

  • nelson_bottom.stl
  • nelson_top.stl

En effet, sans ce réglage la pièce est mal imprimée !

Régler avec Cura : Choisir la configuration experte : Menu Expert -> Configuration experte, une fenêtre s'ouvre.

Décocher "Combiner l'ensemble (option A)".

Téléchargez les pièces du Nelson sur Thingiverse.

Configurer le logiciel Arduino pour qu'il reconnaisse le Module "NodeMCU ESP12E Amica".

Allumez le logiciel Arduino.

Allez dans le menu Arduino -> Préférence, une fenêtre s'ouvre.

Dans le champ "URL de gestionnaire de cartes supplémentaires" copiez-collez l'URL suivante : http://arduino.esp8266.com/stable/package_esp8266com_index.json

premier test avec le servo et le module

pb de driver !! les drivers CP210x USB to UART Bridge VCP

Connecter le module au réseau Wifi

D'abord, se connecter au wifi !

On utilise le programme présent dans les exemples de la librairie ESP8266 : Menu Fichier -> Exemples -> ESP8266WiFi -> WiFiScan

/*
 *  Ce programme montre comment scanner les réseaux wifi autour de vous. 
 *  C'est à peut près la même qu'avec la bibliothèque d'un Shield WiFi, 
 *  Le principale différence est l'inclusion de ce fichier :
 */
#include "ESP8266WiFi.h"

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

  // Met le wifi en attente (en mode station) et le déconnecte de tout réseau auquel il auurait pu être connecté
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Paramétrage effectué");
}

void loop() {
  Serial.println("Début du scan");

  // WiFi.scanNetworks renvoie le nombre de réseau wifi trouvé
  int n = WiFi.scanNetworks();
  Serial.println("Scan terminé");
  if (n == 0)
    Serial.println("Aucun réseau trouvé");
  else
  {
    Serial.print(n);
    Serial.println(" réseaux trouvés");
    for (int i = 0; i < n; ++i)
    {
      // renvoie sur le moniteur le SSID et le RSSI (force du réseau) pour chaque réseau trouvé
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
      delay(10);
    }
  }
  Serial.println("");

  // attend 5 secondes et scanne à nouveau
  delay(5000);
}

Utilisation du programme WiFiClient_simple.ino

/*

 *
 */

#include <ESP8266WiFi.h>

const char* ssid     = "nom-de-votre-réseau";        // Nom du réseau
const char* password = "Clé";        // clé 


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

  // We start by connecting to a WiFi network

  Serial.print("Connexion au WiFi ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);    // On se connecte
  
  while (WiFi.status() != WL_CONNECTED) { // On attend
    delay(500);
    Serial.print(".");
  }

  Serial.println("");  // on affiche les paramètres 
  Serial.println("WiFi connecté");  
  Serial.print("Adresse IP du module EPC: ");  
  Serial.println(WiFi.localIP());
  Serial.print("Adresse IP de la box : ");
  Serial.println(WiFi.gatewayIP());
}


void loop() {
 
}

Programme WiFiClient-compteur.ino


/*
 * Progtrame Client-Copteur du MOOC MinesTelecom "Fabriquer un objet connecté"
 */
 
 #include <ESP8266WiFi.h>

const char* ssid     = "nom-de-votre-réseau";        // Nom du réseau
const char* password = "Clé";        // clé 

// valeurs pour le serveur Web
const char* host     = "api.tom.tools";

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

  // On commence par se connecter au réseau Wifi

  Serial.print("Connexion au WiFi ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);    // On se connecte
  
  while (WiFi.status() != WL_CONNECTED) { // On attend
    delay(500);
    Serial.print(".");
  }

  Serial.println("");  // on affiche les paramètres 
  Serial.println("WiFi connecté");  
  Serial.print("Adresse IP du module EPC: ");  
  Serial.println(WiFi.localIP());
  Serial.print("Adresse IP de la box : ");
  Serial.println(WiFi.gatewayIP());
}


void loop() {
  Serial.print("Connexion au serveur : ");
  Serial.println(host);
  
  // On se place dans le rôle du client en utilisant WifiClient
  WiFiClient client;

  // le serveur Web attend tradionnellement sur le port 80
  const int httpPort = 80;

  // Si la connexio échoue ca sera pour la prochaine fois
  if (!client.connect(host, httpPort)) {
    Serial.println("la connexion a raté");
    return;
  }

  
  // La connexion a réussie on forme le chemin 
  String url = String("/hits/");
  
  Serial.print("demande URL: ");
  Serial.println(url);
  
  // On l'envoie au serveur sur plusieurs lignes
  // GET /compteur.php HTTP/1.1
  // Hosts: outils.plido.net
  // Connection: close
  // 
  // La première ligne précise à  la fin version du protocole attendu
  // La deuxième rappelle au serveur sous quel nom on l'appelle, en
  // effet, à  une même adresse IP on peut avoire différents serveurs
  // repondant à  des noms différents.
  // La troisième ligne indique que le serveur doit fermer la 
  // connexion apres la réponse et ne pas attendre d'autres requêtes.
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");

  // On attend 10 mili-secondes
  delay(1000);
  
  // On lit les données reçues, s'il y en a
  while(client.available()){
    String line = client.readStringUntil('\r'); // découpe ligne par ligne
    Serial.print(line);
  }

   // plus de données
  Serial.println();
  Serial.println("connexion fermée");

  delay(30000);
}

Interroger un serveur sur le web ?

WiFiTemperature.ino qui va interroger le serveur openweathermap.org :

#include <ESP8266WiFi.h>

// valeurs pour le WiFi
const char* ssid     = "toto";
const char* password = "clé";

// valeurs pour le serveur Web
const char* host     = "api.openweathermap.org";
const char* apikey   = "votre clé API (apikey)";
const char* town     = "Rennes,fr"; 

String keyword = String("\"temp\":"); //chaîne que l'on recherche dans le JSON
void setup() {
  Serial.begin(115200);
  delay(10);

  // On se connecte au wifi comme d'habitude

  Serial.print("Connexion au WiFi ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);    // On se connecte
  
  while (WiFi.status() != WL_CONNECTED) { // On attend
    delay(500);
    Serial.print(".");
  }

  Serial.println("");  // on affiche les paramètres 
  Serial.println("WiFi connecté");  
  Serial.print("Adresse IP du module EPC: ");  
  Serial.println(WiFi.localIP());
  Serial.print("Adresse IP de la box : ");
  Serial.println(WiFi.gatewayIP());
}


// drapeau indiquant pendant l'analyse de la réponse du serveur
// si on est dans l'en-tête HTTP (false) ou dans le contenu de 
// la ressource.
bool inBody = false;


void loop() {
  float temperature = 0; /* lue du fichier JSON reçu */

  Serial.print("Connexion au serveur : ");
  Serial.println(host);
  
  // On se place dans le rôle du  client en utilisant WifiClient
  WiFiClient client;

  // le serveur Web attend traditionnellement sur le port 80
  const int httpPort = 80;

  // Si la connexion échoue ça sera pour la prochaine fois
  if (!client.connect(host, httpPort)) {
    Serial.println("La connexion a échoué");
    return;
  }

  
  // La connexion a réussie on forme le chemin 
  // URL  complexe composé du chemin et de deux 
  // questions contenant le nom de ville et l'API key
  
  String url = String("/data/2.5/weather?q=") + town + "&appid=" + apikey;
  
  Serial.print("demande URL: ");
  Serial.println(url);
  
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");

  // On attend 1 seconde
  delay(10000);
  
  inBody = false; // on est dans l'en-tête
  
  // On lit les données reçues, s'il y en a
  while(client.available()){
    String line = client.readStringUntil('\r');
        
    if (line.length() == 1) inBody = true; /* passer l'en-tête jusqu'à une ligne vide */
    if (inBody) {  // ligne du corps du message, on cherche le mot clé
       int pos = line.indexOf(keyword);

      if (pos > 0) { /* mot clé trouvé */
       // indexOf donne la position du début du mot clé, en ajoutant sa longueur
       // on se place à la fin.
       pos += keyword.length(); 

       Serial.println (&line[pos]);

       temperature = atof(&line[pos]); 

     } /* fin récupération du flottant */
    } /* fin de la recherche du mot clé */
  } /* fin de la recherche de données */
  
  Serial.println();Serial.print ("Temperature = "); Serial.println(temperature-273.15); // temp en Kelvin

  Serial.println("connexion fermée");

  delay(120000); // 2 minutes
}

Pour aller chercher les infos sur le serveur Tom

Regarder, comprendre, tester, comprendre cette vidéo et la traduire !

Attention il y a une faute de casse (la casse c'est le fait d'être en majuscule ou minuscule) sur la fonction " charAt() " (Explication ici https://www.arduino.cc/en/Reference/StringObject).

https://www.youtube.com/watch?v=kVDsZQouwjo

Visualiser les données

La vidéo https://www.youtube.com/watch?v=0MQFSnauyxI

Le chapitre 4 du MOOC https://www.fun-mooc.fr/courses/MinesTelecom/04018/session01/courseware/cc5bd09b56eb4363b714080169a2dab2/434d85673c7f4e6f9fc9ec744283e795/

La carte des Nelsons

http://api.tom.tools/nelsons/

Portail des ExplorateursWikidébrouillardLéon DitFLOGPhoto mystèreJ'ai FaitPortraitsAnnuaire
AR

Fabriquer un objet connecté

Rechercher

Page Discussion Historique
Powered by MediaWiki
Creative Commons - Paternite Partage a l

© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique