BMP180 basınç sensörü uygulaması

BMP180 Basınç, Sıcaklık ve Yükseklik sensörü

(BMP180 Digital Barometric Pressure, Temperature, and Altitude Sensor)

           bmp180

Library dosyası: BMP180_Breakout_Arduino_Library-master

 https://github.com/sparkfun/BMP180_Breakout_Arduino_Library/archive/master.zip

 Bosch tarafından üretilen BMP180 modülü ile Arduino ve benzer işlemcilerle yapacağınız projelerde sıcaklık, basınç ve yükseklik hesaplaması yapabilirsiniz. 3.3 V girişi bulunmakla birlikte 5V girişi de ayrıca bulunmaktadır. Modül bir adet KB33 kodlu MIC5205 voltaj regülatörü içerir. Dolayısıyla VCC pinini direkt olarak 5v.’a bağlayabilirsiniz. Eğer 3.3v besleme voltajı kullanacaksanız, board üzerindeki 3.3 pinini kullanmalısınız. Bu pin, KB33 voltaj regülatörünü by-pass eder

BMP180 Dijital Hava basıncı sensöründe, haberleşme Protokolü olarak I2C kullanılmaktadır. I2C haberleşmesi sağlayan bu modüllerde Adres olarak genel olarak 0x77 kullanılmaktadır. Sadece Mikrodenetleyicinizdeki iki pini kullanarak cihaz ile haberleşebilirsiniz. R1 ve R2 dirençleri PULLUP direnci olarak (4,7K) SCL / SDA bus hatları ile 3,3v. arasına paralel bağlanmış durumdadır. Eğer I2C haberleşme hattında başka cihazlar da bağlı olacak ise BMP180 üzerinde, PULLUP dirençlerinin bağlı olduğu göz önünde bulundurulmalı. I2C bus hattı üzerinde 1’er adet PULLUP direnci olması yeterli olacağından, diğer cihazlar için de ayrıca PULLUP direnci bağlamaya gerek yoktur. Ancak bus hattını da PULLUP dirençsiz çalıştırmayın. Arduino bus hattını 5v.’a çekecektir ve bu dirençler olmazsa bus hattına bağlı olan tüm cihazların haberleşma kısımları hasar görecektir, bu kısmın çok önemli olduğunu unutmayın

BMP180 birçok robot ve elektronik projesinde basınç ölçmek için kullanılan boyutları çok küçük olan bir sensördür.Hava basıncını ölçüp denetleyiciye dijital çıkış verir.Bu küçük sensör 300-1100hPa arasındaki basınç değerlerini ölçebilmektedir.Ayrıca 500 metre ile 9000 metre arasındaki yükseklik ile ilgili bilgi vermektedir.Genellikle drone gibi hava araçlarında kullanılan bu sensörün bu yazımızda bağlantısından ve kodlarından bahsedeceğiz.

Ürün Özellikleri: (addicore marka)

Arduino başta olmak üzere bir çok mikrodenetleyeci sistemi ile uyumlu.

Giriş Gerilimi: 3,3V ( 1.8V ile 3.6V arası çalışma gerilimi, 3.3v.’dan düşük gerilimler için 3.3v. giriş terminali kullanılmalı.)

Çözünürlüğü : 0.03hPa  / ±25cm’ye kadar çok hassas yükseklik ölçümü

I2C Interface

I2C adresi: 0x77

– Max I2C hızı: 3.4Mbit/sec. (I2C standard, fast ve high-speed modlar

desteklemektedir)

Çok düşük Gürültü oranı ( 0.02hPa ‘ya kadar 17 cm )

Tamamen kalibre edilmiştir.

Çok düşük güç tüketimi

Ölçme aralığı 300 hPa – 1100 hPa ( + 9000m -500m )

Sıcaklık sensör doğruluğu : +-3.6 Fahrenheit (+-2 Celsius)

İşletme sıcaklığı -40 to 185 Fahrenheit (-40 to 85 Celsius)

Bu sensörün I2C protokolü desteklemesi sayesinde, birsürü kablo kullanmak yerine SCL ve SDA pinlerinden haberleşme  sağlanılabilmektedir. Arduino Uno dan bahsedecek olursak SCL ve SDA pinleri genellikle Dijital 13 pinin yan tarafında bulunan üstünde yazı yazmayan boş pinlerdir.Arduino kartının arka tarafını çevirirseniz SDA ve SCL yazılarını görebilirsiniz. Yada Analog girişlerdeki A4 ve A5 pinlerine de bağlayabilirsiniz. Bu pinler, arduino üzerindeki Atmel mikroişlemcinin SDA ve SCL pinlerine doğrudan bağlıdır.

 

I2C haberleşme protokolünü de ayrıca öğrenmek gerektiğini de unutmamalıyız.

 

  bmp180_arduino

Any Arduino pins labeled:     SDA                       SCL

Uno, Redboard, Pro:                A4                          A5

A4-A5 analog pinleri de I2C haberleşmede SDA ve SCL pinleri ile aynı olarak kullanılıyor. Yani resimdeki SDA ve SCL bağlantılarını A4 veA5 pinleri ile de yapabiliriz.

 

 

BMP180_Breakout_Arduino_Library-master Kütüphane Fonksiyonları:

 

char sensor_ismi.begin(); – begin fonksiyonu BMP180’in kullanıma başlaması için ön hazırlıkların yapılmasını sağlar. Eğer başarılı şekilde çalışırsa geriye 1 döndürü, eğer başarısız olursa 0 döndürür (kötü bağlantı veya I2C bus kısadevresi v.b). fonksiyon önüne sensörün ismi yazılır ve nokta konulur.

char startTemperature(void); – sensör_ismi.startTemperature();  şeklinde yazılır. BMP180’i sıcaklık ölçümüne başlatır. Başarılı şekilde tamamlanırsa, okuma için beklenilen süreyi ms cinsinden döndürür, başarılı olmazsa 0 döndürür. Örneğin: status = pressure.startTemperature();  fonksiyonu başarılı olursa, status değişkenine ms cinsinden bekleme süresini atar, başarılı omazsa status’a 0 atar.

char getTemperature(double &T); -sensör_ismi.getTemperature(T); şeklinde yazılır. startTemperature ile ölçülen sıcaklığı T değişkenine santigrat derece cinsinden atar. Fonksiyon baraşılı olursa, 1 değerini döndürür, baralı olmazsa 0 değerini döndürür.

Örneğin:

status = pressure.getTemperature(T); başarılı olursa T değişkeni içine sıcaklık bilgisini, status içine de 1 atar. Başarısız olursa status içine 0 atar.

char startPressure(char oversampling); – sensör_ismi.startPressure(3 veya2 veya1 veya 0); şeklinde yazılır. 0-3 arası ölçüm hassasiyeti belirtilir. 0 en az, 3 ise en çok hassasiyet anlamına gelir. Hassasiyet arttıkça, bekleme süresi de artar. Fonksiyon başarılı şekilde çalışırsa, bekleme süresini ms cinsinden döndürür. Başarılı olmazsa 0 döndürür.

char getPressure(double &P, double &T); – sensör_ismi.getPressure(P,T); şeklinde yazılır. StartPressure fonksiyonu ile ölçülen mutlak basıncı alır ve P değişkenine yazar. getTemperature ile T değişkenine alınan sıcaklığı kullanarak basıncı hesaplar. Bu fonksiyonu kullanabilmek için T sıcaklığının tespit edilmiş olması gerekiyor. Fonksiyon düzgün çalışırsa, P içerisine mutlak basıncı yazar ve 1 değerini döndürür, baraşısız olursa 0 değerini döndürür.

Örneğin:

status = pressure.getPressure(P,T); fonksiyonu, T sıcaklığını alır, basıncı hesaplar ve       sonucu mbar cinsinden P değişkenine yazar, status’a bir atar. Başarısız olursa status’a 0 atar.

double sealevel(double P, double A); – sersör_ismi.sealevel(P, YUKSEKLIK); şeklinde yazılır. mutlak basıncı deniz seviyesine göre basınca dönüştürür (hava durumu bilgisinde olduğu gibi) ve milibar cinsinden geri döndürür.

P:                            mutlak basınç bilgisi

YUKSEKLIK:        Mevcut bulunulan yükseklik bilgisi (metre)

Örneğin:

p0 = pressure.sealevel(P,ALTITUDE); fonksiyonu çalıştığında P ve ALTITUDE bilgileri alınır, işlem yapılır ve sonuç p0 değişkeni içine mbar cinsinden yazılır.

double altitude(double P, double P0); – sesör_ismi.altitude(P, P0); şeklinde yazılır. ölçülen mutlak basınca göre yüksekliği hesaplar taban basıncı (P0) olarak deniz seviyesi basıncı (1013,25 ) veya bulunduğunuz yerin zemin basıncı mbar olarak verilir.

 

P= ölçülen basınç

P0= taban basıncı (deniz seviyesi veya bulunulan yerin zemin basıncı)

 

Örneğin:

a = pressure.altitude(P,p0); isimli fonksiyon çalıştığında, p0 ile P arasındaki basınç farkını alır ve buna göre yüksekliği hesaplayarak sonucunu da a değişkeni içerisine + veya – olarak yazar.

char getError(void); – herhangi bir komut çalışmadığı zaman hata mesajı almak için kullanılır

// If any library command fails, you can retrieve an extended

// error code using this command. Errors are from the wire library:

// 0 = Success

// 1 = Data too long to fit in transmit buffer

// 2 = Received NACK on transmit of address

// 3 = Received NACK on transmit of data

// 4 = Other error

 

Örnek program; (ayrıca kendi kütüphanesi içinde de örnek programı var)

#include <SFE_BMP180.h> // Basınç Sensör kütüphanesi

#include <Wire.h> // I2C kütüphanesi

SFE_BMP180 pressure; //sensör adı tanımlama

double baseline; // Basınç değeri

void setup()

{

Serial.begin(9600);

if (pressure.begin())

Serial.println(“BMP180 Bağlanıldı”);

else

{

Serial.println(“BMP180 Bağlanılamadı\n\n”);

while(1);

}

baseline = getPressure();

Serial.print(“Basınç: “);

Serial.print(baseline);

Serial.println(” mb”);

}

void loop()

{

double a,P;

P = getPressure();

a = pressure.altitude(P,baseline);

Serial.print(“Yükseklik: “);

if (a >= 0.0) Serial.print(” “); // Pozitif sayılarda boşluk ekle

Serial.print(a,1);

Serial.print(” meters, “);

if (a >= 0.0) Serial.print(” “); // pozitif sayılarda boşluk ekle

Serial.print(a*3.28084,0);

Serial.println(” feet”);

delay(500);

}

double getPressure()

{

char status;

double T,P,p0,a;

// Önce bir basınç okuma gerçekleştirmek için bir sıcaklık ölçümünü almak gerekir.

// Ölçüm birimi T saklanır

// Kullan ‘T’ işlevine T adresini sağlamak.

// Fonksiyon döner başarılı olursa 1, başarısızlık ise 0.

status = pressure.startTemperature();//Bir sıcaklık ölçümü başlatılır

if (status != 0) //

{

delay(status); // Ölçüm tamamlanması için bekle

status = pressure.getTemperature(T); // T değerini ölç

if (status != 0) //Sıfırdan faklı ise

{

status = pressure.startPressure(3);//Basınç ölçümünü başlat

if (status != 0)

{

// Parametre 0 ila 3 örnekleme ayarı, (en yüksek res, uzun bekleme) ‘dir.

// Istek başarılı olursa beklemek ms sayısı döndürülür.

// Istek başarısız olursa 0 döndürülür.

delay(status);// Ölçümünü tamamlanmasını bekle

// ‘P’ adresi sağlamak için

// Not ayrıca işlev önceki sıcaklık ölçümü (T) gerektirir.

// (Sıcaklık kararlı ise, basınç ölçümleri bir dizi için tek ısı ölçümü yapabilirsiniz.)

// Fonksiyon döner başarılı olursa 1 , başarısızlık ise 0

status = pressure.getPressure(P,T); //Tamamlanan basınç ölçümü Al :

if (status != 0) //sıfıra eşit değilse

{

return(P); // Ölçüm birimi P saklanır

}

// P sıfıra eşitse

else Serial.println(“Basınç ölçümünde hata alındı\n”);

}

// P sıfıra eşitse

else Serial.println(“Basınç Ölçümü başlatılamadı\n”);

}

// T sıfıra eşitse

else Serial.println(“Sıcaklık değeri alınamadı\n”);

}

// T sıfıra eşitse

else Serial.println(“Sıcaklık ölçümü başlatılamadı\n”);

}

 

 

Orijinal kütüphanesindeki örnek:

 

/* SFE_BMP180 library example sketch

 

This sketch shows how to use the SFE_BMP180 library to read theBosch BMP180 barometric pressure sensor.

Like most pressure sensors, the BMP180 measures absolute pressure.This is the actual ambient pressure seen by the device, which willvary with both altitude and weather.

Before taking a pressure reading you must take a temparture reading.This is done with startTemperature() and getTemperature().

The result is in degrees C.

Once you have a temperature reading, you can take a pressure reading.This is done with startPressure() and getPressure().

The result is in millibar (mb) aka hectopascals (hPa).

If you’ll be monitoring weather patterns, you will probably want to remove the effects of altitude. This will produce readings that can

be compared to the published pressure readings from other locations. To do this, use the sealevel() function. You will need to provide

the known altitude at which the pressure was measured.

If you want to measure altitude, you will need to know the pressure at a baseline altitude. This can be average sealevel pressure, or

a previous pressure reading at your altitude, in which case subsequent altitude readings will be + or – the initial baseline.

This is done with the altitude() function.

Hardware connections:

 

– (GND) to GND

+ (VDD) to 3.3V

 

(WARNING: do not connect + to 5V or the sensor will be damaged!)

You will also need to connect the I2C pins (SCL and SDA) to your Arduino. The pins are different on different Arduinos:

Any Arduino pins labeled:  SDA  SCL

Uno, Redboard, Pro:        A4   A5

Mega2560, Due:             20   21

Leonardo:                   2    3

 

Leave the IO (VDDIO) pin unconnected. This pin is for connecting the BMP180 to systems with lower logic levels such as 1.8V

Have fun! -Your friends at SparkFun.

The SFE_BMP180 library uses floating-point equations developed by the Weather Station Data Logger project: http://wmrx00.sourceforge.net/

Our example code uses the “beerware” license. You can do anything you like with this code. No really, anything. If you find it useful,

buy me a beer someday.

 

V10 Mike Grusin, SparkFun Electronics 10/24/2013

*/

 

// Your sketch must #include this library, and the Wire library.

// (Wire is a standard library included with Arduino.):

 

#include <SFE_BMP180.h>

#include <Wire.h>

 

// You will need to create an SFE_BMP180 object, here called “pressure”:

 

SFE_BMP180 pressure; // sensöre “pressure” ismi verildi

 

#define ALTITUDE 1655.0 // Altitude of SparkFun’s HQ in Boulder, CO. in meters

 

void setup()

{

Serial.begin(9600);

Serial.println(“REBOOT”);

 

// Initialize the sensor (it is important to get calibration values stored on the device).

 

if (pressure.begin())

Serial.println(“BMP180 init success”);

else

{

// Oops, something went wrong, this is usually a connection problem,

// see the comments at the top of this sketch for the proper connections.

 

Serial.println(“BMP180 init fail\n\n”);

while(1); // Pause forever.

}

}

 

void loop()

{

char status;

double T,P,p0,a;

 

// Loop here getting pressure readings every 10 seconds.

// If you want sea-level-compensated pressure, as used in weather reports,

// you will need to know the altitude at which your measurements are taken.

// We’re using a constant called ALTITUDE in this sketch:

 

Serial.println();

Serial.print(“provided altitude: “);

Serial.print(ALTITUDE,0);

Serial.print(” meters, “);

Serial.print(ALTITUDE*3.28084,0);     // convert meters to feet, you must multiply the                                                                              //altitude by 3.28084   (1 meter=3.28084 ft )

Serial.println(” feet”);

 

// If you want to measure altitude, and not pressure, you will instead need

// to provide a known baseline pressure. This is shown at the end of the sketch.

// You must first get a temperature measurement to perform a pressure reading.

// Start a temperature measurement:

// If request is successful, the number of ms to wait is returned.

// If request is unsuccessful, 0 is returned.

 

status = pressure.startTemperature();// pressure isimli sensörün sıcaklığını okumaya başla, geçen süreyi status’ a yaz.

// command BMP180 to start a temperature measurement

// returns (number of ms to wait) for success, 0 for fail

 

if (status != 0)

{

// Wait for the measurement to complete:

delay(status);

 

// Retrieve the completed temperature measurement:

// Note that the measurement is stored in the variable T.

// Function returns 1 if successful, 0 if failure.

 

status = pressure.getTemperature(T);     //pressure isimli sensörden ölçülen sıcaklık                                                                                     // bilgisini T’ye yaz, yazdıysan status=1 yap

if (status != 0)   // eğer sıcaklık okunabildiyse

{

// Print out the measurement: ölçümleri serial monitöre yaz

Serial.print(“temperature: “);

Serial.print(T,2);

Serial.print(” deg C, “);

Serial.print((9.0/5.0)*T+32.0,2);

Serial.println(” deg F”);

 

// Start a pressure measurement:

// The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).

// If request is successful, the number of ms to wait is returned.

// If request is unsuccessful, 0 is returned.

 

status = pressure.startPressure(3); // basıncı ölçmeye başla, ölçüm hassasiyeti 3 (0 – 3                                                                         //arası düşükten yükseğe doğru), bekleme                                                                                      //süresi uzun. Basınç okuma baştılabildiyse                                                                                      // “status=beklenen süre” yap, değilse status=0 yap.

if (status != 0)

{

// Wait for the measurement to complete:

delay(status);

 

// Retrieve the completed pressure measurement:

// Note that the measurement is stored in the variable P.

// Note also that the function requires the previous temperature measurement (T).

// (If temperature is stable, you can do one temperature measurement for a number of //pressure measurements.)

// Function returns 1 if successful, 0 if failure.

 

status = pressure.getPressure(P,T);

// ölçülen basınç bilgisini P’ye yazar, T’deki sıcaklık bilgisini ise fonksiyonda //regülasyon için

// kullanır.  Basınç bilgisini P’ye yazmak için T’deki sıcaklık bilgisina ihtiyacı vardır.

//fonksiyon sorunsuz çalışırsa status=1, sorun çıkarsa status=1 olur.

if (status != 0)

{

// Print out the measurement:

Serial.print(“absolute pressure: “);

Serial.print(P,2);

Serial.print(” mb, “);

Serial.print(P*0.0295333727,2);

Serial.println(” inHg”);

 

// The pressure sensor returns abolute pressure, which varies with altitude.

// To remove the effects of altitude, use the sealevel function and your current altitude.

// This number is commonly used in weather reports.

// Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.

// Result: p0 = sea-level compensated pressure in mb

 

p0 = pressure.sealevel(P,ALTITUDE); // we’re at 1655 meters (Boulder, CO)

// ölçülen basınç ve muvcut konumumuzun yüksekliği verilir. Fonksiyon bunlardan

// yararlanarak, deniz seviyesine göre basıncı hesaplar. Bulunan sonuç, p0’ a yazılır

Serial.print(“relative (sea-level) pressure: “);

Serial.print(p0,2);

Serial.print(” mb, “);

Serial.print(p0*0.0295333727,2);

Serial.println(” inHg”);

 

// On the other hand, if you want to determine your altitude from the pressure //reading,

// use the altitude function along with a baseline pressure (sea-level or other).

// Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.

// Result: a = altitude in m.

 

a = pressure.altitude(P,p0);

Serial.print(“computed altitude: “);

Serial.print(a,0);

Serial.print(” meters, “);

Serial.print(a*3.28084,0);

Serial.println(” feet”);

}

else Serial.println(“error retrieving pressure measurement\n”);

}

else Serial.println(“error starting pressure measurement\n”);

}

else Serial.println(“error retrieving temperature measurement\n”);

}

else Serial.println(“error starting temperature measurement\n”);

 

delay(5000);  // Pause for 5 seconds.

}

 

 

Hava durumunu (sıcaklık) ve Yüksekliği ölçmek

BMP180, atmosferik basıncı hatasız ölçmek amacıyla dizyn edilmiştir. Atmosferik basınç, hava durumu(sıcaklığı) ve yüksekliğe göre değişmektedir. Bu sensör kullanılarak bu iki değer de ölçülebilir. Bu ölçümlerin nasıl yapılacağı aşağıda anlatılmıştır.

 

Atmosferik Basınç Nedir?

Basınç, bir alan uygulanan bastırma gücüdür. Basıncın genel birimi, her birim inch² ‘ye pound cinsinden uygulanan basınçtır (psi – pounds per square inch). 1 inch² ’ye uygulanan 1 poundluk bastırma kuvveti 1 psi’ya eşittir. Uluslararası birim sistemlerine göre ise (SI unit – International System of Units), m² ‘ye uygulanan Newton kuvvetidir, pascal(Pa) olarak isimlendirilir.

Basıncın ölçülebileceği bir çok durum vardır (yerçekimi, çekme kuveeti, v.b) ancak şu anda biz çevremizde bulunan her şeye nüfuz eden havada bulunan kuvvet olan atmosferik basınca yoğunlaşacağız. Atmosferde bulunan gazların ağırlığı, Amosferik basıncı oluştururlar. Normalde havanın herhangi bir ağırlığı olduğunun farkında olmayız, ancak 1 inch genişliğinde bir hava sütununu deniz sevinden alarak atmosferin üzerine çıkardığınızda ağırlığı 14,7 pound gelecektir (1cm genişliğindeki havanın ise atmosfer dışındaki ağırlığı 1 kg civarındadır). Bulunduğu noktadan aşağıya doğru baskı uygulayan bu ağırlığın oluşturduğu atmosferik basınç, BMP180 gibi sensörlerle ölçülebilir.

1 inch genişliğindeki hava sütununun yaklış olarak 14,7 pound olması ve 1 inch² ‘ye bastırıyor olması nedeniyle, ortalama deniz seviyesi basıncı yaklaşık 14,7 pound inch²(psi) ‘dir, yada 101325 pascaldır. Bu değerler havaya doğru yükseldikçe her 1000 feet ‘te (yada 300 metrede) bir,  %4 azalmaktadır. Ne kadar yükseğe çıkarsanız daha düşük basınç göreceksiniz çünkü hava sütununun üst seviyesinin atmosfere olan mesafesi daha kısadır ve bu yüzden de ağırlık gitgide azalır. Bu çok kullanışlı bilgi ile, basıncı ölçerek ve birazda matematik vasıtası ile yükseklik (rakım) da bulunabilir.

Eğlenceli gerçek:  12500 feet ‘teki (3810 metre) hava basıncı, deniz seviyesindeki hava basıncının yarısı kadardır. Diğer bir deyişle, atmosfer kütlesinin yarısı 12500 feet ‘in altındadır ve 12500 feet ‘teki hava deniz seviyesindekinin yarısı kadar yoğunluktadır. Bu yükseklikte nefes almak kuşkusuz çok zordur.

BMP180 ölçülen basıncı pascal (Pa) cinsinden çıkış verir. 1 pascal çok küçük bir basınç birimidir, yaklaşık olarak 1 yaprak A4 kağıdının masaya uyguladığı baskı kadar bir basınçtır. Ölçümleri bu yüzden genel olarak hektopaskal (1 hPa = 100 Pa) veya kilopaskal (1 kPa = 1000Pa) olarak göreceksiniz. Arduino kütüphanesindeki (BMP180_Breakout_Arduino_Library) sağlanan floating point cinsndeki çıkış hPa cinsindendir ve aynı zamanda 1 milibar (mbar) ‘a eşittir.

Aşağıda basınç birimlerinin diğer birimlere dönüştürülüşleri gösterilmiştir.

1 hPa = 100 Pa = 1 mbar = 0.001 bar

1 hPa = 0.75006168 Torr

1 hPa = 0.01450377 psi (pounds per square inch)

1 hPa = 0.02953337 inHg (inches of mercury)

1 hpa = 0.00098692 atm (standard atmospheres)

Sıcaklık Etkileri

Sıcaklık bir gazın yoğunluğunu etkiler, yoğunluk bir gazın kütlesini etkiler ve gaz kütlesi de basınç şiddetini etkiler. Tüm bu etkileşimler yüzünden sıcaklık, atmosferik basınç şiddetini etkileyici biçimde değiştirir. Pilotlar arasında bu “Yoğunluk İrtifası” olarak bilinir ve soğuk havanın sıcak havaya göre daha yoğun olması ile daha iyi bir aerodinamik etki oluşturması nedeniyle daha kolay kalkış yaparlar.

Sıcaklıkğın dengelenmesi için BMP180 , basınç sensörü kadar iyi bir sıcaklık sensörü de içerir. Basınç okuma yapılması için, önce sıcaklık okuması yapılmalı ve ham basınç okuma bilgisi ile birleştirilerek nihai sıcaklık dengelenmesi yapılmış basınç ölçümü elde edilmeli.

Arduino kütüphanesi (BMP180_Breakout_Arduino_Library) tüm bunları kolaylıkla yapar.

 

Basıncın Tam Olarak Ölçülmesi

Yukarıda da sözünü ettiğimiz gibi, eğer uygulamalarınızda kesin olarak doğru bir basınç bilgisi gerekiyorsa tüm yapmanız gereken önce sıcaklığı ölçmek sonra bununla birlikte basınç bilgisi okumak. Nihai basınç bilgisi hPa=mbar olarak elde edilecektir. Eğer dilerseniz daha önce gösterilen bilgilerden yararlanarak basınç birimlerini diğer birimlere dönüştürebilirsiniz.

Unutulmaması gereken, atmosfer basıncının tam olarak ölçülmesi yüksekliğe ve o andaki hava durumuna göre değişeceğidir. Bu iki durum da dikkat edilmesi gereken şeylerdir.

 

Hava Durumu Gözlemleri (weather stations için)

Yerüzündeki herhangi bir noktadaki (yada atmosferdeki herhangi bir yerde) atmosferik basınç sabit değildir. Dünya’nın dönüşü – eksen eğimi ve diğer birçok faktör, hareket eden alçak ve yüksek basınç alanları meydana getirir ve bu da her gün gördüğümüz hava değişikliklerini ortaya çıkarır. Basınçtaki değişiklikleri gözlemleyerek kısa süreli hava durumu değişikliklerini tahmin edebilirsiniz. Örneğin, düşen basınç genellikle yağışlı havanın veya bir fırtınanın yaklaştığı anlamına gelir (alçak hava basınç sistemine giriliyor). Yükselen hava basıncı ise genellikle açık bir havanın yakşaltıı anlamına gelir (yüksek basınç hava sistemine giriliyor).

Atmosferik basıncın, aynı zamanda yüksekliğe göre değiştiğini de hatırlayın. Deniz seviyesine göre daha yüksek olan yerlerdeki mutlak basınç daha az olur, deniz seviyesine göre daha alçak olan yerlerdeki mutlak basınç ise daha çok olur. Eğer hava ölçüm istasyonları kendi bulunduğu yerdeki mutlak basınçları rapor etmiş olsalardı bir bölge ile diğer bir bölge arasındaki basınç ölçümlerini direkt olarak karşılaştırmak zor olacaktı. Büyük ölçekli hava durumu tahminlerinin doğru olarak yapılması, mümkün olduğu kadar çok farklı noktadan ölçüm sonuçlarının alınmasına bağlıdır.

Bu problemi çözmek için herzaman hava durumu istasyonları, rapor edilen basınç okumalarından yükseklik etkisi arındırılarak rapor edilir. Bunun için, okuma sanki deniz seviyesinde yapılmış gibi olacak şekilde matematiksel bir sabit basınç eşitliği ifadeye eklenir. Bunu yaptığınız zaman yüksek ve alçak bölgelerdeki basınç okumaları, yüksekliğe göre değil hava durumuna göre yapılmış olur.

 

Bunu yapmak için, kütüphanede seaLevel(P,A) isimli bir fonksiyon mevcuttur. Bu mutlak basıncı (P) hPa cinsinden, ve Hava istasyonunun mevcut yüksekliğini (A) metre cinsinden alır, ve basınçtan yükseklik etkisini arındırır. Bu fonksiyonun çıkış verdiği okunan hava durumu değeri, dünyanın diğer bölgelerindeki hava istasyonlarının verdiği çıkış değerleri ile direkt olarak karşılaştırılabilir.

 

Daha fazla bilgi için https://en.wikipedia.org/wiki/Atmospheric_pressure#Mean_sea_level_pressure adresine bakabilirsiniz.

 

Yüksekliğin Belirlenmesi

Basınç yükseklik ile değiştiğinden, yüksekliği ölçmek için bir basınç sensörü kullanabilirsiniz. (birkaç uyarı ile birlikte)

Deniz seviyesindeki ortalama atmosfer basıncı 1013,25 hPa’dır (yada mbar). Uzay boşluğuna doğru tırmandıkça bu sıfıra doğru düşer. Bu düşüş eğrisi iyice anlaşıldığına göre, aşağıdaki denklemi kullanarak iki basınç ölçümünün (p ve p0) arasındaki yükseklik (altitude) farkını hesaplayabilirsiniz.

bmp180_arduino_formul

Bunun avantajlarından yararlanmanın iki yolu vardır

 

  1. Taban basıncı (p0) olarak deniz seviyesi basıncını (1013.25 hPa) kullanırsanız, denklemin çıktısı deniz seviyesinin üzerindeki mevcut yükseklik olacaktır.
  2. Veya, o anda mavcut bulunduğunuz yerdeki basıncı okur ve bunu taban basıncı (p0) olarak kullanırsanız, sonraki tüm basınç okumaları taban basıncını baz alacak ve yükseklik hesaplamaları bu taban basıncına göre olacaktır. Bunun için ölçüm yaptığınız noktaya bir merdiven koyup yukarı çıktığınızda, gördüğünüz yükseklik 0’dan 3 veya 4 metreye doğru artacaktır. Aynı şekilde ölçüm yaptığınız noktadan aşağı merdiven koyup inmeye başladığınızda, gördüğünüz yükseklik -3 veya -4 metreye doğru azalacaktır.

 

Kütüphanede bulunan altitude(P,P0) fonksiyonu yukarıdakilerin her ikisini de gerçekleştirebilmenize olanak sağlar. Eğer p olarak deniz seviyesi basıncını  (1013.25 hPa) verirseniz, ve p içinde ölçümünü yaptığınız lokasyonun basıncını verirseniz, fonksiyon çıktısı olarak sizin bulunduğunuz noktanın deniz seviyesine göre olan yüksekliğini görürsünüz. Eğer p olarak bulunduğunuz noktada ölçtüğünüz basıncı verirseniz ve p olarak da daha sonra ölçüm yaptığınız noktanın basıncını verirseniz,  fonksiyon çıktısı olarak p da girmiş olduğunuz basınca göre olan farktan kaynaklanan yüksekliği görürsünüz.

 

Uyarılar:

 

Doğruluk: Ne kadar doğru? BMP 180’in en yüksek çözünürlükteki teorik gürültü seviyesi 25cm (yaklaşık 10 inch), ancak pratikte yaklaşık 1m (40 inch) civarında görüyoruz. Doğruluğu, çok sayıda ölçüm yapıp ortalamasını alarak arttırabilirsiniz. Ancak buna bağlı olarak örnekleme oranınız ve cevap süreniz azalacaktır.

Hava durumu: Şunu da hatırlamanız gerkiyor ki hava durumuna bağlı olarak basınç değişimleri, yükseklik okumalarınızı da etkileyecektir. p basıncını, ihtiyacınız olduğu anda ölçüp kullanmak en iyi sonucu elde etmenizi sağlayacaktır, bu basıncın hava durumu değişiklikleri yüzünden uzun süreler boyunca doğru olarak kalacağına güvenmeyim. Kullanacağınız zaman taze taze ölçüp kullanın.

Maksimum yükseklik: BMP180 uzay boşluğu boyunca ölçüm yapamaz. En düşük limit olarak 300hPa (veya mbar) belirlenmiştir, buna karşılık olarak ise 3000m veya 30000 feet gelmektedir. Deneme yapan kişiler bu yüksekliklere ulaşmış ve kullanışlı sonuçlar elde etmişlerdir ancak bu her zaman güvenilir olmayabilir, garanti edilemez. Daha büyük yükseklikler için GPS kullanılmalıdır.

Minimum yükseklik:  Bu sensör yüksek basınç ölçümleri için de uygun değildir. En düşük limit olarak 1100 hPa=mbar (veya 16 psi) olarak belirlenmiştir, bu da 500 feet deniz seviyesi altındaki açık hava basıncını ölçer (denizaltında değil deniz seviyesi altındaki bölgelerdeki hava basıncı). Bu sensör, su altında ve sıkıştırılmış gaz ölçümlerinde kullanılmak için uygun değildir.

İpuçları

Dikkat edilecek hususlar

 

Doğru giriş voltajı bağlantısı: BMP180 hem 5v ve hem de 3.3v bağlantı terminallerine sahiptir. Doğru terminali, doğru voltajda kullandığınızdan emin olun. SCA ve SDL pinlerini doğru bağladığınızdan emin olun. Bu pinlere bağlı, sensör boardı üzerindeki PULLUP dirençleri sayesinde I2C portuna direkt olarak bağlayabilirsiniz. I2C protokolünün en önemli özelliğinin SDA ve SCL bus hattı üzerinde birer adet PULLUP direncinin 3.3v. ile bağlanmış olmasıdır, bus hattı üzerindeki herhangi bir noktada SDA ve SCL ile 3.3v. arasına PULLUP direnci bağlantı olması yeterlidir. Bu hususu göz önünde bulundurun.

Hava almasına müsaade edin: BMP180’in ölçüm yapabilmesi için bulunduğu yerin ortam havasına ihtiyacı vardır, tamamen kapalı bir kutuya koyarak ortamdan izole etmeyin. Muhafaza ettiğiniz kutu v.b koruma alanına açacağınız bir havalandırma oyuğu, ortam

Fazla açık havaya maruz bırakmayın: Diğer yandan, hızlı değişen rüzgar-hava koşullarına maruz kalması, basınç değişimlerine ve dolayısıyla yapmış olduğunuz okumalara etki edecektir. Sensörünüzü, güçlü hava akımlarına karşı korumaya alın.

Serin tutun: Basınç okuması yapılabilmesi için doğru sıcaklık okuması yapılmasına gerek duyulduğu için, cihazınızı ani ısı değişimlerine maruz bırakmamaya çalışın, sıcak yüzeylerden ve diğer ısı yayan kaynaklardan uzak tutmaya çalışın.

Kuru tutun: BMP180 neme karşı hassastır. Su altına sokmayın ve su ile temas etmesine izin vermeyin

Sesörü körleştirmeyin: BMP180, içinde ışığa duyarlı silikon bir materyal içerir. Çip üzerindeki delikten içeriye ışık girebilir. Maximum doğruluk için, çipi ortam ışından izole edin.

Yorum bırakın