Station météo de base

meteo.resizedDans ce projet (en développement), nous voulons recueillir des données météo avec notre carte Arduino UNO. Nous avons les capteurs suivants : BMP180 (pression atmosphérique et température), DHT11 (ou DHT22 pour les températures sous 0°C) (humidité relative et température), intensité lumineuse. Nous écrivons les données sur une carte SD.

Note : Il est possible d’ajouter des capteurs, comme une sonde de pluie, anémomètre, orientation du vent (boussole). Mais à chaque sonde ajoutée, le projet se complique légèrement. Mais on peut comparer plus de données (investigation scientifique).

Le matériel

Voici la liste du matériel utilisé dans le projet. Voir ce document pour des liens vers des suggestions d’achat.

  • Carte Arduino UNO
  • Blindage carte SD
  • Blindage platine d’expérimentation
  • Piles 3,7 V + bloc piles
  • Interrupteur
  • Fiche mâle 9 V
  • Capteur : BMP180, DHT11 ou DHT22 (mesure de température moins bonne que BMP180), intensité lumineuse
  • DEL rouge
  • Panneaux solaires (Ne pas utiliser avec les piles 3,7 V au Lithium ion, risque de surcharge et d’explosion)
  • Cabane d’oiseau (pour accueillir le matériel) réalisée par ma fille

Photo du matériel de base (cliquer sur image pour agrandir).

meteo_materiel_base.resized

Le montage

Voici les connexions pour les capteurs. Voir les différentes pages en lien avec les capteurs traités individuellement pour plus de détails.

Capteur BMP180 Carte UNO
VIN 3,3V
GND GND
SCL SCL ou A5
SDA SDA ou A4

 

Capteur DHT11 Carte UNO
VCC 5V
Data D 3
GND GND

 

Intensité lumineuse Carte UNO
GND
S A0
centre 5V

meteo_connexion

meteo_interieur

meteo_exterieur

La programmation

Nous avons «assemblé» les programmes déjà documentés pour la gestion des diverses sondes. Voici notre version en test (3 juin 2016).

/*Projet station météo de base
Voir les liens pour plus de détails sur chaque partie du projet
Écrire des données sur une carte SD
Pression atmosphérique
Capteur humidité et température ambiante
Intensité lumineuse et distance
RÉCIT MST 2016, version du 3 juin 2016 */ //Capteur BMP180 - pression et température #include <Wire.h> #include <BMP180.h> // création objet BMP180 barometer; //Capteur DHT11 - humidité relative et température #include <dht.h> #define dht_apin 3 // Capteur connecté à la borne numérique 3 dht DHT; //Carte SD et horloge #include <SPI.h> #include <SD.h> File fichierSD; #include "RTClib.h" RTC_DS1307 rtc; //Capteur intensité lumineuse. ATTENTION, plus la valeur du capteur est grande, moins l'intensité lumineuse est grande. #define int_lum A0 #define del_rouge 4 #define duree 600000 //durée entre les mesures en ms, ici 10 min void setup() { // Démarrage de la communication avec le moniteur série Serial.begin(57600); //Pour le capteur DHT11=============================== pinMode(dht_apin, INPUT); //Pour capteur intensité lumineuse pinMode(int_lum, INPUT); //Pour DEL rouge pinMode(del_rouge,OUTPUT); //Initialisation de l'instance de la carte SD=================== if(!SD.begin(10)) { //pour la broche utilisée par votre carte voir http://www.worldofgz.com/electronique/ecrire-et-lire-des-donnees-sur-une-carte-sd/ Serial.println(F("Initialisation impossible !")); digitalWrite(del_rouge,HIGH);//DEL rouge pour problème return; } else { Serial.println(F("Initialisation OK")); } delay(500);//On donne du temps pour démarrer // Démarrage de la communication I2C avec le capteur BMP180=============== Wire.begin(); // on démarre la fonction de lecture du baromètre barometer = BMP180(); // vérification si le capteur est présent et fonctionnel if(barometer.EnsureConnected()) { Serial.println("Connection au BMP180 OK."); // Envoyer sur le moniteur série // Lorsque connecté, on réinitialise (reset) le capteur barometer.SoftReset(); // On initialise le capteur barometer.Initialize(); } else { Serial.println("Pas de capteur."); digitalWrite(del_rouge,HIGH);//DEL rouge pour problème } } void loop() { // Lecture des capteurs. long currentPressure = barometer.GetPressure(); float currentTemperature = barometer.GetTemperature(); DHT.read11(dht_apin); moniteur();//on envoie les données sur moniteur série pour vérifier si ça fonctionne //Écrire sur carte SD //Ouverture du fichier fichierSD = SD.open("meteo.txt", FILE_WRITE); //Test pour écriture if(fichierSD) { Serial.println(F("Ecriture en cours")); //Ecriture : maintenant();//fonction qui écrit la date et heure de la prise de donnée fichierSD.print(',');//séparateur fichierSD.print(currentPressure); fichierSD.print(',');//séparateur fichierSD.print(currentTemperature); fichierSD.print(',');//séparateur fichierSD.print(DHT.humidity); fichierSD.print(',');//séparateur fichierSD.print(DHT.temperature); fichierSD.print(',');//séparateur fichierSD.println(analogRead(int_lum)); fichierSD.close(); } else { digitalWrite(del_rouge,HIGH);//DEL rouge pour problème } delay(duree); // Attendre «duree» avant prochaine lecture. } //Fonction qui écrit la date et l'heure dans le fichierSD=== void maintenant() { DateTime now = rtc.now(); fichierSD.print(now.year(), DEC); fichierSD.print('/'); fichierSD.print(now.month(), DEC); fichierSD.print('/'); fichierSD.print(now.day(), DEC); fichierSD.print(' '); fichierSD.print(now.hour(), DEC); fichierSD.print(':'); fichierSD.print(now.minute(), DEC); fichierSD.print(':'); fichierSD.print(now.second(), DEC); } //Fonction pour envoyer données sur moniteur série, test void moniteur(){ // Lecture des capteurs. long currentPressure = barometer.GetPressure(); float currentTemperature = barometer.GetTemperature(); DHT.read11(dht_apin); // Envoyer la pression au moniteur série Serial.print("Pression: "); Serial.print(currentPressure); Serial.print(" Pa"); // Envoyer la température au moniteur série Serial.print("\tTemperature: "); // \t fait une tabulation Serial.print(currentTemperature); Serial.print("°C"); //Sonde DHT11 Serial.print("\tHumidité = "); Serial.print(DHT.humidity); Serial.print("% "); Serial.print("\tTempérature 2 = ");//deux capteurs nous donne une température Serial.print(DHT.temperature); Serial.print("°C "); //sonde intensité lumineuse Serial.print("\tIntensité lumineuse = "); Serial.print(analogRead(int_lum)); Serial.println(); // Démarrer une nouvelle ligne. }

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *