Yükseklik, Basınç, Sıcaklık ve Nem Ölçen “BME280” Sensörü Kullanımı
Arduino projelerinde rahatlıkla kullanabileceğiniz sıcaklık, nem, basınç ve yükseklik ölçümünü tek bir sensör kartı ile yapmayı sağlayan BME280 sensör kartından bahsedeceğim. Kartın üzerindeki sensör Bosch firmasının geliştirdiği sensördür. Sparkfun firması da arduino uygulamalarında kullanmamız için sensör için platform ve arduino kütüphanesi geliştirmiştir. Ayrıca adafruit, seeed studio gibi firmalarında kendilerine göre tasarladıkları aynı modeldeki sensör kartları mevcuttur.
Bağıl veya mutlak yükseklik değişikliklerini almak için barometrik basınç değeri referans alınarak hesaplanır.
BME280 Özellikleri:
- Sıcaklık ölçümü : -40C ile 85C arası.
- Nem:% 0-100 RH,% -3-% 20-80 arası.
- Basınç aralığı: 30.000 Pa ile 110.000 Pa, 12Pa’lık göreceli doğruluk ve 100Pa mutlak doğruluk.
- Rakım: 0 ile 30.000 ft (9.2 km), Deniz seviyesinde 3.3 ft’lik (1 m) göreceli doğruluk.
Sensör I2C veya SPI iletişim protokolleri üzerinden haberleşme sağlar. Çalışırken 1mA’den daha düşük ve boşta 5uA’den düşük akım harcar. Enerji konusunda oldukça tasarruflu diyebiliriz.
3.6V’dan daha yüksek voltajlarda çalıştırılması IC’ye kalıcı hasar verebilir. Ondan dolayı Arduino’nuzun 3.3V’luk besleme girişinden beslemelisiniz. I2C’yi kullanırken herhangi bir ekstra seviye değiştiriciye ihtiyacınız olmaz. Ancak, SPI kullanmak istiyorsanız, lojik Seviyesi dönüştürücüsü kullanmanız gerekir.
Arduino ile I2C Üzerinden Bağlantısı:
Arduino ile SPI Üzerinden Bağlantısı:
SPI ile bağlantı yaparken lojik seviye dönüştürücüsü kullanmanız gerekiyor. aşağıdaki şekilde breadboard üzerindeki üstteki lojik seviye dönüştürücüdür.
BME280 Arduino Kütüphanesi : BME280 Kütüphane
Kütüphane Fonksiyonları ve Örnek Uygulama:
Kütüphane Fonksiyonları:
#include <stdint.h> #include "SparkFunBME280.h" #include "Wire.h" #include "SPI.h" //Global sensor object BME280 mySensor; void setup() { //***Driver settings********************************// //commInterface can be I2C_MODE or SPI_MODE //specify chipSelectPin using arduino pin names //specify I2C address. Can be 0x77(default) or 0x76 //For I2C, enable the following and disable the SPI section mySensor.settings.commInterface = I2C_MODE; mySensor.settings.I2CAddress = 0x77; //For SPI enable the following and dissable the I2C section //mySensor.settings.commInterface = SPI_MODE; //mySensor.settings.chipSelectPin = 10; //***Operation settings*****************************// //runMode can be: // 0, Sleep mode // 1 or 2, Forced mode // 3, Normal mode mySensor.settings.runMode = 3; //Forced mode //tStandby can be: // 0, 0.5ms // 1, 62.5ms // 2, 125ms // 3, 250ms // 4, 500ms // 5, 1000ms // 6, 10ms // 7, 20ms mySensor.settings.tStandby = 0; //filter can be off or number of FIR coefficients to use: // 0, filter off // 1, coefficients = 2 // 2, coefficients = 4 // 3, coefficients = 8 // 4, coefficients = 16 mySensor.settings.filter = 0; //tempOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.tempOverSample = 1; //pressOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.pressOverSample = 1; //humidOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.humidOverSample = 1; delay(10); //Make sure sensor had enough time to turn on. BME280 requires 2ms to start up. Serial.begin(57600); Serial.print("Starting BME280... result of .begin(): 0x"); //Calling .begin() causes the settings to be loaded Serial.println(mySensor.begin(), HEX); }
- ” BME280 mySensor; ” Bu fonksiyon global kapsamda sensör nesnenizi oluşturur. Örnekte mySensor adında global nesne tanımlandı.
- “ begin(); “ Sensörü başlatmak için kullanılır.
- ” reset() ” Sensörü sıfırlar ve yeniden başlatır.
- ” readTempC() ” Sıcaklığı Celsius cinsinden okumamızı sağlar.
Örnek :
float myVar = mySensor.readTempC();
- ” readTempF() ” Sıcaklığı Fahrenhayt cinsinden okumamızı sağlar.
Örnek:
float myVar = mySensor.readTempF();
- ” readFloatPressure() ” Basıncı kilopaskal (kPa) cinsinden okumamızı sağlar.
Örnek :
float myVar = mySensor.readFloatPressure();
- ” readFloatAltitudeMeters() ” Ölçülen basıncı referans alarak yüksekliği metre cinsinden okumamızı sağlar.
Örnek :
float myVar = mySensor.readFloatAltitudeMeters();
- ” readFloatAltitudeFeet() ” Ölçülen basıncı referans alarak yüksekliği fit cinsinden okumamızı sağlar.
Örnek :
float myVar = mySensor.readFloatAltitudeFeet();
- ” readFloatHumidity() ” Yüzdelik nem değerini okumamızı sağlar.
Örnek:
float myVar = mySensor.readFloatHumidity();
Örnek Kod:
Kütüphaneden CSV_Output.ino örnek kodunu açın ya da aşağıdan kopyalayalım ve arduinoya yükleyelim.
#include <stdint.h> #include "SparkFunBME280.h"</p> #include "Wire.h" #include "SPI.h" //Global sensor object BME280 mySensor; unsigned int sampleNumber = 0; //For counting number of CSV rows void setup() { //***Driver settings********************************// //commInterface can be I2C_MODE or SPI_MODE //specify chipSelectPin using arduino pin names //specify I2C address. Can be 0x77(default) or 0x76 //For I2C, enable the following and disable the SPI section mySensor.settings.commInterface = I2C_MODE; mySensor.settings.I2CAddress = 0x77; //For SPI enable the following and dissable the I2C section //mySensor.settings.commInterface = SPI_MODE; //mySensor.settings.chipSelectPin = 10; //***Operation settings*****************************// mySensor.settings.runMode = 3; // 3, Normal mode mySensor.settings.tStandby = 0; // 0, 0.5ms mySensor.settings.filter = 0; // 0, filter off //tempOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.tempOverSample = 1; //pressOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.pressOverSample = 1; //humidOverSample can be: // 0, skipped // 1 through 5, oversampling *1, *2, *4, *8, *16 respectively mySensor.settings.humidOverSample = 1; Serial.begin(57600); Serial.print("Program Started\n"); Serial.print("Starting BME280... result of .begin(): 0x"); delay(10); //Make sure sensor had enough time to turn on. BME280 requires 2ms to start up. //Calling .begin() causes the settings to be loaded Serial.println(mySensor.begin(), HEX); //Build a first-row of column headers Serial.print("\n\n"); Serial.print("Sample,"); Serial.print("T(deg C),"); Serial.print("T(deg F),"); Serial.print("P(Pa),"); Serial.print("Alt(m),"); Serial.print("Alt(ft),"); Serial.print("%RH"); Serial.println(""); } void loop() { //Print each row in the loop //Start with temperature, as that data is needed for accurate compensation. //Reading the temperature updates the compensators of the other functions //in the background. Serial.print(sampleNumber); Serial.print(","); Serial.print(mySensor.readTempC(), 2); Serial.print(","); Serial.print(mySensor.readTempF(), 3); Serial.print(","); Serial.print(mySensor.readFloatPressure(), 0); Serial.print(","); Serial.print(mySensor.readFloatAltitudeMeters(), 3); Serial.print(","); Serial.print(mySensor.readFloatAltitudeFeet(), 3); Serial.print(","); Serial.print(mySensor.readFloatHumidity(), 0); Serial.println(); sampleNumber++; delay(50); }
Aşağıdaki gibi I2C pinleri üzerinden arduinoya bağlayın. Sensörü şişenin içine yada basınçlı kapalı bir yere koyarsanız basınç farkını daha iyi görebilirsiniz.
Serial monitörü açtığınızda aşağıdaki gibi sıcaklık, nem, basınç, yükseklik değerlerini görebilirsiniz.
Kaynak : SparkFun BME280
haberleşme baund neden farklı 9600 deil…?