En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies pour assurer le bon fonctionnement de nos services.
En savoir plus

Projet ballon stratosphèrique

2- Comment utiliser des capteurs et enregistrer les valeurs mesurées ?

Par JEAN-PIERRE PONTIE, publié le dimanche 12 novembre 2017 19:11 - Mis à jour le dimanche 12 novembre 2017 20:12

 

  • Automate : carte arduino Uno de bases (un peu juste en ram, mais OK)
  • GPS : Module Ublocs NEO- 6M
    • Expérimenté: autout du collège, la mongie AR pour altitude, benac
    • Génération des fichier .gpx normalisé  https://www.gpsies.com/
    • Visualisation des traces sur open map
  • Mesure de pression, altitude, Th  2 x Capteurs bosch BME280
    • expérimentés au collège AR 3 ème étage BP
  • Mesure Température, Humidité relative : DTH11
  • Horloge RTC

Fréquence des mesures 2s (2000ms) paramètrable

Nombre de mesures 5600   temps ~3h 10mn  paramétrable

Stockage :carte SD 1GO

alimentation 5v

consommation élec mesurée : 370 mah pour 3h 20 d'activité

courant moyen

 

 


Visu fichier DataLoggerBallon.ino pour arduino

 

//======================================================================================================================
//
// -- Data logger Ballon Stratosphérique -   
//
//
//
//   Atelier sciences - Collège pyrénés novembre 2017
//   Echèance lancemmnt du ballon :  22 novembre 2017
//======================================================================================================================


//== importer les bibliothèques ======================================================================================
#include <SoftwareSerial.h>        // liaison série, comptes rendus, console...
#include "SD.h"                    // carte SD           
#include <TinyGPS++.h>             // GPS NEO 06 M
#include <Wire.h>                  // Liaison horloge, i2c
#include <SPI.h>                   // bus spi
#include <RTClib.h>                // Horloge temps réel
#include <dht11.h>                 // capteur DHT11 température, humidité
#include <SparkFunBME280.h>        // capteurs Bosch BMP208 ou BME280

//====Variables et constantes=========================================================================================
//inputs and triggers for GPS
TinyGPSPlus gps;          //gps     
SoftwareSerial ss (8, 9); // TX=8, RX=9
RTC_DS1307 RTC;    //Horloge rtc ds1307
dht11 DHT11; //capteur DHT11  - extérieur nacelle
BME280 bme280int,bme280ext;  //capteurs de pression - intérieur nacelle - exterieur nacelle

//var compteur lignes, à incrémerter à chaque intervale de mesure...
unsigned int CmpLig=0;   // pour 5600 lignes et intervale 2s,  2x 5600= 11200s, /60=> 186 mn + 40s => 3h 6mn 40s
#define NOMBRE_LIGNES 5600

#define DHT11PIN 4 // broche DATA -> broche 4

//Digital pin 4 for the SD cs line
const int chipSelect = 10; // carte Keyes
File datafile;// the logging file

//data logger timing and other
#define LOG_INTERVAL  1000 // mills between entries
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()

// debug programme par echo sur console  port série
#define ECHO_SERIE  0 // si 1 , echo des données et CR surserial port
#define ATTENTE_DEMARAGE  0 // si 1,  attente appui sur un etouche...

//===========SETUP====================================================================================================

 void setup() {
  #if ECHO_SERIE
      Serial.begin(9600);    //console
      Serial.println();
  #endif
      Wire.begin();
      ss.begin(9600);        // com GPS
      RTC.begin();
      
    #if ECHO_SERIE
      //Test horloge
      Serial.println("Contrôle Horloge ?");  
      if(! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      }// fin if
      Serial.println("Horloge OK!");
      //RTC.adjust(DateTime(__DATE__, __TIME__));    // pour mise à l'heure
      //Fin test Horloge
     #endif //ECHO_SERIE

     #if ATTENTE_DEMARAGE
        Serial.println("Appuyer sur la touche =Entrée= pour démarer :");
        while (!Serial.available());
        Serial.print("Initialisation carte SD .........  ");
     #endif //WAIT_TO_START
      // initialize the SD card
      pinMode(10, OUTPUT);    // pour selection carte
      // see if the card is present and can be initialized:
      if (!SD.begin(chipSelect)) {
        Serial.println("Carte défectueuse, ou absente ?");
        // don't do anything more:
        return;
      }
      #if ECHO_SERIE
      Serial.println("Carte initialisée !");
      // fin init carte SD
      #endif
      
      // créer un nouveau fichier .log
      char filedata[] = "DATLOG00.CSV";    // séparateur .csv : virgule
      for (uint8_t i = 0; i < 100; i++) {
        filedata[6] = i/10 + '0';
        filedata[7] = i%10 + '0';
        if (! SD.exists(filedata)) {
          // Creer  nouveaux fichiers s'il n'exitent pas
          datafile = SD.open(filedata, FILE_WRITE);   // ouvrir fichier data pour écriture
          break;  // Quitter la boucle!
        }
      }// Fin créer fichier log et ouverture fichier
      //datafile = SD.open(filedata, FILE_WRITE);   // ouvrir fichier data pour écriture
      #if ECHO_SERIE
      Serial.print("Ouverture du fichier :");
      Serial.print("\t");Serial.print(filedata);Serial.println();
      #endif
      //Ecriture en tête du fichier et titre colonnes: non pas assez de mèroire .. à revoir ?
      /*datafile.println("DATA LOOGGER - Arduino");
      datafile.println("  College PYRENEES");
      datafile.println("   65000 TARBES");
      datafile.println("----------------------");
      datafile.println();
      datafile.println("NumLig,HeureRTC,Temp,Hum,DateGPS,TimeGPS,LatGPS,LongGPS,AltiGPS(m),NbSatGPS),TempI,PressionI,HumidI,AltiI(m),TempE,PressionE,HumidE,AltiE(m)");*/
      datafile.println("N,H,T,H,J,Tg,La,Lg,Ag,Sg,Ti,Pi,Hi,Ai,Te,Pe,He,Ae");
      datafile.flush();
      #if ECHO_SERIE
        Serial.println("En tête :HeureRTC,Hum,Temp,Tempint,Pression, Humid,Alti(mDateGPS,JourGPS,TimeGPS,LatGPS,LongGPS,AltiGPS(m),NbSatGPS)");
      #endif

      //configuration des capteurs BME280
      bme280int.settings.commInterface = I2C_MODE;
      bme280int.settings.I2CAddress = 0x76;   //broche CSB=1(enl'air) i2c -broche SD0=0 adr; 0x76-
      bme280int.settings.runMode = 3;
      bme280int.settings.tStandby = 0;
      bme280int.settings.filter = 0;
      bme280int.settings.tempOverSample = 1 ;
      bme280int.settings.pressOverSample = 1;
      bme280int.settings.humidOverSample = 1;
      bme280int.begin();           // start gestion capteur
     
    } // fin setup


// ==================== Boucle du programme principal =======================================================
//    enregistrement des valeurs reçues ou mesurées

void loop() {
 
   DateTime now= RTC.now();     // capture données...
   DHT11.read(DHT11PIN);        // capure données DTH11
  #if ECHO_SERIE
     Serial.print(now.hour(), DEC);
     Serial.print(':');
     Serial.print(now.minute(), DEC);
     Serial.print(':');
     Serial.print(now.second(), DEC);
     Serial.println();
     //dth11
     Serial.print("Humidité (%): ");
     Serial.print(DHT11.humidity);
     Serial.print("\t");
     Serial.print("Température (°C): ");
     Serial.print(DHT11.temperature);
     Serial.println();
     //bme280
     Serial.print("Température: ");
     Serial.print(bme280int.readTempC(), 2);
     Serial.print(" °C");
     Serial.print("\t Pression: ");
     Serial.print(bme280int.readFloatPressure(), 2);
     Serial.print(" Pa");
     Serial.print("\t humidité relative : ");
     Serial.print(bme280int.readFloatHumidity(), 2);   //?
     Serial.print(" %");
     Serial.print("\t Altitude: ");
     Serial.print(bme280int.readFloatAltitudeMeters(), 2);
     Serial.println(" m");
   #endif //ECHO_SERIE
     //ecrire numéro de ligne
     datafile.print(CmpLig);
     datafile.print(',');
     //heure rtc
     datafile.print(now.hour(),DEC);
     datafile.print(':');
     datafile.print(now.minute(),DEC);
     datafile.print(':');
     datafile.print(now.second(),DEC);
     datafile.print(",");
     //fin rtc
     //dth11  
     datafile.print((float)DHT11.temperature, 2);
     datafile.print(",");
     datafile.print((float)DHT11.humidity,2);
     datafile.print(",");
     //fin dth11
     //gps
     while (ss.available() > 0)
     gps.encode(ss.read());
     datafile.print(gps.date.value());          // à formater
     datafile.print(",");
     datafile.print(gps.time.value());          // à formater
     datafile.print(",");
     datafile.print(gps.location.lat(), 6);     // latitude
     datafile.print(",");
     datafile.print(gps.location.lng(), 6);     //l ongitude
     datafile.print(",");
     datafile.print(gps.altitude.meters(), 6);  //altitude
     datafile.print(",");
     datafile.print(gps.satellites.value(), 6);
     datafile.print(",");
     //fin gps
     //bme280i
     datafile.print(bme280int.readTempC(), 2);
     datafile.print(",");
     datafile.print(bme280int.readFloatPressure(), 2);
     datafile.print(",");
     datafile.print(bme280int.readFloatHumidity(), 2);   //?
     datafile.print(",");
     datafile.print(bme280int.readFloatAltitudeMeters(), 2);
     //fin bme280i
     //bme280e
     datafile.print(bme280int.readTempC(), 2);
     datafile.print(",");
     datafile.print(bme280int.readFloatPressure(), 2);
     datafile.print(",");
     datafile.print(bme280int.readFloatHumidity(), 2);   //?
     datafile.print(",");
     datafile.print(bme280int.readFloatAltitudeMeters(), 2);
     //fin bme280e    
     datafile.println();
     if ((millis() - syncTime) < SYNC_INTERVAL) return;
     syncTime = millis();
     // ecriture de la ligne de donnée dans le fichier   DATLOGxx.csv  
     datafile.flush();
     // delai prochaine mesure
     smartDelay(2000);

     //====Test compteur lignes===========================================
     
     if (CmpLig++ > NOMBRE_LIGNES)
     {
      datafile.println();datafile.println();
      datafile.print(now.hour(),DEC);
      datafile.print(':');
      datafile.print(now.minute(),DEC);
      datafile.print(':');
      datafile.println(now.second(),DEC);
      datafile.println(" Arret programme ... ");
      datafile.print(">>>>   ");
      datafile.print(CmpLig,DEC);
      datafile.println("   lignes. ");
      datafile.close();          // fermer le fichier DATLOGxx.CSV
      return;                    // sortir de la boucle
     }
      
 

} //fin de loop

// This custom version of delay() ensures that the tinyGPS object
// is being "fed". From the TinyGPS++ examples.
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    // If data has come in from the GPS module
    while (ss.available())
      gps.encode(ss.read()); // Send it to the encode function
    // tinyGPS.encode(char) continues to "load" the tinGPS object with new
    // data coming in from the GPS module. As full NMEA strings begin to come in
    // the tinyGPS library will be able to start parsing them for pertinent info
  } while (millis() - start < ms);
}

 

 

 

 

Catégories
  • expériences