DeltaLab est une association ‘loi 1901’ d’intérêt général, dont l’objectif est la création d’un espace dédié à l’innovation, à la production numérique au prototypage et à l’«expression artistique».
Le principe fondateur de l’association est d’apprendre à faire soi-même, pour passer de l’idée à l’objet.
Deltalab se spécialise en Objets Connectés, et est en train de créer un vaste «écosystème numérique» entre Drôme et Vaucluse, pour répondre à des besoins non couverts, mettre à disposition ressources et équipements pour usage professionnels et instaurer des partenariats avec les autres structures et initiatives numériques existantes.
Deltalab est aussi un FabLab (Fabrication Laboratory / Laboratoire de Fabrication ), un tiers-lieu de type makerspace où se trouve un atelier qui dispose de machines de fabrication comme des Imprimantes 3D ou des découpeuses Laser.
Deltalab se veut ouvert à tous publics : étudiants, professionnels, associations, inventeurs, designers, artistes, etc.
Ce projet est une présentation de l'utilisation de MQTT dans un exemple concret : la mise en place d'un capteur de température / humidité DHT
Ce projet peut être considéré comme une base pour réaliser une station de capteurs plus ambitieuse (CF : doc "station météo")
Ce projet présente aussi l'ajout d'un écran OLED pour afficher les données en direct.
Ce projet a pour but de présenter l'utilisation de MQTT et de la Wemos D1 en utilisant un exemple basique : un capteur SPI de température et humidité emboité sur la wemos, sur lequel s'emboitera un écran OLED
Le projet se décompose en 2 parties distinctes : le capteur SPI , l'écran OLED et la carte Wemos associée et le serveur Node-RED , ici très basique pour la présentation.
Les fonctionnalités proposées par ce projet sont les suivantes :
Récupération des données du capteur (t° , , hum%) et affichage dans Node-RED, en passant par TTN , ainsi que sur l'écran OLED
Arduino IDE : téléchargeable à www.arduino.cc/en/software
Node-RED : on assume que vous en avez un, sinon installez-le avec ceci.
Wemos : Fichier > Préférences > URL du gestionnaire de cartes. Entrez l’URL
http://arduino.esp8266.com/staging/package_esp8266com_index.json
Puis Outils > Type de Carte > Gestionnaire de cartes, rechercher ESP8266 et installer. Choisissez ensuite Wemos_D1_mini_pro comme Type de Carte.
Librairies
Librairie ESP8266WiFi : à télécharger à github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi
Puis à ajouter à Arduino (dézipper, puis dans Arduino : Croquis > Inclure une Bibliothèque > Ajouter une Bibliothèque .zip, récupérez la librairie dans le dossier libraries)
Librairie GFX : pour l'écran dans Arduino : insérer une bibliothèque > gérer les bibliothèques entrez GFX et installez la librairie Adafruit_GFX_library
Librairie SSD1306 : pour l'écran télécharger https://github.com/mcauser/Adafruit_SSD1306/tree/esp8266
Puis à ajouter à Arduino (Croquis > Inclure une Bibliothèque > Ajouter une Bibliothèque .zip)
Librairie DHT : pour le capteur dans Arduino : insérer une bibliothèque > gérer les bibliothèques entrez DHT et installez la librairie DHT_Sensor_library
Le circuit est extrêmement simple. La Wemos D1, le capteur DHT et l'écran OLED sont fixés sur des shields qui s'emboitent les uns sur les autres.
Vous devez juste les emboitez dans le bon sens , les mêmes pins les unes sur les autres (3V avec 3V, RST avec RST, etc)
Des soudures sont à prévoir pour installer les bonnes pins pour l'emboitage
ESP8266WiFi – version 1.0
PubSubClient by Nick O'Leary (librairie à installer avec le gestionnaire de bibliothèque)
WiFiClient – version 1.0
AdafruitGFX – version 1.8.4 (librairie à installer avec le gestionnaire de bibliothèque)
DHT_Sensor by Adafruit (librairie à installer avec le gestionnaire de bibliothèque)
Adafruit_SSD1036 – version 1.1.0 modifiée (librairie à installer avec le gestionnaire de bibliothèque)
Copiez-collez le code ci-dessous dans un nouveau fichier Arduino.
/*Librairies*/
#include <SPI.H>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_SSD1306.h"
#include "Adafruit_SSD1306.cpp"
#include <DHT.h>
#include "PubSubClient.h"
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
/*Constantes*/
#define OLED_RESET 0 // GPIO1
#define DHTPIN D4
#define DHTTYPE
const char* ssid = "le votre"; // le nom de votre point wifi
const char* password = "le votre"; // Mot de passe du point Wifi
const char* mqttServer = "le votre"; //serveur MQTT
const int mqttPort = 1883;
/*Variables*/
DHT11 DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(OLED_RESET);
MFRC522 mfrc522(SS_PIN, RST_PIN);
WiFiClient cli;
PubSubClient mqttClient(cli);
// Reconnexion au serveur mqtt si déconnecté
boolean reconnect() {
if (mqttClient.connect("DHT_MQTT")) {
mqttClient.loop();
}
return mqttClient.connected();
}
// SetUp : WiFi , display & DHT
void setup() {
Serial.begin(115200); //Démarrage du moniteur série
dht.begin(); //Activation du capteur
WiFi.hostname("DHT_MQTT");
WiFi.begin(ssid,password); //Démarrage de la connection WiFi
while(WiFi.status() != WL_CONNECTED){//Délai d'attente si la connexion n'est pas bonne
delay(500);
}
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //démarrage de l'écran
display.display();
mqttClient.setServer(mqttServer,mqttPort);
}
//boucle : affichage et envoi
void loop() {
// Efface l'écran et positionne le curseur dans le coin supérieur gauche
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
//lecture du capteur DHT
float h = dht.readHumidity(); //Récupère la donnée d'humidité
float t = dht.readTemperature(); //Récupère la donnée de température
if (isnan(h) || isnan(t)) { //message d'erreur si la wemos ne voit pas le capteur
Serial.println("Failed to read from DHT sensor!");
return;
}else{
Serial.print(t);
}
//Affichage sur l'écran OLED
display.println("Temp.");
display.print(t);
display.println(" c");
display.println("Humidity");
display.print(h);
display.println(" %");
display.display();
//Donneés pour MQTT
String contenu = "";
contenu += t;
contenu += "-";
contenu += h;
char payload[11];
unsigned int len = contenu.length()+1;
contenu.toCharArray(payload,len);
//Envoi sur MQTT
if(mqttClient.connect(ClientID)){
Serial.println(payload);
mqttClient.publish("DHT",payload);
mqttClient.loop();
}
delay(10000);
}
Dans Arduino, pour choisir la bonne carte, allez dans Outils > Type de carte On utilise ici une Wemos_D1_mini_pro. Vérifiez le Port et la vitesse d’écriture
Pour téléverser le code sur la carte, allez dans croquis > Téléverser, ou cliquez sur la flèche.
Le capteur envoie ses données et MQTT les récupère. Node-RED les lit ensuite grâce à la node MQTT in.
La node function permet de décoder le message et de placer les données dans des champs distincts.
Les données sont ensuite récupérées par les nodes de dashboard qui permettent de les afficher : des jauges pour l'humidité et la température , ainsi qu'un graphe pour l'évolution de cette dernière.
On peut y associer une node 'file' pour enregistrer les données dans un fichier sur le serveur, ou une node de base de données pour y enregistrer les données choisies.
Mqtt in
Prenez un node mqtt in
Serveur local : add new mqtt-broker, puis cliquez sur le crayon à droite
Server : localhost
Port : 1883
QoS : 2
Topic : DHT
Function
Copiez-collez ceci dans la section On_Message
var id = [];
id = msg.payload.split('-')
return{
payload:{
tmp:id[0],
press:id[1]
}
}
Gauges
Pour les jauges, prenez deux de ce node et connectez-les au mqtt-in et configurez-les de cette manière :
Group: créez un nouveau groupe
ui_tab : créez une nouvelle
width(largeur) : à votre guise
name : celui que vous voulez
Type: gauge
Label: température, humidité
Value format:
température: {{msg.payload.tmp.toFixed(2)}}
humidité: {{msg.payload.hum.toFixed(2)}}
Echelle:
température: -5 à 45, unité : °C
humidité: 0 à 100, unité : %
Change
Pour la température, cliquez sur add en bas à gauche de Rules.
Mettez la première règle sur Set. Entrez topic, puis tmp ou Température en-dessous.
Ajoutez une deuxième règle et mettez-la sur Move, entrez payload.tmp dans le premier champ et payload dans le deuxième.
Chart
Group: le même que celui des gauges
Type: line chart
axe Y: min = -5 , max = 100 (ou 0 / 100 - pour la beauté de la grille )
Cochez la case enlarge points
Réglez le nombre de points max ou la durée représentée comme vous le souhaitez
L'intérêt de tout ceci est pour la visualisation des données. Node-RED permet ceci avec une interface utilisateur.
Pour y accéder, avec le moteur de recherche que vous voulez, tapez l'ip du serveur Node-RED, puis deux points, puis le numéro port puis /ui (XXX.XXX.XXX.XXX:YYYY/ui).
Pour mettre en forme l'interface utilisateur, retournez dans Node-RED
Cliquez sur les trois barres en haut à droite, allez dans View puis cliquez sur Dashboard.
En mettant le curseur sur le nom du groupe des jauges et du graphe, cliquez sur layout.
Sur la droite réglez la largeur de l'interface sur Width. Ensuite cliquez sur Done, puis sur Deploy et revenez dans le layout pour faire la mise en forme. Essayez d'obtenir le résultat ci-dessous.