====== Station méteo à base d'esp8266 + raspberryPI - Partie 1 ======
{{{project
picture:{{:projets:station_meteo_esp8266:weather_node_mcu.jpg?direct&200 |}}
machines:
materiaux:
logiciels:
fichiers:
liens: \\ [[trucs_astuces:programmer_un_esp8266_avec_l_environnement_arduino_genuino]] \\ [[https://www.youtube.com/watch?v=N0YtIzGIW4k|Vidéo de description du fonctionnement d'i2c sur "Electro bidouilleur"]]
tags: BH1750 HTU21 BMP085 Node-MCU ESP8266 Météo
usager:bumblebee
licence:cc-by-sa
}}}
Réalisation d'une petite station DIY. Cette première partie décrira l'utilisation des module capteur de température, humidité, luminosité et pression avec un [[trucs_astuces:programmer_un_esp8266_avec_l_environnement_arduino_genuino|ESP8266]].
//:NOTE: Documentation en cours de rédaction//
===== Conception =====
L'idée est ici de débuter la conception d'un petit module installé à l'extérieur et captant la température, humidité, luminosité et pression a intervalles réguliers et envoyant ces information à une base (que je ne détaillerai pas ici, mais cela sera sûrement un Raspberry pi) en Wifi. Pour cela je vais utiliser un micro-contrôleur ESP8266, et pour me simplifier la vie j’utiliserai la carte Node-MCU ESP12E, pourvue de toute ce qu'il faut pour être programmée sans avoir à utiliser de composants supplémentaires.
Pour programmer mon micro-contrôleur j'utiliserai l'environnement Arduino.
J'utiliserai 3 capteurs communiquant en I2C //([[https://www.youtube.com/watch?v=N0YtIzGIW4k|liaison série adressée]])// :
* Capteur de luminosité : BH1750
* Capteur d'humidité et de température : HTU21
* Capteur de pression (baromètre) et de température : BMP085
Ces capteurs sont compatible 3.3v, tension de fonctionnement de l'ESP8266.
===== Réalisation =====
==== Environnement arduino ====
{{:projets:station_meteo_esp8266:select-board.jpg?direct&100 |Selectionner le type de carte Node MCU 1.0}}
Avant de débuter il faut installer l'envionnement arduino, et y ajouter le support de l'ESP8266 comme indiqué [[trucs_astuces:programmer_un_esp8266_avec_l_environnement_arduino_genuino#configuration_de_l_environnement_arduino|dans cet article]].
J'ai ensuite sélectionné ma carte (Node MCU 1.0 -ESP-12E Module) dans le menu outil //(cf. )//.
==== Utilisation du capteur de luminosité BH1750 ====
=== Connexions ===
{{ :projets:station_meteo_esp8266:schema-bh1750-alone.jpg?direct&300 |Connexion du BH1750}}
La connexion //(bh1750)// au node-MCU est assez simple. L'alimentation (3.3v & Masse) les deux broches i2c : nous utiliseront la broche `D5` pour SDA et `D6` pour SCL (ces broches sont configurables dans le programme). La broche ADD est mise à la masse pouer utiliser l'adresse par défaut du module.
=== Bibliothèque arduino pour piloter le capteur ===
:TODO: Détailler l'installation de la bibliothèque : https://github.com/claws/BH1750
=== Programmation ===
/*
Connexion:
VCC -> 3V3
GND -> GND
SCL -> D6
ADD -> (not connected) or GND
La broche ADD est utilisée pour configurer l'adresse I2C du capteur.
À l'état haut (connectée à VCC) l'adresse sera 0x5C.
À l'état bas (connectée à la masse)l'adresse sera 0x23 (valeur par défaut).
*/
#include
#include
BH1750 lightMeter;
void setup(){
// Initalisation de la liaison series a 9600Bauds pour envoyer les inforamtions lues
Serial.begin(9600);
// Initalisation du bus I2C sur les broches D5 et D6.
Wire.begin(D5,D6);
//Initailisation du module de capteur de lumière
lightMeter.begin();
}
void loop() {
// Lecture de la luminosite
uint16_t lux = lightMeter.readLightLevel();
//Envoi de la valeur lue sur la connection serie.
Serial.print("Light: ");
Serial.print(lux);
Serial.println(" lx");
delay(1000);
}
Compiler et téléverser le programme sur le node-MCU, puis ouvrir le moniteur série (il doit être configuré a 9600bps) pour voir les valeurs relevées par le capteur.
==== Utilisation du capteur d'humidité & température HTU21 ====
=== Connexions ===
* VCC : 3.3v
* GND : GND
* SDA : D5
* SCL : D6
=== Bibliothèque arduino pour piloter le capteur ===
:TODO: Détailler l'installation de la bibliothèque : https://github.com/adafruit/Adafruit_HTU21DF_Library
=== Programmation ===
#include
#include "Adafruit_HTU21DF.h"
/*
Connexion:
VCC -> 3V3
GND -> GND
SCL -> D6
*/
Adafruit_HTU21DF htu = Adafruit_HTU21DF();
void setup() {
Serial.begin(9600);
Serial.println("HTU21D-F test");
Wire.begin(D5,D6);
if (!htu.begin()) {
Serial.println("Couldn't find sensor!");
while (1);
}
}
void loop() {
Serial.print("Temp: "); Serial.print(htu.readTemperature());
Serial.print("\t\tHum: "); Serial.println(htu.readHumidity());
delay(500);
}
==== Utilisation du capteur de pression(baromètre) & température BMP085 ====
===Connexions===
* VCC : 3.3v
* GND : GND
* SDA : D5
* SCL : D6
=== Bibliothèque arduino pour piloter le capteur ===
:TODO: Détailler l'installation de la bibliothèque : https://github.com/adafruit/Adafruit-BMP085-Library
=== Programmation ===
#include
#include
#include
/*
Connexion:
VCC -> 3V3
GND -> GND
SCL -> D6
*/
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
/**************************************************************************/
/*
Arduino setup function (automatically called at startup)
*/
/**************************************************************************/
void setup(void)
{
Serial.begin(9600);
/* Initialisation du capteur */
Wire.begin(D5,D6);
if(!bmp.begin())
{
Serial.print("Erreur : aucun capteur BMP085 detecte");
while(1);
}
}
void loop(void)
{
/* Récupère les données (événement) du capteur */
sensors_event_t event;
bmp.getEvent(&event);
/* Affichage des resultats */
if (event.pressure)
{
/* Display atmospheric pressue in hPa */
Serial.print("Pressure: ");
Serial.print(event.pressure);
Serial.println(" hPa");
/* Affichage de la temperature */
float temperature;
bmp.getTemperature(&temperature);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
/* Calculating altitude with reasonable accuracy requires pressure *
* sea level pressure for your position at the moment the data is *
* converted, as well as the ambient temperature in degress *
* celcius. If you don't have these values, a 'generic' value of *
* 1013.25 hPa can be used (defined as SENSORS_PRESSURE_SEALEVELHPA *
* in sensors.h), but this isn't ideal and will give variable *
* results from one day to the next. *
* *
* You can usually find the current SLP value by looking at weather *
* websites or from environmental information centers near any major *
* airport. *
* *
* For example, for Paris, France you can check the current mean *
* pressure and sea level at: http://bit.ly/16Au8ol */
/* Calcul de l'altitude en fonction de la pression et de la temperature */
float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;
Serial.print("Altitude: ");
Serial.print(bmp.pressureToAltitude(seaLevelPressure,
event.pressure));
Serial.println(" m");
Serial.println("");
}
else
{
Serial.println("Sensor error");
}
delay(1000);
}