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

Les Capteurs Numériques

Un intérêt majeur de l'Arduino est de pouvoir communiquer avec les capteurs à sortie numérique.

Pour cela il faut utiliser une liaison série (Arduino en gère 3 nativement : UART, SPI, I2C).

Le capteur de pression BMP180 utilise une liaison série I2C. Pour utiliser cette liaison nous aurons besoin de la bibliothèque Wire.

Il faudra aussi installer la bibliothèque BMP180 pour communiquer avec ce capteur (cliquez sur le lien pour la télécharger).

Un exemple de programme est fourni avec la bibliothèque : Fichier/Exemples/BMP180/BMP180Example

Le capteur d'humidité et de température DHT22 utilise une liaison série one wire (un fil) propriétaire.

Pour utiliser cette liaison et  comuniquer avec ce capteur il faut aussi une bibliothèque : DHT_Capteur_Humi (cliquez sur le lien pour la télécharger)

Un exemple de programme est fourni avec la bibliothèque : Fichier/Exemples/ DHT_Capteur_Humi/DHTtester

 

Notre sous programme Mesures()

Nous avons corrigé les mesures de pression du BMP180 grâce à notre étalonnage.



/* 1) Zone 1 : les déclarations */
// 1.a) Les bibliothèques et création d'objets 
#include <Wire.h>
#include <BMP180.h>
BMP180 barometre;      // Création de l'objet baromètre

#include "DHT.h"
#define DHTPIN 12          // la sortie du DHT22 est reliée à D11 de notre Arduino
#define DHTTYPE DHT22      // DHT 22
DHT dht(DHTPIN, DHTTYPE);  // Création de l'objet dht

// 1.c) Les variables globales
// Pattes Arduino
int chipSelect=53;
int FskOff=3;                // http://www.planete-sciences.org/espace/basedoc/Arduino_en_syst%C3%A9me_de_t%C3%A9l%C3%A9mesure_type_modulation_Kiwi
int RST=2;                    // Pour éteindre la carte GSM SIM800L
int diviseur=0,PT1000=1,CTN=2;
int BPW34a=6, BPW34b=7;
int Xout=14,Yout=13,Zout=12;  // Accéléromètre
int MPX5100=15;

// Variables
float Tint,Text,Pext,tdht,tCTN,tPT,tBMP;
float Pile;
int pMPX;
int h;
int L1,L2;
int Ax,Ay,Az,A;

/* 2) Zone 2 : Initialisation (le setup) */
void setup() {
   entete();   // Pour initialiser les capteurs numériques et la carte SD
}

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

/* 4) Zone 4 : les sous programmes (ou fonctions) */
void entete(){                  // Pour utiliser Google table de fusion séparateur ;  bts.mesure@free.fr 
 
  Wire.begin();
  dht.begin();
  barometre = BMP180();
  if(barometre.EnsureConnected())
  {
    Sdebug.println("Connecte au BMP180.");
     // Une fois connecté on effectue un reset pour être sûr d'effectuer un bon démarrage
    barometre.SoftReset();
    // On initialise le capteur pour effectuer un calibrage
    barometre.Initialize();
  }
  else Sdebug.println("Pas de connexion au BMP180");
  // Suite : initialisation carte SD
  }

void Mesures(){
   // Capteurs à sortie analogique   
   tPT= analogRead(PT1000);
   tPT=0.1029*tPT-67.808;   // Etalonnage par DHT22
   tCTN= analogRead(CTN);
   tCTN=3.0627e-7*pow(tCTN,3)-4.1584e-4*pow(tCTN,2)+0.2663*tCTN-57.2;   // Etalonnage par DHT22
   Ax = analogRead(Xout)-336;  // offset 0g <-> 336 
   Ay = analogRead(Yout)-336;
   Az = analogRead(Zout)-336;
   // Calcul de la résultante
   A = sqrt(pow(Ax,2) + pow(Ay,2) + pow(Az,2)); 
  // Calcul angle
   Axy = sqrt(pow(Ax,2) + pow(Ay,2)); // Résultante plan XY
   angle = 180.0/pi * atan2(Axy,Az)+0.5;
   // Pression MPX5100 selon étalonnage
   pMPX=1.1111*analogRead(MPX5100)+129.1;
   // Capteurs luminosité
   L1= analogRead(BPW34a);
   L2= analogRead(BPW34b);
   Pile=(analogRead(diviseur)*15.0)/1024.0 + 0.8;
   
  // Capteurs Numériques :
  tdht = dht.readTemperature();
  h = dht.readHumidity();

  if(barometre.IsConnected) {
    Pext = barometre.GetPressure()/100;  // on divise par 100 pour avoir des hPa
    Pext = 1.02*Pext - 19; // Correction apportée par l'étalonnage : http://tpil.projet.perso.sfr.fr/2016/ArduinoPression.html
    tBMP = barometre.GetTemperature();}
    else Pext=pMPX;      // Si défaillance BMP180
 if (Pext >2000) Pext= pMPX;
    
   if (isnan(tdht)) Text=tPT;        // Si pb sur dht
      else Text=tdht; 
  
   Tint=tCTN;
   
   Sdebug.print("pBMP = ");Sdebug.print(Pext);Sdebug.print(" hPa \t tBMP =");Sdebug.println(tBMP,1);
   Sdebug.print("tdht = ");Sdebug.print(tdht,1);Sdebug.print(" C \t");
   Sdebug.print(h);Sdebug.print(" % \t");
   Sdebug.print("tPT = ");Sdebug.print(tPT,1);Sdebug.print(" C \t");
   Sdebug.print("tCTN = ");Sdebug.print(tCTN,1);Sdebug.print(" C \t");
   Sdebug.print("Pmpx = ");Sdebug.print(pMPX,1);Sdebug.print(" hPa \t");
   Sdebug.print("Pile = ");Sdebug.print(Pile,1);Sdebug.println(" V \t");
   Sdebug.println();  
  }