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