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 présente l'utilisation de sonde de température imperméable : DS18B20.
A DeltaLab, un projet d'Aquaponie est en projet, et ces capteurs seront évidemment utilisés dès le début.
Ce projet a pour but de présenter l'utilisation de sonde DS18B20, dans le but de les intégrer dans un projet plus grand.
Le projet est composé de deux parties distinctes: la sonde et la carte Wemos associée, et le serveur Node-RED.
Les fonctionnalités sont les suivantes :
Récupération des données des capteurs
Affichage dans Node-RED
Arduino IDE : téléchargeable à www.arduino.cc/en/main/software
Node-RED : on assume que vous en avez un, sinon installez-le avec ceci.
Wemos D1 mini (vous pouvez l'achetez ici)
Shield OLED pour Wemos D1 mini (SSD1306 64x48 pixels) (vous pouvez l'achetez ici)
Câble USB-micro USB type B (vous pouvez en acheter ici)
3 jumper wires mâle-femelle (vous pouvez en acheter ici)
Sonde DS18B20
XH-adapter
Vous pouvez acheter les deux derniers en allant sur ce site.
Vous recevrez un kit comme celui-ci si vous commander sur le site ci-dessus.
Il vous suffit de brancher la sonde au récepteur.
Ensuite vous devez branchez le récepteur au Wemos. SIG --> D2
GND --> G
VCC --> 3.3V
Le circuit est extrêmement simple. Le Wemos D1, 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
Pour installer Arduino IDE, alors Google... Merci d'avoir suivi ce tuto.
Une fois installé, allez dans Fichier > Préférences et ajoutez ce lien dans URL de gestionnaire de cartes supplémentaires en cliquant sur le bouton à droite.
https://arduino.esp8266.com/stable/package_esp8266com_index.json
Ce fichier vous permettra de coder toutes les cartes équipées d'ESP8266.
Ensuite, allez dans Outils > type de carte > Gestionnaire de carte.
Et tapez esp8266 dans la barre de recherche, puis installez cette carte à la dernière version.
Toujours dans Outils, sélectionnez la carte Lolin(WEMOS) D1 R2 & mini en allant dans Type de carte > ESP8266 Boards.
Une fois fait, vous devriez voir cela dans Outils. Veuillez donc mettre les paramètres comme indiqués sur l'image.
Branchez le Wemos au PC avec votre câble USB. Et sélectionnez un port COM dans Outils puis Port.
Remarque: pour que la Wemos puisse tourner en boucle il faut qu'elle soit constamment branchée sur le courant.
ESP8266WiFi (intégré lors du téléchargement des cartes esp8266)
PubSubClient by Nick O'Leary (librairie à installer avec le gestionnaire de bibliothèque)
WiFiClient (intégré lors du téléchargement des cartes esp8266)
Adafruit GFX (librairie à installer avec le gestionnaire de bibliothèque)
Adafruit SSD1306 Wemos Mini OLED (librairie à installer avec le gestionnaire de bibliothèque)
OneWire by Paul Stroffregen (librairie à installer avec le gestionnaire de bibliothèque)
DallasTemperature by Miles Burton (librairie à installer avec le gestionnaire de bibliothèque)
Copiez-collez le code ci-dessous dans un nouveau fichier Arduino
//Bibliothèques pour la communication en WiFi
#include <SPI.h>
#include <Wire.h>
#include "PubSubClient.h"
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
//Bibliothèques pour l'écran OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//Dépendance pour le bus 1-Wire
#include <OneWire.h>
#include <DallasTemperature.h>
//Constantes de temps
static const uint32_t DELAI_1_S = 1000; // 1 seconde
static const uint32_t DELAI_1_M = 60 * DELAI_1_S; // 1 minute
static const uint32_t DELAI_1_H = 60 * DELAI_1_M; // 1 heure
//Variables pour l'écran OLED
#define OLED_RESET 0 // GPIO1
Adafruit_SSD1306 display(OLED_RESET);
// Broche du bus 1-Wire
#define BROCHE_ONEWIRE D2
// Création de l'objet OneWire pour manipuler le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE);
DallasTemperature sensors(&ds);
DeviceAddress insideThermometer;
//Variables pour la communication en WiFi
WiFiClient cli;
PubSubClient mqttClient(cli);
const char* ssid = "DeltaLab-Public"; // SSID du point wifi
const char* password = "Milon!Lab"; // Mot de passe du point Wifi
const char* mqttServer = "192.168.1.40"; //serveur MQTT
const int mqttPort = 1883;
void setup() {
// Initialisation du capteur
Serial.begin(115200); //Démarrage du moniteur série
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // adresse I2C pour l'écran (64x48) : 0x3C
display.display();
WiFi.hostname("TMP_METER_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);
}
mqttClient.setServer(mqttServer,mqttPort);
//Serial.println("Hello");
sensors.begin(); //Activation du capteur
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
// affiche les adresses des capteurs trouvés
Serial.print("Device 0 Address: ");
printAddress(insideThermometer);
Serial.println();
// Paramètrage de la résolution à 9 bits
sensors.setResolution(insideThermometer, 9);
Serial.print("Device 0 Resolution: ");
Serial.print(sensors.getResolution(insideThermometer), DEC);
Serial.println();
}
//Boucle automatique
void loop() {
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
float* tmp;
tmp = (float*)malloc(sizeof(float));
*tmp = getTemperature(insideThermometer); //Récupère la donnée de température
//Affichage des données sur l'écran
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Temperature: ");
display.print(*tmp);
display.println(" °C");
display.display();
//Donneés pour MQTT
String contenu = "";
contenu += *tmp;
char payload[11];
unsigned int len = contenu.length()+1;
contenu.toCharArray(payload,len);
//Envoi sur MQTT
if(mqttClient.connect("TMP_METER_MQTT")){
//Serial.println(payload);
mqttClient.publish("tmp",payload);
mqttClient.loop();
}
delete tmp;
delay(5 * DELAI_1_S);
}
//Retourne la donnée de température
float getTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if(tempC == DEVICE_DISCONNECTED_C) // Message d'erreur si la sonde n'est pas connectée
{
Serial.println("Error: Could not read temperature data");
return -127.00;
}
Serial.print("Temp C: ");
Serial.println(tempC);
return tempC;
}
// Affiche l'adresse du capteur
void printAddress(DeviceAddress deviceAddress)
{
for (uint8_t i = 0; i < 8; i++)
{
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
Après que le Wemos ait reçu les données de la sonde, on cherche à les mettre sous forme de graphique.
Le Wemos envoie donc les données en WiFi vers un broker MQTT.
On utilise Node-RED pour récupérer les données envoyées au broker et ainsi nous pouvons jouer avec les données de la sonde.
Les données sont récupérées par les nodes de dashboard qui permettent de les afficher : des jauges pour la pression, l'humidité et la température, ainsi qu'un graphe pour l'évolution de ces deux dernières.
Chaque fois que vous finissez de configurer un node, cliquez sur Done.
ATTENTION : pour enregistrer vos modifications, cliquez sur Deploy.
MQTT in
MQTT in
Serveur local : add new mqtt-broker, puis cliquez sur le crayon à droite
Server : localhost
Port : 1883
QoS : 2
Topic : tmp
Function
Copiez-collez ceci dans la fonction:
var tmp = parseFloat(msg.payload);
var newMsg = { payload:tmp, topic: msg.topic };
return newMsg;
Gauge
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 de l'eau
Value format:
Température : {{msg.payload.toFixed(2)}}
Echelle:
Température: 0 à 45, unité : °C
Chart
Group: le même que celui des gauges
Type: line chart
Label : Température de l'aquarium
axe Y: min = 0 , max = 45
Cochez la case enlarge points
Réglez le nombre de points max ou la durée représentée comme vous le souhaitez
Debug
N'hésitez pas à connectez des nodes de debug, cela permet de savoir si vos données arrive bien et au bon format.
Pour voir les données là où vous avez connecté des debug, cliquez sur le petit insecte en haut à droite de l'écran, puis all nodes puis current flow pour voir le flux du flow sur lequel vous travaillez.
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.