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 mouvement par Infrarouges.
Ce projet peut être considéré comme une base pour réaliser une installation plus ambitieuse ( batterie de capteurs qui activent divers appareils au passage,...)
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 de mouvement par Infra-rouges. Un écran OLED sera emboité par-dessus la Wemos pour afficher les données en direct.
Le projet se décompose en 2 parties distinctes : le capteur de mouvements , 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 :
Affichage de présence / mouvement détecté en direct et sur Node-RED.
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)
Le ciruit est simple. La Wemos D1 et l'écran OLED sont fixés sur des shields qui s'emboitent l'une sur l'autre.
Vous devez juste les emboitez dans le bon sens , les mêmes pins les unes sur les autres (3V avec 3V, RST avec RST, ...)
Des soudures sont à prévoir pour installer les bonnes pins pour l'emboitage.
Le capteur infrarouge utilisé ici est un capteur PIR.Il a besoin de 3 pins : + , - et donnée.
La "vis" jaune permet de régler la durée pendant laquelle le capteur reste activé après une détection. Il suffit de la tourner dans le sens horaire pour augmenter cette durée, et dans l'autre sens pour la réduire. La durée minimale est d'environ 0,3 sec , et la durée maximale peut atteindre 18 minutes.
ESP8266WiFi – version 1.0
PubSubClient by NickO'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)
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 <Adafruit_GFX.h>
#include "Adafruit_SSD1306.h"
#include "Adafruit_SSD1306.cpp"
#include "PubSubClient.h"
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
/*Constantes*/
#define OLED_RESET 0 // GPIO1
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*/
int pirPin = D7;
int val;
String id = "rdc_lab_007";
Adafruit_SSD1306 display(OLED_RESET);
WiFiClient cli;
PubSubClient mqttClient(cli);
// Reconnexion au serveur mqtt si déconnecté
boolean reconnect() {
if (mqttClient.connect("PIR_MQTT")) {
mqttClient.loop();
}
return mqttClient.connected();
}
// Initialisation du programme
void setup(){
Serial.begin(115200); //Démarrage du moniteur série
WiFi.hostname("PIR_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);
}
pinMode(pirPin, INPUT); //permet que le pin demande une petite partie de courant pour changer d'état
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //démarrage de l'écran
display.display();
mqttClient.setServer(mqttServer,mqttPort);
}
//boucle automatique
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);
val = digitalRead(pirPin);
Serial.println(val);
if(val == LOW){
display.println("RAS");
display.display();
}else{
display.println("OBJECT");
display.println("DETECTED!");
display.display();
}
//Donneés pour MQTT
String contenu = "";
contenu += id;
contenu += "-";
contenu += val;
char payload[15];
unsigned int len = contenu.length()+1;
contenu.toCharArray(payload,len);
//Envoi sur MQTT
if(mqttClient.connect("PIR_MQTT")){
Serial.println(payload);
mqttClient.publish("PIR",payload);
}
}
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 Infra-rouge PIR n'a pas besoin de librairie particulière, il fonctionne en effet comme un Switch, il suffit donc de lire la valeur de la pin à laquelle il est relié pour s'en servir.(ici D7)
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 text qui permettent de les afficher. Celle du haut affiche l'id du capteur (pour savoir lequel c'est), celle du bas affiche une icone d'alerte et un message en cas de présence détectée. Sans présence , le text du bas n'affiche rien. Il vous suffit de changer la valeur des variables label et msg dans la node function pour changer cela.
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 : relays
Function
Copiez-collez ceci dans la section On_Message
var id = [];
id = msg.payload.split('-')
var msg; var label;
if(id[1] == 1){
label = "";
msg = "Présence Détectée !";
}else{
msg = "";
label = "";
}
return {
payload:{ capt:id[0], msg:msg, label:label }
}
Text (id capteur)
Group : créez un nouveau group
ui_tab : créez une nouvelle
width (largeur) : comme vous voulez
Label : "capteur"
Value Format : {{msg.payload.capt}}
Text (message alerte)
Group : le même que pour le text précédent
Label : {{msg.payload.label}}
Value Format : {{msg.payload.msg}}
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.