====== 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); }