Tout a débuté avec un kit déniché sur le net regroupant :
- une carte NodeMCU ESP8266-12E
- un capteur de température et humidité DHT11,
- un capteur de pression atmosphérique BMP180,
- un capteur de luminosité BH1750FVI.
Ce kit revient à 15/20€. Vous pouvez le trouver ici par exemple :
Document associée au kit : guide (issu du site https://dwz.cn/H1CQANol)
L’objectif est de réaliser un système permettant de mesurer différents paramètres et de les transmettre de façon autonome sur le net.
Carte NodeMCU ESP8266-12E
La carte utilisée (dénommée NodeMCU) s’appuie sur un module ESP-12E qui intègre un microcontrôleur ESP8266. L’ESP8266 est un circuit intégré à microcontrôleur avec connexion Wi-Fi développé par le fabricant chinois Espressif.
Cette carte regroupe donc :
- un microcontrôleur ESP8266 notamment programmable avec l’IDE ARDUINO,
- un module WIFI pour communiquer avec le vaste mnde,
- une liaison série,
- des entrées/sorties.
Capteur de température et d’humidité DHT11
Capteur de pression atmosphérique et de température BMP180
Capteur de luminosité BH1750FVI
Principe de fonctionnement
- Mesure de pression, température, hygrométrie et luminosité
- Transmission en WIFI vers un site internet permettant de visualiser les données
Visualisation des données – ADAFRUIT IO
Pour visualiser les données, j’ai utilisé ADAFRUIT IO : https://io.adafruit.com/
Il s’agit d’un site web permettant de visualiser les données reçues sous la forme de jauges et graphes par exemple.
Dans sa version gratuite, vous pouvez visualiser jusqu’à 10 paramètres, envoyer jusqu’à 30 données par minute, et bénéficier du stockage de 30 jours de données.
Ce n’est pas l’idéal, notamment parce qu’il n’est pas possible de conserver l’historique au-delà de 30 jours, mais pour commencer à tester les possibilités de ce type de module, c’est parfait.
Programmation
Le kit est fourni avec une adresse web permettant de télécharger un programme et réaliser de premiers tests.
Ensuite, il est intéressant de réécrire son propre programme afin déjà de comprendre comment ça fonctionne… et également de faire exactement ce que l’on souhaite.
Le programme ci-dessous permet de :
- se connecter au réseau wifi,
- récupérer les données des différents capteurs :
- DHT11 (température / humidité) en direct sur une entrée de la carte NodeMCU
- BMP085 (pression) & BH1750FVI (luminosité) via un bus I2C géré par la carte NodeMCU
- transmettre les données sur le site ADAFRUIT IO
- à des fins de test, le programme transmet également les données sur la liaison série.
// ZapGillouMTO
// v1.0 - 05/2020
//
// DHT11 : module capteur de température et humidité
// BMP085 : module capteur de pression et température
// BH1750FVI : module capteur de luminosité
// Bibliothèques
#include "AdafruitIO_WiFi.h" // communication avec adafruit io
#include <dht.h> // capteur de temperature & humidite
#include <Adafruit_BMP085.h> // capteur de pression & temperature
#include <BH1750FVI.h> // capteur de luminosité
#include <Wire.h> // gestion bus I2C
// WIFI
#define WIFI_SSID "NOM DE VOTRE RESEAU WIFI"
#define WIFI_PASS "MOT DE PASSE DE VOTRE RESEAU WIFI"
// adafruit io
#define IO_USERNAME "NOM D'UTILISATEUR ADAFRUIT IO"
#define IO_KEY "API KEY ADAFRUIT IO"
// Pinoches ESP
#define DHT11_PIN 14 // correspond à D5 sur la carte
// Capteur de luminosite
uint8_t ADDRESSPIN = 13;
BH1750FVI::eDeviceAddress_t DEVICEADDRESS = BH1750FVI::k_DevAddress_H;
BH1750FVI::eDeviceMode_t DEVICEMODE = BH1750FVI::k_DevModeContHighRes;
// Variables
dht CAPTEUR_DHT; // capteur DHT11
Adafruit_BMP085 bmp; // capteur BMP085
BH1750FVI LightSensor(ADDRESSPIN, DEVICEADDRESS, DEVICEMODE); // capteur BH1750FVI
// Connection WIFI & IO ADRAFRUIT
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
// Création lien entre feed adafruit et variable
AdafruitIO_Feed *temperatureFeed = io.feed("Temperature");
AdafruitIO_Feed *humiditeFeed = io.feed("Humidite");
AdafruitIO_Feed *pressionFeed = io.feed("Pression");
AdafruitIO_Feed *luminositeFeed = io.feed("Luminosite");
void setup()
{
// Ouverture liaison série
Serial.begin(115200);
Serial.println("");
Serial.println("_Station Meteo ZapGillou");
// Initialisation liaison I2C
Wire.begin(0, 2); // Correspond aux broches D3/D4 sur la carte
// Connecion a Adafruit IO
io.connect();
LightSensor.begin();
Serial.print("_Capteur BMP085 : ");
// Test capteur pression BMP085
if (!bmp.begin()) {
Serial.println("NOK - BMP085 introuvable ! Verifier le branchement");
while (1) {}
}
else
{
Serial.println("OK");
}
// Attente connexion
Serial.print("_Attente connexion IO ADRAFRUIT");
while(io.status() < AIO_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println(" : OK");
}
void loop()
{
io.run();
// Capteur DHT11 - Temperature & humidite
int chk = CAPTEUR_DHT.read11(DHT11_PIN);
temperatureFeed->save(CAPTEUR_DHT.temperature);
Serial.print("_DHT11 - Temperature (°C) = "); Serial.println(CAPTEUR_DHT.temperature);
humiditeFeed->save(CAPTEUR_DHT.humidity);
Serial.print("_DHT11 - Humidite (%) = "); Serial.println(CAPTEUR_DHT.humidity);
// Capteur BMP085 - Pression & Temperature
Serial.print("_BMP085 - Pression (mbar) = "); Serial.println(bmp.readPressure()/100);
pressionFeed->save(bmp.readPressure()/100);
Serial.print("_BMP085 - Temperature (°C) = "); Serial.println(bmp.readTemperature());
// Capteur BH1750 - Luminosite
uint16_t lux = LightSensor.GetLightIntensity();
Serial.print("_BH1750 - Luminosite (lux) = "); Serial.println(lux);
luminositeFeed->save(lux);
// Tempo
Serial.println("_Tempo");
delay(10000);
}
PROTOTYPE
MONITORING SERIE
Premiers tests avec le monitoring sur la liaison série, tout fonctionne !
VISUALISATION SUR ADAFRUIT IO
Et enfin le résultat sur ADAFRUIT IO :
Prochaines étapes envisagées :
- Déport du capteur en extérieur uniquement en utilisant un capteur BME280 (capteur/pression/humidité) + mesure de la température intérieure
- Mise en place d’un Rasberry Pi pour logguer les données en local avec utilisation de Mosquitto pour le transfert de données et Grafana pour la visualisation. Ceci permettre de s’affranchir de la limite de 30 jours d’historisation sur la version gratuite de ADAFRUIT IO et de permettre un accès distant uniquement à la demande au lieu d’un envoi continu des données.