BTS Mesure BTS Mesure
Présentation2014CapteursModulationTyponsArduinoDémodulationApp InventorCourbesVidéos
 
PrésentationSimulationGSMGPSSDCapteursFinal

Le datalogging

Le datalogging est un dispositif électronique programmable qui enregistre des valeurs de mesure individuelles et des séries de mesure sur une longue période.
Les grandeurs sont automatiquement mesurées, numérisées et enregistrées sur un support (ici une carte SD).


Les grandeurs mesurées sont pour nous : température intérieure et extérieure, humidité relative (% HR), pression, intensité lumineuse, l’accélération selon 3 axes, coordonnées GPS, altitude, vitesse.

 

 

Le branchement sur une carte MEGA

Les cartes SD utilisent la liaison série SPI (pour Serial Peripheral Interface) pour communiquer avec un microcontrôleur tel que l’Arduino uno.

Le bus SPI utilise 4 signaux logiques :

·         SCLK — Serial Clock, Horloge (généré par le maître : l’Arduino  uno, patte D13)

·         MOSI — Master Output, Slave Input (généré par le maître l’Arduino  uno, patte D11)

·         MISO — Master Input, Slave Output (généré par l'esclave vers l’Arduino  uno, patte D12)

·         SS — Slave Select ou Chip Select (CS), actif à l'état bas (généré par le maître). Sur l’Arduino uno c’est la seule patte paramétrable (par ex : int chipSelect = 10;).  Pour les shields SD (carte d’extension) le CS est inscrit sur la carte en général il s’agit de D4 ou D10 (valeur par défaut).

Remarques : il peut y avoir plusieurs Chip Select si l’Arduino communique avec plusieurs périphériques en SPI.

C’est la plus rapide des liaisons séries de l’Arduino : l’horloge est à 4 MHz par défaut.

Arduino Board MOSI MISO SCK SS (slave) SS (master)
Uno or Duemilanove 11 or ICSP-4 12 or ICSP-1 13 or ICSP-3 10 -
Mega1280 or Mega2560 51 or ICSP-4 50 or ICSP-1 52 or ICSP-3 53 -
Leonardo ICSP-4 ICSP-1 ICSP-3 - -
Due ICSP-4 ICSP-1 ICSP-3 - 4, 10, 52

 

La bibliothèque

La programmation d’un lecteur de carte SD est grandement facilitée par l’usage de la bibliothèque SD et de l’exemple associé Datalogger (Fichier/Exemples/SD/Datalogger ) :

Principales fonctions utilisées, exemple :

SD class : SD.begin(cspin), SD.open(filepath, mode), SD.remove(filename)

File class : file.print(data) , file.println(data), file.close()

pinMode(chipSelect, OUTPUT);                  // Seule pinMode à déclarer dans le setup : chipSelect

    if (!SD.begin(chipSelect)){                       // Initialisation + contrôle, s’il y a un pb

             Serial.println("Erreur carte SD");      // écrire un message d’erreur

             return ;}                                            // return nous fait sortir du sous programme setup Serial.println("Carte presente");                   // Sinon l’initialisation est correcte

 

La struture du programme :

Remarque : Nous avons eu des problèmes lors de la compilation de ce programme avec la bibliothèque SD.h

Résolu en remplaçant la bibliothèque de l'IDE Arduino 1.5.8  par une plus ancienne : SD.h



/* 1) Zone 1 : les déclarations */
// 1.a) Les bibliothèques et création d'objets  
#include <SD.h>

// 1.c) Les variables globales

// Pattes Arduino
int chipSelect=53;      // chipSelect est la seule patte à déclarer : 
                        // Les autres sont déjà déclarées par la bibliothèque

/* 2) Zone 2 : Initialisation (le setup) */
void setup() { 
  pinMode(chipSelect, OUTPUT);
  digitalWrite(chipSelect,LOW);
  entete(); // Fin de l'initialisation de la carte SD + entête du fichier
}
}

/* 3) Zone 3 : le Programme Principal */
void loop() {
    ecritureSD();  
}

/* 4) Zone 4 : les sous programmes (ou fonctions) */
void entete(){                  // Exemple d'une série de mesure à stocker
  // Initialisation carte SD
  if (!SD.begin(chipSelect)) { Sdebug.println("Erreur carte SD");erreurSD=1;return;} 
  else {Sdebug.println("Carte presente");}
  
  // Format csv le séparateur de colonne est : ";"  
  File GPStab = SD.open("Mesures.csv", FILE_WRITE);
  if (GPStab) {
    GPStab.print("date"); GPStab.print(";");   
    GPStab.print("latitude"); GPStab.print(";");
    GPStab.print("longitude"); GPStab.print(";");
    GPStab.print("Altitude"); GPStab.print(";");
    GPStab.print("Vitesse"); GPStab.print(";");    
    GPStab.print("Tint"); GPStab.print(";");
    GPStab.print("Text"); GPStab.print(";");
    GPStab.print("tdht"); GPStab.print(";"); 
    GPStab.print("tBMP"); GPStab.print(";");     
    GPStab.print("tPT"); GPStab.print(";");
    GPStab.print("tCTN"); GPStab.print(";");
    GPStab.print("BMP180 P"); GPStab.print(";");
    GPStab.print("MPX5100"); GPStab.print(";");
    GPStab.print("ADXL X"); GPStab.print(";");
    GPStab.print("ADXL Y"); GPStab.print(";");
    GPStab.print("ADXL Z"); GPStab.print(";");
    GPStab.print("ADXL A"); GPStab.print(";");
    GPStab.print("BPW34 (1)"); GPStab.print(";");
    GPStab.print("BPW34 (2)"); GPStab.print(";");
    GPStab.print("DHT22 Hr"); GPStab.print(";");
    GPStab.println();
    GPStab.close();
  }
}

void ecritureSD() { 
  File GPStab = SD.open("Mesures.csv", FILE_WRITE);
  if (GPStab) {
    GPStab.print(Date); GPStab.print(";");
    GPStab.print(N,5); GPStab.print(";");
    GPStab.print(E,5); GPStab.print(";");
    GPStab.print(Alti); GPStab.print(";");
    GPStab.print(Vitesse,1); GPStab.print(";");
    GPStab.print(Tint,1); GPStab.print(";");
    GPStab.print(Text,1); GPStab.print(";");
    GPStab.print(tdht,1);GPStab.print(";");
    GPStab.print(tBMP,1);GPStab.print(";");
    GPStab.print(tPT,1); GPStab.print(";");
    GPStab.print(tCTN,1); GPStab.print(";");
    GPStab.print(Pext); GPStab.print(";");
    GPStab.print(pMPX); GPStab.print(";");   
    GPStab.print(Ax); GPStab.print(";");
    GPStab.print(Ay); GPStab.print(";");
    GPStab.print(Az); GPStab.print(";");
    GPStab.print(A); GPStab.print(";");
    GPStab.print(L1); GPStab.print(";");
    GPStab.print(L2); GPStab.print(";");
    GPStab.print(h); GPStab.print(";");
    GPStab.println();
    GPStab.close();
    erreurSD=0;
  }
  else  {
    Sdebug.println("Erreur Mesures.csv");
    erreurSD=1;
  }
}