Etalonnage des capteurs de pression MPX5100 et BMP 180
Courbe étalonnage MPX5100 : Protocole : La carte Arduino fait l'acquisition simultanée de la tension du capteur MPX5100 et de la tension de sortie de notre Presiomètre étalon Jeulin. Puis elle écrit les résultats sur une carte SD, chaque baisse de pression de 20 hPa déclenche une nouvelle mesure. ![]() Etalon : d'après la notice Jeulin : Gamme : 0 à 2 000 hPa Précision : 2 % ±4 hPa Résolution : 1 hPa Pression maximale : 4 000 hPa Sortie Analogique : 1000 hPa -> 0 V et 0 hPa -> -2,5 V Résultats de notre étalonnage : Excellente linéarité (R² = 0,999999) Etendue de mesure de 150 hPa à 1000 hPa Sensibilité = 4,4 mV / hPa Equation : P (en hPa) = 227 V + 130 avec V tension de sortie du MPX5100 en V Reproductibilité MPX5100 Afin de tester la fidélité de notre capteur nous avons réalisé 4 étalonnages successifs dans les mêmes conditions. ![]() Comme on peut le constater les 4 séries de points sont sur la même droite. Le capteur est donc très fidèle. Test en situation sur la carte finale : Attention : il faut éloigner le capteur de l'émetteur Kiwi : trop près les mesures sont fortement perturbées. |
![]() ![]() |
Courbe étalonnage BMP180 : Le BMP180 : ![]() Il s'agit d'un capteur à sortie numérique (protocole de communication I2C)
Résultats de notre étalonnage :
![]() Nos 4 séries de mesure au format Excel |
![]() ![]() |
Voici le programme Arduino que nous avons utilisé pour réaliser
cet étalonnage.
Nous utilisons 4 bibliothèques :
- Wire : pour utiliser la liaison série I2C
- SD : pour programmer le lecteur de carte SD
- RTClib : pour horodater nos mesures (facultatif)
- BMP180 : pour dialoguer avec le BMP180
#include <SD.h> #include <Wire.h> // Pour capteur pression BMP 180 #include <RTClib.h> RTC_DS1307 RTC; #include <BMP180.h> // A4 : SDA A5 : SCL BMP180 barometer; DateTime maintenant; char complet[20]; char date[12]; char heure[8]; int chipSelect=10; int rouge = 7; //LED RGB int vert = 6; int bleu = 5; boolean erreurSD; long P_BMP; float T_BMP,V_MPX,P_old=100000,P_J, V_J; void setup() { Serial.begin(9600); pinMode(chipSelect, OUTPUT); pinMode(rouge, OUTPUT); pinMode(vert, OUTPUT); pinMode(bleu, OUTPUT); digitalWrite(chipSelect,HIGH); RTC.begin(); IniBMP (); delay(2000); IniSD(); // Appel Sous Programme digitalWrite(vert,LOW); digitalWrite(bleu,LOW); maintenant = RTC.now(); sprintf(complet, "%02d/%02d/%d %02d:%02d:%02d", maintenant.day(), maintenant.month(), maintenant.year(), maintenant.hour(), maintenant.minute(), maintenant.second()); Serial.println(complet); } // Boucle Principale : void loop() { do { if (!erreurSD) digitalWrite(vert,HIGH); V_J = 5*float(analogRead(A0))/1024; // A1 sortie Pressiomètre Jeulin 0V --> 1000 hPa 2.5V --> 0 hPa P_J= 40000*(2.5-V_J); // http://www.ens-lyon.fr/DSM/AGREG-Physique/oral/Notices/N096-029.pdf if (P_J > 98100) P_old=100000; } while(P_old-P_J < 2000); digitalWrite(vert,LOW); V_J = 5*float(analogRead(A0))/1024; P_J= 40000*(2.5-V_J); P_old=P_J; V_MPX = 5*float(analogRead(A1))/1024; Serial.print("V_J = "); Serial.print(V_J,3);Serial.println(" V"); Serial.print("P_J = "); Serial.print(P_J,0);Serial.println(" Pa"); Serial.print("V_MPX = "); Serial.print(V_MPX,3);Serial.println(" V"); PressionBMP(); ecritureSD(); } // Sous Programmes : void IniSD() { if (!SD.begin(chipSelect)){ Serial.println("Erreur carte SD"); digitalWrite(rouge,HIGH); erreurSD= true; return;} Serial.println("Carte presente"); digitalWrite(vert,HIGH); maintenant = RTC.now(); sprintf(complet, "%02d/%02d/%d %02d:%02d:%02d", maintenant.day(), maintenant.month(), maintenant.year(), maintenant.hour(), maintenant.minute(), maintenant.second()); File Pression = SD.open("Pression.csv", FILE_WRITE); if (Pression) { Pression.print(complet); Pression.print(";"); Pression.print("P Jeulin (Pa)"); Pression.print(";"); Pression.print("V MPX5100 (V)"); Pression.print(";"); Pression.print("P BMP180 (Pa)"); Pression.print(";"); Pression.println("T BMP180 (C)"); Pression.close();} } void ecritureSD() { File Pression = SD.open("Pression.csv", FILE_WRITE); maintenant = RTC.now(); // sprintf(date, "%02d/%02d/%d",maintenant.day(), maintenant.month(), maintenant.year()); sprintf(heure, "%02d:%02d:%02d",maintenant.hour(), maintenant.minute(), maintenant.second()); Serial.println(heure); if (Pression) { erreurSD=false; digitalWrite(rouge,LOW); digitalWrite(bleu,HIGH); Pression.print(heure); Pression.print(";"); Pression.print(P_J); Pression.print(";"); Pression.print(V_MPX,3); Pression.print(";"); Pression.print(P_BMP); Pression.print(";"); Pression.println(T_BMP,1); Pression.close(); digitalWrite(bleu,LOW); } else { digitalWrite(rouge,HIGH); erreurSD=true; Serial.println("Erreur Pression.csv");} } void IniBMP () {// Initialisation capteur BMP180 Wire.begin(); barometer = BMP180(); if(barometer.EnsureConnected()){ Serial.println("Connection etablie au BMP180."); digitalWrite(bleu, HIGH); // Set our LED. barometer.SoftReset(); barometer.Initialize();} else {Serial.println("Connexion impossible au BMP180."); digitalWrite(bleu, LOW);} } void PressionBMP() { if(barometer.IsConnected) { P_BMP = barometer.GetPressure(); Serial.print("Pression BMP 180 : "); Serial.print(P_BMP); Serial.print(" Pa"); T_BMP = barometer.GetTemperature(); Serial.print("\tTemperature: "); Serial.print(T_BMP); Serial.write(176); Serial.println("C"); } }