Arduino İle BMP180 Basınç Sensörü Kullanımı
BMP180 sensörü, hem eğitim hem de ticari amaçlar için kullanılan BMPXXX serisinin yüksek hassasiyetli bir dijital basınç sensörüdür. EMC sağlamlığı, yüksek doğruluk ve doğrusallık ve uzun vadeli kararlılık elde etmek için piezo dirençli teknolojiye dayanmaktadır. Atmosfer basıncını veya barometrik basıncı ölçmek için kullanılır.
Barometrik basınç veya atmosferik basınç, üzerimizdeki havanın ağırlığı tarafından uygulanan bir basınçtır. BMP180 sensörü bu basıncı ölçer ve I2C veri iletişimini kullanarak Arduino UNO gibi herhangi bir mikro denetleyici tarafından okunabilen dijital bir sinyal olarak verir. Son derece hassas bir basınç okuması elde etmek için dahili bir sıcaklık ölçüm sensörü kullanır. Böylece BMP180 çok iyi bir sıcaklık ölçüm sensörü olarak da kullanılabilir. Burada, bir kütüphane kullanarak bu sensörü Arduino UNO ile kullanacağız. Daha sonra bir yükseklik ölçer yapmak için bir kod yazacağız.
BMP180 Basınç Sensörü Özellikleri
- Basınç aralığı: 300-1000 hPa (deniz seviyesine göre -500 m ila +9000m)
- Besleme gerilimi (bağımsız sensör): 1.8-3.6V DC
- Akım tüketimi: 1000µA(Tepe).
- I2C haberleşmesini kullanır
- Tamamen kalibre edilmiş
- Dahili sıcaklık ölçüm sensörü
BMP180 Sensörünün Kullanıldığı Projeler
- Hava Durumu Tahmini
- Akıllı Saatler
- Cep Telefonları
- GPS Navigasyon
- Dikey Hız Göstergesi
BPM180 Sensörü Kullanma Modları
Arduino kodunda oversampling_setting (0, 1, 2, 3) değişkeniyle seçilebilen BMP180 kullanan toplam dört mod vardır. Bu modlar;
- Ultra Düşük Güç Modu
- Standart Mod
- Yüksek Çözünürlüklü Mod
- Ultra Yüksek Çözünürlüklü Mod
Her modun örnekleme, dönüştürme süresi ve akım tüketimi için farklı değerleri vardır. Mesela ilk mod, ultra düşük güç modudur. Bu modda akım tüketimi çok düşük ancak dönüşüm süresi daha fazladır. İşte diğer tüm modlar için değerler.
Mod | Kod | Dahili Örneklerin Numarası | Dönüşüm Süresi (ms) | Akım Tüketimi (maks) |
Ultra düşük güç | 0 | 1 | 4.5 | 3 |
Standart | 1 | 2 | 7.5 | 5 |
Yüksek Çözünürlüklü | 2 | 4 | 13.5 | 7 |
Ultra Yüksek Çözünürlükü | 3 | 8 | 25.5 | 12 |
BMP180 Basınç Sensörü Pin Diyagramı
- VCC pini 3.3-5V’u sensöre bağlamak için kullanılır.
- GND pini, GND’yi sensöre bağlamak için kullanılır.
- SCL ve SDA pinleri, I2C haberleşmesi için kullanılır.
Arduino İle Bmp180 Basınç Sensörü Bağlantı Şeması
Bunun için bir Arduino kütüphanesine ihtiyacımız var. Aşağıdaki butondan kütüphaneyi indirin ve Arduino IDE’ye kurun. Kütüphaneyi yüklemeyi bitirdikten sonra devam edebilirsiniz. Sşağıdaki devreyi kurun.
Hava basıncı, sıcaklık ve irtifa ölçümünün akış şeması:
Arduino İle Bmp180 Basınç Sensörü Kodu
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 pressure;
#define ALTITUDE 1655.0 //replace 1655.0 with your current city altitude
void setup()
{
Serial.begin(9600);
Serial.println("REBOOT");
if (pressure.begin())
Serial.println("BMP180 init success");
else
{
Serial.println("BMP180 init fail\n\n");
while(1);
}
}
void loop()
{
char status;
double T,P,p0,a;
Serial.println();
Serial.print("Provided Altitude: ");
Serial.print(ALTITUDE,0);
Serial.print(" meters, ");
Serial.print(ALTITUDE*3.28084,0);
Serial.println(" feet");
status = pressure.startTemperature();
if (status != 0)
{
delay(status);
status = pressure.getTemperature(T);
if (status != 0)
{
// Print out the measurement:
Serial.print("Temperature: ");
Serial.print(T,2);
Serial.print(" °C, ");
Serial.print((9.0/5.0)*T+32.0,2);
Serial.println(" °F");
status = pressure.startPressure(3);
if (status != 0)
{
delay(status);
status = pressure.getPressure(P,T);
if (status != 0)
{
Serial.print("Absolute Pressure: ");
Serial.print(P,2);
Serial.print(" mb, ");
Serial.print(P*0.0295333727,2);
Serial.println(" inHg");
p0 = pressure.sealevel(P,ALTITUDE);
Serial.print("Relative Pressure(Sea Level): ");
Serial.print(p0,2);
Serial.print(" mb, ");
Serial.print(p0*0.0295333727,2);
Serial.println(" inHg");
a = pressure.altitude(P,p0);
Serial.print("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);
}
Kod Açıklaması
#include <SFE_BMP180.h>
#include <Wire.h>
İlk olarak, BMP180 sensörü için kitaplığı ve I2C arabirimi için kitaplığı ekleyin. Bu iki kütüphane, sensörü Arduino UNO ile arayüzlemek için gerekli tüm fonksiyonları içerecektir.
SFE_BMP180 pressure;
SFE_BMP180 sınıfında bir nesne oluşturun. Kütüphanenin tüm işlevlerine erişmek için bu nesneyi kullanacağız.
#define ALTITUDE 1655.0
Şehrinizin mevcut irtifasını saklamak için ALTITUDE adında bir sabit tanımlayın. 16655.0’ı şehir rakımınızla değiştirin. Google’da bulunduğunuz şehrin rakımını bulabilirsiniz.
void setup()
{
Serial.begin(9600);
setup() fonksiyonunu başlatın ve önce seri iletişim için baud hızını tanımlayın. Arduino UNO’dan sensör verilerini almak ve Seri monitörde görüntülemek için bu seri iletişimi kullanacağız.
if (pressure.begin())
Serial.println("BMP180 init success");
else
{
Serial.println("BMP180 init fail\n\n");
while(1); // Pause forever.
}
}
if ifadesini kullanarak BMP180 sensörünü başlatacağız. Başarılı bir şekilde başlatılırsa, “BMP180 başarılı bir şekilde başlatıldı” mesajını göreceksiniz. Aksi takdirde, “BMP180 init fail” mesajını göreceksiniz. setup() işlevi burada tamamlanmıştır.
void loop()
{
char status;
double T,P,p0,a;
loop() fonksiyonunu başlatın. İlk olarak, hesaplama için gereken tüm değişkenleri tanımlayın. sensörün durumunu saklamak için “durum”, sıcaklık için “T”, basınç için “P”, bağıl basınç için “p0” ve yükseklik için “a”.
Serial.println();
Serial.print("provided altitude: ");
Serial.print(ALTITUDE,0);
Serial.print(" meters, ");
Serial.print(ALTITUDE*3.28084,0);
Serial.println(" feet");
İlk olarak, tarafınızdan verilen Rakımı metre ve ardından inç olarak yazdıracağız.
status = pressure.startTemperature();
startTemperature() fonksiyonunu kullanarak sıcaklığı ölçmeye başlayın ve durumu “status” değişkeninde saklayın. Ölçüm başlatılırsa ‘5’, ‘durum’ değişkeninde saklanır ve ölçüm başlatılmazsa ‘0’, ‘durum’ değişkeninde saklanır.
status = pressure.startTemperature();
Durumun 0’a eşit olup olmadığını kontrol edin. Durum 0’a eşit değilse, if ifadesinin içindeki kod yürütülür. Aksi takdirde, seri monitörde “sıcaklık ölçümü başlatma hatası” yazdırılacaktır.
delay(status);
Durum 0 değilse, durum değeri 5 olduğu için 5 ms’lik duruma eşit bir gecikme verecektir. Bu, sensörün sıcaklığı hesaplamak için aldığı süredir.
status = pressure.getTemperature(T);
getTemperature() işlevini kullanarak sensörden sıcaklık değerini alın ve ‘T’ değişkeninde saklayın. Ve durumu ‘status’ değişkeninde saklayın. Statü değerinin ne olacağını yukarıda belirtmiştim.
if (status != 0)
{
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");
Durum 0’a eşit değilse, önce sıcaklığı °Celsius cinsinden yazdırın ve ardından sıcaklığı °Fahrenhayt cinsinden yazdırın.
status = pressure.startPressure(3);
3, sensörü kullandığınız mod olmak üzere startPressure() fonksiyonunu kullanarak basıncı ölçmeye başlayın. 3, sensörü ultra yüksek çözünürlük modunda kullandığınız anlamına gelir. Durum ayrıca ‘status değişkeninde’ saklanır. Ölçüm başlatılmazsa, ‘status’da saklanan değer 0’dır. Aksi takdirde, mod 0 için 5, mod 1 için 8, mod 2 için 14 ve mod 3 için 26 olacaktır.
if (status != 0)
{
delay(status);
Durum 0’a eşit değilse, if içindeki tüm ifadeleri yürütün. İlk olarak, durum değerine eşit bir gecikme verin. Mod 3’ü kullanıyoruz, bu nedenle gecikme değeri 24 olacaktır. Bu, sensörün basıncı hesaplaması için geçen süredir.
status = pressure.getPressure(P,T);
getPressure() fonksiyonunu kullanarak sensörden basınç verilerini alın ve basınç verilerini ‘P’ değişkeninde saklayın. Doğru basınç değerini elde etmek için sıcaklık değerini de ‘T’ değişkenini kullanarak fonksiyon içerisinden geçtik.
if (status != 0)
{
Serial.print("absolute pressure: ");
Serial.print(P,2);
Serial.print(" mb, ");
Serial.print(P*0.0295333727,2);
Serial.println(" inHg");
status 0’a eşit değilse, önce basınç değerini ‘mb’ milibar cinsinden yazdırın ve ardından basınç değerini cıvanın ‘inHg’ inç cinsinden yazdırın.
p0 = pressure.sealevel(P,ALTITUDE);
Selevel() fonksiyonunu kullanarak basıncı deniz seviyesine göre hesaplayın ve değeri ‘p0’ değişkeninde saklayın. Bunun için fonksiyonda vermiş olduğunuz basınç ve irtifa değerini geçmeniz gerekmektedir. Değeri geçmek için ‘P’ ve ‘ALTITUDE’ değişkenini kullanıyoruz.
Serial.print("relative (sea-level) pressure: ");
Serial.print(p0,2);
Serial.print(" mb, ");
Serial.print(p0*0.0295333727,2);
Serial.println(" inHg");
Göreceli basınç okumalarını seri monitörde ‘mb’ olarak yazdırın, ardından değerleri inHG olarak yazdırın.
a = pressure.altitude(P,p0);
height() fonksiyonunu kullanarak rakım okumasını alın. Yükseklik okumasını alabilmek için fonksiyonda hem basınç(P) hem de mutlak basınç(p0) değerlerine sahip olmanız gerekmektedir.
Serial.print("computed altitude: ");
Serial.print(a,0);
Serial.print(" meters, ");
Serial.print(a*3.28084,0);
Serial.println(" feet");
Önce yüksekliği metre olarak yazdırın ve ardından metreyi 3.28084 ile çarparak yüksekliği inç olarak yazdırın.
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");
Sensör herhangi bir kademede takılıp kalıyor, kademeye göre hata veriyor.
delay(5000);
Son olarak 5000 ms’lik bir gecikme verin.
Sensör çıktısı: