İçindekiler:

BMP280 ve BME280 için Kitaplık: 7 Adım
BMP280 ve BME280 için Kitaplık: 7 Adım

Video: BMP280 ve BME280 için Kitaplık: 7 Adım

Video: BMP280 ve BME280 için Kitaplık: 7 Adım
Video: Lesson 30: BMP280 Temperature Sensor with LCD1602 | Arduino Step By Step Course 2024, Temmuz
Anonim
BMP280 ve BME280 için kitaplık
BMP280 ve BME280 için kitaplık
BMP280 ve BME280 için kitaplık
BMP280 ve BME280 için kitaplık
BMP280 ve BME280 için kitaplık
BMP280 ve BME280 için kitaplık

Tanıtım

Bu kütüphaneyi yazmak için yola çıkmadım. BMP280 kullanan başlattığım bir projenin yan etkisi olarak "oldu". Bu proje henüz bitmedi ama kütüphanenin başkalarıyla paylaşmaya hazır olduğunu düşünüyorum. Daha sonra, BMP280'in basınç ve sıcaklık kapasitesine nem ölçümü ekleyen bir BME280 kullanma ihtiyacı duydum. BME280, BMP280 ile "geriye dönük uyumludur" - yani, BME280'den basınç ve sıcaklığı okumak için gereken tüm kayıtlar ve adımlar, BMP280 için kullanılanlarla aynıdır. Yalnızca BME280 için geçerli olan, nemi okumak için gereken ek kayıtlar ve adımlar vardır. Bu, her ikisi için bir kitaplık veya iki ayrı kitaplık sorusunu gündeme getiriyor. İki cihaz tipi için donanım tamamen değiştirilebilir. Hatta satılan modüllerin çoğu (örneğin Ebay ve AliExpress'te) BME/P280 olarak etiketlenmiştir. Hangi tip olduğunu bulmak için sensörün üzerindeki (minik) yazıya bakmanız veya cihaz ID baytını test etmeniz gerekir. Tek bir kütüphaneye gitmeye karar verdim. Tamam işe yaramış gibi görünüyor.

Geri bildirim, özellikle iyileştirmeler için herhangi bir öneri takdir edilecektir.

Kütüphane özellikleri ve yetenekleri

Kitaplık, bir programcının, tüm ince ayrıntılarla uğraşmak zorunda kalmadan aygıtın yeteneklerini kullanması için bir Uygulama Programlama Arayüzü (API) sağlayan bir yazılım parçasıdır. İstenen bir şekilde, API'nin başlangıç için basit gereksinimleri olan yeni başlayanlar için kolay olması ve aynı zamanda cihaz özelliklerinden tam olarak yararlanılmasını sağlaması gerekir. İstenen bir şekilde kitaplık, genel yazılım iyi uygulamalarının yanı sıra cihaz üreticisinin belirli yönergelerini takip etmelidir. Bunların hepsini başarmak için çaba sarf ettim. BMP280 ile başlarken onun için 3 farklı kütüphane buldum: Adafruit_BMP280; Seeed_BMP280; ve bir tanesi cihaz üreticisinden BMP280 olarak adlandırıldı. Ne Adafruit ne de Seeed, iyi çalışmasına ve temel uygulamalar için kullanımı kolay olmasına rağmen, genişletilmiş yetenekler sağlamadı. Cihaz üreticisinin (Bosch Sensortec) ürettiğini nasıl kullanacağımızı çözemedim. Bu onların eksikliğinden ziyade benim eksikliğim olabilir. Ancak kütüphane diğer ikisinden çok daha karmaşıktı, herhangi bir talimat veya kullanım örneği bulamadım (daha sonra örneklerin "bmp280_support.c" dosyasında olduğunu buldum, ancak bunlar bana özellikle yardımcı olmadı).

Bu etkenler sonucunda BMP280 için kendi kütüphanemi yazmaya karar verdim.

BME280 için kitaplık durumuna baktığımda, Adafruit_BME280, Seed_BME280 ve Embedded Adventures tarafından yazılmış ayrı bir BME280_MOD-1022 kitaplığı buldum. Hiçbiri BMP280 işlevlerini BME280'i kullanabilen bir kitaplıkta birleştirmedi. Bunların hiçbiri, cihaz ve onun kontrol eden mikroişlemcisi uyku halindeyken cihazların birkaç bitlik veriyi depolama kabiliyetini açıkça desteklemedi (bu yetenek veri sayfasında açıkça görülüyor ve burada yazdığım ve tanımladığım kitaplıkta destekleniyor).

Birleşik bir kitaplık, BME280'in tüm özelliklerini desteklemelidir, ancak bir BMP280 ile kullanıldığında, kullanılmayan işlevlerden herhangi bir ek yük getirmemelidir. Birleşik kitaplığın avantajları arasında, yönetilecek daha az kitaplık dosyası, aynı projede farklı cihazların kolayca karıştırılıp eşleştirilebilmesi ve iki yerine yalnızca tek bir yerde yapılması gereken bakım veya yükseltmeler için basitleştirilmiş değişiklikler yer alır. Bunların hepsi muhtemelen oldukça küçük, hatta önemsizdir, ancak…

Cihaz özellikleri

BMP280 ve BME280, yaklaşık 5 mm kare ve 1 mm yüksekliğinde yüzeye monte cihazlardır. 2 ayrı güç giriş pedi ve iki Zemin pedi dahil olmak üzere 8 arabirim pedi vardır. eBay'de 4 veya 6 pinli bir modül olarak mevcutturlar. 4 pinli modülün sabit bir I2C adresi vardır ve SPI protokolünü kullanmak üzere yapılandırılamaz.

6 pinli modül veya çıplak cihaz, I2C veya SPI protokolleri ile kullanılabilir. I2C modunda iki farklı adrese sahip olabilir, SDO pinini Ground'a (temel adres için = 0x76) veya Vdd'ye (temel adres için +1 = 0x77) bağlayarak elde edilir. SPI modunda, 1 saat, 2 veri (her yön için bir tane) ve bir cihaz seçme pininden (CS) oluşan olağan düzenlemeye sahiptir.

Burada yazdığım ve anlattığım kütüphane sadece I2C'yi destekliyor. Adafruit_BMP280 ve BME_MOD-1022 kitaplıkları hem i2C hem de SPI'yi destekler.

Kütüphane buradan indirilebilir:

github.com/farmerkeith/BMP280-library

Adım 1: Donanımı Kurma

Donanımı Kurma
Donanımı Kurma

Kütüphanenin yararlı olabilmesi için önce BMP280'e (veya isterseniz ikisine) bir mikrodenetleyici bağlamak gerekir.

Bir WeMos D1 mini pro kullandım, bu yüzden bağlantılarını göstereceğim. Diğer mikrodenetleyiciler benzer olacaktır, sadece SDA ve SCL pinlerini doğru şekilde bağlamanız yeterlidir.

WeMos D1 mini pro söz konusu olduğunda, bağlantılar şunlardır:

İşlev WeMos pini BMP280 pini Notlar

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Toprak GND Adres kontrolü SDO Toprak veya Vdd I2C CSB Vdd'yi seçer (GND, SPI'yi seçer)

Bazı MP280 modüllerindeki SDO pininin SDD olarak etiketlendiğini ve Vdd pininin VCC olarak etiketlenebileceğini unutmayın. Not: SDA ve SCL hatlarında, hat ile Vin pini arasında pull-up dirençleri bulunmalıdır. Tipik olarak 4.7K'lık bir değer uygun olmalıdır. Bazı BMP280 ve BME280 modüllerinde, modülde 10K çekme dirençleri bulunur (bu iyi bir uygulama değildir, çünkü I2C veriyoluna birden fazla cihaz koymak onu aşırı yükleyebilir). Bununla birlikte, her biri 10K dirençli 2 BME/P280 modülünün kullanılması, aynı veriyolu üzerinde ayrıca pull-up dirençli çok fazla başka cihaz olmadığı sürece, pratikte bir sorun olmamalıdır.

Donanımı bağladıktan sonra, burada bulabileceğiniz I2CScan_ID taslağını çalıştırarak cihazınızın bir BMP280 veya BME280 olup olmadığını kolayca kontrol edebilirsiniz:

Ayrıca cihazın kendisine bakarak bir BMP280 veya BME280'iniz olup olmadığını kontrol edebilirsiniz. Bunu yapmak için bir dijital mikroskop kullanmayı gerekli buldum, ancak görüşünüz çok iyiyse, bunu herhangi bir yardım almadan yapabilirsiniz. Cihazın kasası üzerinde iki satır baskı bulunmaktadır. Anahtar, ikinci satırdaki ilk harftir; bu, BMP280 cihazları için "K" ve BME280 cihazları için "U"dur.

2. Adım: Kitaplık Tarafından Sağlanan API'ler

Kütüphane Tarafından Sağlanan API'ler
Kütüphane Tarafından Sağlanan API'ler
Kütüphane Tarafından Sağlanan API'ler
Kütüphane Tarafından Sağlanan API'ler

Kütüphaneyi bir çizime dahil etme

Kitaplık, ifade kullanılarak standart bir şekilde bir çizime dahil edilir.

#include "farmerkeith_BMP280.h"

Bu ifadenin setup() fonksiyonunun başlangıcından önce çizimin ilk kısmına dahil edilmesi gerekir.

Bir BME veya BMP yazılım nesnesi oluşturma

BMP280 yazılım nesnesini oluşturmak için 3 seviye vardır. En basiti sadece

bme280 nesneAdı; veya bmp280 nesneAdı;

örneğin, BMP280 bmp0;

Bu, varsayılan adresi 0x76 olan bir yazılım nesnesi oluşturur (yani, toprağa bağlı SDO için).

Bir BME280 veya BMP280 yazılım nesnesi oluşturmak için bir sonraki seviye, aşağıdaki gibi 0 veya 1 parametresine sahiptir:

bme280 nesneAdıA(0);

bmp280 nesneAdıB(1);

Parametre (0 veya 1), aynı I2C veriyolunda (her biri dahil) iki BME280 veya BMP280 cihazının kullanılabilmesi için I2C temel adresine eklenir.

Bir BME veya BMP280 yazılım nesnesi oluşturmaya yönelik üçüncü seviyenin iki parametresi vardır. 0 veya 1 olan ilk parametre, önceki durumda olduğu gibi adres içindir. İkinci parametre hata ayıklama yazdırmayı kontrol eder. 1 olarak ayarlanırsa, yazılım nesnesi ile yapılan her işlem, programcının işlemin ayrıntılarını görmesini sağlayan Serial.print çıktıları ile sonuçlanır. Örneğin:

bmp280 nesneAdıB(1, 1);

Hata ayıklama yazdırma parametresi 0 olarak ayarlanırsa, yazılım nesnesi normal davranışa döner (yazdırma yok).

Bu deyimin veya deyimlerin #include'den sonra ve setup() işlevinden önce dahil edilmesi gerekir.

BME veya BMP yazılım nesnesini başlatma

Kullanılmadan önce, cihazdan kalibrasyon parametrelerinin okunması ve hangi ölçüm modu, aşırı örnekleme ve filtre ayarları uygunsa yapılandırılması gerekir.

Basit, genel amaçlı bir başlatma için ifade şöyledir:

nesneAdı.begin();

start()'ın bu versiyonu cihazdan kalibrasyon parametrelerini okur ve osrs_t=7 (16 sıcaklık ölçümü), osrs_p=7 (16 basınç ölçümü), mode=3 (sürekli, Normal), t_sb=0 (0,5 ms uyku arası) olarak ayarlar. ölçüm setleri), filter=0 (K=1, yani filtreleme yok) ve spiw_en=0 (SPI devre dışı, bu nedenle I2C kullanın). BME280 durumunda, 16 nem ölçümü için ekstra bir osrs_h=7 parametresi vardır.

Altı (veya 7) parametrenin tümünü alan başka bir başlangıç() sürümü vardır. Yukarıdaki ifadenin eşdeğeri

nesneAdı.begin(7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, mod, t_sb, filtre, spiw_en

veya objectName.begin(7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mod, t_sb, filtre, spiw_en, osrs_h

Kodların tam listesi ve anlamları BME280 ve BMP280 veri sayfasında ve ayrıca kitaplıktaki.cpp dosyasındaki yorumlardadır.

Basit sıcaklık ve basınç ölçümü

Bir sıcaklık ölçümü almanın en basit yolu

çift sıcaklık=nesneAdı.readTemperature (); // sıcaklığı ölç

Bir basınç ölçümü almanın en basit yolu

çift basınç=nesneAdı.readPressure(); // basıncı ölç

Nem ölçümü almanın en basit yolu

çift nem=nesneAdı.readHumidity (); // nemi ölç (yalnızca BME280)

Hem sıcaklık hem de basınç elde etmek için yukarıdaki iki ifade arka arkaya kullanılabilir, ancak başka bir seçenek daha vardır:

çift sıcaklık;

çift basınç=nesneAdı.readPressure (sıcaklık); // basınç ve sıcaklığı ölçün

Bu ifade, BME280 veya BMP280 cihazından gelen verileri yalnızca bir kez okur ve hem sıcaklık hem de basınç döndürür. Bu, I2C veri yolunun biraz daha verimli kullanımıdır ve iki okumanın aynı ölçüm döngüsüne karşılık gelmesini sağlar.

BME 280 için, üç değeri de (nem, sıcaklık ve basınç) alan birleşik bir ifade şöyledir:

çift sıcaklık, basınç;çift nem=nesneAdı.readNem (sıcaklık, basınç); // nem, basınç ve sıcaklığı ölçün

Bu ifade, BMP280 cihazından gelen verileri yalnızca bir kez okur ve üç değeri de döndürür. Bu, I2C veri yolunun biraz daha verimli kullanımıdır ve üç okumanın aynı ölçüm döngüsüne karşılık gelmesini sağlar. Değişkenlerin adlarının kullanıcının istediği herhangi bir şeyle değiştirilebileceğini, ancak sıralarının sabit olduğunu unutmayın - sıcaklık önce gelir ve basınç ikinci sırada gelir.

Bu kullanım durumları, basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino ve basicHumidityAndTemperatureAndPressure.ino olmak üzere kitaplıkla birlikte sağlanan örnek çizimlerde ele alınmıştır.

Daha gelişmiş sıcaklık ve basınç ölçümü

Yukarıdaki ifade dizisi sorunsuz çalışacak olsa da, birkaç sorun var:

  1. cihaz sürekli çalışıyor ve bu nedenle maksimum düzeyde güç tüketiyor. Enerji bir pilden geliyorsa, bunu azaltmak gerekebilir.
  2. tüketilen güç nedeniyle cihaz ısınmaya uğrayacak ve bu nedenle ölçülen sıcaklık ortam sıcaklığından daha yüksek olacaktır. Bunu daha sonraki bir adımda ele alacağım.

Daha az güç kullanan ve ortama daha yakın bir sıcaklık veren bir sonuç, onu uyku moduna geçiren parametrelerle (örn. mode=0) start() kullanılarak elde edilebilir. Örneğin:

objectName.begin(1, 1, 0, 0, 0, 0[, 1]); // osrs_t, osrs_p, mod, t_sb, filtre, spiw_en [, osrs_h]

Ardından, bir ölçüm yapmak istendiğinde, uygun osrs_h, osrs_t ve osrs_p, plus mode=1 (tek çekim modu) değerlerini ayarlayan F2 (gerekirse) ve F4'ü kaydetmek için bir yapılandırma komutuyla cihazı uyandırın. Örneğin:

[objectName.updateF2Control(1);] // osrs_h - BMP280 için hiçbir zaman gerekli değildir, // ve BME280 için gerekli değildir, eğer ölçüm sayısı değiştirilmiyorsa // start() içinde sağlanan değerden. nesneAdı.updateF4Control(1, 1, 1); // osrs_t, osrs_p, mod

Cihazı uyandırdıktan sonra ölçüm yapmaya başlayacaktır, ancak sonuç birkaç milisaniye için mevcut olmayacaktır - belirtilen ölçüm sayısına bağlı olarak en az 4 ms, belki 70 ms'ye kadar veya daha fazla. Okuma komutu hemen gönderilirse, cihaz önceki ölçümün değerlerini döndürür - bu bazı uygulamalarda kabul edilebilir olabilir, ancak çoğu durumda yeni ölçüm mevcut olana kadar ertelemek muhtemelen daha iyidir.

Bu gecikme birkaç şekilde yapılabilir.

  1. beklenen en uzun gecikmeyi kapatmak için sabit bir süre bekleyin
  2. ölçüm başına maksimum ölçüm süresi (yani 2.3ms) çarpı ölçüm sayısı artı ek yük artı bir marjdan hesaplanan bir süre bekleyin.
  3. yukarıdaki gibi hesaplanan daha kısa bir süre bekleyin, ancak nominal ölçüm süresini (yani 2 ms) artı ek yükü kullanarak ve ardından durum kaydındaki "Ölçüyorum" bitini kontrol etmeye başlayın. Durum biti 0 okuduğunda (yani ölçülmediğinde), sıcaklık ve basınç okumalarını alın.
  4. hemen durum kaydını kontrol etmeye başlayın ve durum biti 0 okuduğunda sıcaklık ve basınç okumalarını alın,

Bunu yapmanın bir yolunun bir örneğini biraz sonra göstereceğim.

Yapılandırma kayıt işlemleri

Tüm bunları gerçekleştirmek için henüz tanıtmadığım birkaç araca ihtiyacımız var. Onlar:

bayt okumaKayıt(reg)

void updateRegister(reg, value)

Bunların her birinin kitaplıkta, belirli eylemler için yazılımı biraz daha basit hale getiren birkaç türetilmiş komut vardır.

powerSaverPressureAndTemperature.ino örneği, 3 numaralı yöntemi kullanır. Tekrarlanan denetimi yapan kod satırı:

while (bmp0.readRegister(0xF3)>>3); // F3bit 3'e kadar döngü ==0

Bu çizimin bir ESP8266 mikro denetleyicisi için olduğunu unutmayın. WeMos D1 mini pro kullandım. Taslak, uyumak için farklı talimatları olan Atmega mikrodenetleyicileriyle çalışmayacak. Bu eskiz birkaç başka komutu çalıştırıyor, bu yüzden bu çizimi daha ayrıntılı olarak tanımlamadan önce hepsini tanıtacağım.

Mikrodenetleyici, BMP280 sensörü ile paralel olarak uyurken, gerekli ölçümler için sensörün konfigürasyonu, 6 parametre kullanılarak start() komutunda yapılabilir. Ancak mikrodenetleyici uykuda değilse ve sensör uyuyorsa, ölçüm sırasında sensör uyandırılmalı ve ölçüm konfigürasyonu söylenmelidir. Bu doğrudan ile yapılabilir

updateRegister(reg, value)

ancak aşağıdaki üç komutla biraz daha kolaydır:

updateF2Control(osrs_h); // yalnızca BME280

updateF4Control(osrs_t, osrs_p, mod); updateF5Config(t_sb, filtre, spi3W_en);

Ölçüm yapıldıktan sonra kullanılan mod Tek atış (Zorunlu mod) ise cihaz otomatik olarak uyku moduna geçecektir. Ancak ölçüm seti, sürekli (Normal) mod kullanılarak birden fazla ölçüm içeriyorsa, BMP280'in tekrar uyku moduna alınması gerekecektir. Bu, aşağıdaki iki komuttan biri ile yapılabilir:

updateF4Control16xSleep();

updateF4ControlSleep(değer);

Bunların her ikisi de mod bitlerini 00'a ayarlar (yani uyku modu). Ancak ilki osrs_t ve osrs_p'yi 111'e ayarlar (yani 16 ölçüm), ikincisi "değerden" düşük 6 biti 0xF4 kaydının 7:2 bitlerine depolar.

Benzer şekilde, aşağıdaki ifade, düşük altı "değer" bitini 0xF5 kaydının 7:2 bitlerine depolar.

updateF5ConfigSleep(değer);

Bu son komutların kullanımı, 12 bitlik bilginin BMP280 register F4 ve F5'te depolanmasını sağlar. En azından ESP8266 durumunda, mikrodenetleyici bir uyku periyodundan sonra uyandığında, uyku komutundan önceki durumu hakkında hiçbir bilgisi olmadan çizimin başlangıcında başlar. Uyku komutundan önceki durumuna ilişkin bilgileri depolamak için, veriler ya EEPROM işlevleri kullanılarak ya da SPIFFS kullanılarak bir dosya yazılarak flash bellekte saklanabilir. Ancak flash belleğin 10.000 ila 100.000 arasında yazma döngüsü sayısı sınırlaması vardır. Bu, mikrodenetleyicinin birkaç saniyede bir uyku-uyanma döngüsünden geçmesi durumunda izin verilen bellek yazma sınırını aşabileceği anlamına gelir. birkaç ay içinde sınırlayın. BMP280'de birkaç bit veri depolamanın böyle bir sınırlaması yoktur.

F4 ve F5 kayıtlarında saklanan veriler, mikrodenetleyici komutları kullanarak uyandığında kurtarılabilir.

readF4Sleep();

readF5Sleep();

Bu işlevler karşılık gelen kaydı okur, içeriği 2 LSB'yi çıkarmak için kaydırır ve kalan 6 biti döndürür. Bu işlevler, powerSaverPressureAndTemperatureESP.ino örneğinde aşağıdaki gibi kullanılır:

// EventCounter'ın değerini bmp0'dan oku

bayt bmp0F4value= bmp0.readF4Sleep(); // 0 ila 63 bayt bmp0F5value= bmp0.readF5Sleep(); // 0 - 63 eventCounter= bmp0F5değeri*64+bmp0F4değeri; // 0 - 4095

Bu işlevler karşılık gelen kaydı okur, içeriği 2 LSB'yi çıkarmak için kaydırır ve kalan 6 biti döndürür. Bu işlevler, powerSaverPressureAndTemperature.ino örneğinde aşağıdaki gibi kullanılır:

// EventCounter'ın değerini bmp1'den oku

bayt bmp1F4value= bmp1.readF4Sleep(); // 0 ila 63 bayt bmp1F5value= bmp1.readF5Sleep(); // 0 - 63 eventCounter= bmp1F5değeri*64+bmp1F4değeri; // 0 - 4095

Ham sıcaklık ve basınç fonksiyonları

Temel readTemperature, readPressure ve readHumidity fonksiyonlarının iki bileşeni vardır. Önce BME/P280'den ham 20 bitlik sıcaklık ve basınç değerleri elde edilir veya BME280'den ham 16 bitlik nem değeri elde edilir. Ardından, çıktı değerlerini Celsius, hPa veya %RH cinsinden üretmek için kompanzasyon algoritması kullanılır.

Kütüphane, bu bileşenler için ayrı işlevler sağlar, böylece ham sıcaklık, basınç ve nem verileri elde edilebilir ve belki de bir şekilde manipüle edilebilir. Bu ham değerlerden sıcaklık, basınç ve nemi türetecek algoritma da sağlanmıştır. Kütüphanede bu algoritmalar, çift uzunluklu kayan nokta aritmetiği kullanılarak uygulanır. 32 bit işlemci olan ve "çift" kayan değişkenler için 64 bit kullanan ESP8266'da iyi çalışır. Bu işlevleri erişilebilir kılmak, diğer platformlar için hesaplamayı değerlendirmek ve muhtemelen değiştirmek için yararlı olabilir.

Bu işlevler şunlardır:

readRawPressure (hamSıcaklık); // BME/P280readRawHumidity'den (rawTemperature, rawPressure) ham basınç ve sıcaklık verilerini okur; // BME280 calcTemperature'dan (rawTemperature, t_fine) ham nem, sıcaklık ve basınç verilerini okur; calcPressure (rawPressure, t_fine); calcNem (hamNem, t_fine)

Bu işlevlerin "t-ince" argümanı biraz açıklamaya değer. Hem basınç hem de nem dengeleme algoritmaları, t_fine değişkeni aracılığıyla elde edilen sıcaklığa bağlı bir bileşen içerir. calcTemperature işlevi, sıcaklık telafisi algoritması mantığına dayalı olarak t_fine içinde bir değer yazar, bu daha sonra hem calcPressure hem de calcHumidity'de bir giriş olarak kullanılır.

Bu işlevlerin kullanımına ilişkin bir örnek, rawPressureAndTemperature.ino örnek çiziminde ve ayrıca kitaplığın.cpp dosyasındaki readHumidity() işlevi kodunda bulunabilir.

Rakım ve Deniz Seviyesi basıncı

Atmosferik basınç ile irtifa arasında bilinen bir ilişki vardır. Hava durumu da basıncı etkiler. Hava durumu kuruluşları atmosferik basınç bilgilerini yayınladıklarında, genellikle bunu yüksekliğe göre ayarlarlar ve bu nedenle "sinoptik çizelge", deniz seviyesi anlamına gelen standartlaştırılmış izobarları (sabit basınç çizgileri) gösterir. Yani gerçekten bu ilişkide 3 değer var ve bunlardan ikisini bilmek üçüncünün türetilmesini sağlıyor. 3 değer şunlardır:

  • deniz seviyesinden yükseklik
  • o irtifada gerçek hava basıncı
  • deniz seviyesinde eşdeğer hava basıncı (daha kesin olarak, deniz seviyesi anlamına gelir, çünkü anlık deniz seviyesi sürekli değişir)

Bu kitaplık, bu ilişki için aşağıdaki gibi iki işlev sağlar:

calcAltitude (basınç, seaLevelhPa);

calcNormalizedPressure (basınç, yükseklik);

Ayrıca 1013,15 hPa'lık standart deniz seviyesi basıncını kabul eden basitleştirilmiş bir versiyon da vardır.

calcAltitude (basınç); // standart seaLevelPressure varsayıldı

3. Adım: BMP280 Cihaz Ayrıntıları

BMP280 Cihaz Ayrıntıları
BMP280 Cihaz Ayrıntıları

Donanım yetenekleri

BMP280, çoklu ölçüm ve veri çıkış seçeneklerini kontrol etmek için kullanılan 2 bayt konfigürasyon verisine (0xF4 ve 0xF5 kayıt adreslerinde) sahiptir. Ayrıca, ham sıcaklık ve basınç değerlerinin geleneksel sıcaklık ve basınç birimlerine dönüştürülmesinde kullanılan 2 bit durum bilgisi ve 24 bayt kalibrasyon parametresi sağlar. BME280 aşağıdaki gibi ek verilere sahiptir:

  • Çoklu nem ölçümlerini kontrol etmek için kullanılan 0xF2 kayıt adresinde 1 ekstra bayt konfigürasyon verisi;
  • Ham nem değerini bağıl nem yüzdesine dönüştürmek için kullanılan 8 ekstra bayt kalibrasyon parametresi.

BME280 için sıcaklık, basınç ve durum kayıtları, aşağıdaki gibi küçük istisnalar dışında BMP280 ile aynıdır:

  • BME280'in "ID" bitleri 0x60'a ayarlanmıştır, bu nedenle 0x56, 0x57 veya 0x58 olabilen BMP280'den ayırt edilebilir
  • uyku süresi kontrolü (t_sb), BMP280'deki (2000 ms ve 4000 ms) iki uzun sürenin BME280'de 10 ms ve 20 ms'lik kısa sürelerle değiştirileceği şekilde değiştirilir. BME280'deki maksimum uyku süresi 1000 ms'dir.
  • BME280'de, filtreleme uygulanıyorsa, sıcaklık ve basınç ham değerleri her zaman 20 bittir. 16 ila 19 bit değerlerinin kullanımı, filtreleme olmayan durumlarla sınırlıdır (yani filtre=0).

Sıcaklık ve basınç, sıcaklık için 3 16 bit kalibrasyon parametresi ve 9 16 bit kalibrasyon parametresi artı basınç için sıcaklık kullanılarak oldukça karmaşık bir algoritma aracılığıyla geleneksel sıcaklık ve basınca dönüştürülmesi gereken 20 bitlik değerlerdir. Sıcaklık ölçümünün tanecikliği, en az anlamlı bit değişimi (20 bit okuma) için 0.0003 santigrat derecedir ve 16 bit okuma kullanılırsa 0.0046 santigrat dereceye yükselir.

Nem, 8, 12 ve 16 bitlik bir karışım olan 6 kalibrasyon parametresi kullanılarak başka bir karmaşık algoritma aracılığıyla bağıl neme dönüştürülmesi gereken 16 bitlik bir değerdir.

Veri sayfası, sıcaklık okumasının mutlak doğruluğunu 25 C'de +-0,5 C ve 0 ila 65 C aralığında +-1 C olarak gösterir.

Basınç ölçümünün ayrıntı düzeyi, 20 bit çözünürlükte 0,15 Paskal (yani 0,0015 hektoPaskal) veya 16 bit çözünürlükte 2,5 Paskal'dır. Ham basınç değeri sıcaklıktan etkilenir, böylece 25C civarında, 1 derece C'lik bir sıcaklık artışı ölçülen basıncı 24 Pascal azaltır. Kalibrasyon algoritmasında sıcaklık hassasiyeti hesaba katılır, bu nedenle iletilen basınç değerleri farklı sıcaklıklarda doğru olmalıdır.

Veri sayfası, 0 C ile 65 C arasındaki sıcaklıklar için basınç okumasının mutlak doğruluğunu +-1 hPa olarak gösterir.

Nemin doğruluğu veri sayfasında +-%3 RH ve +-%1 histerezis olarak verilmiştir.

Nasıl çalışır

24 baytlık sıcaklık ve basınç kalibrasyon verileri ve ayrıca BME280 durumunda 8 baytlık nem kalibrasyon verilerinin cihazdan okunması ve değişkenlerde saklanması gerekir. Bu veriler fabrikada cihaza ayrı ayrı programlanmıştır, bu nedenle farklı cihazlar farklı değerlere sahiptir - en azından bazı parametreler için. Bir BME/P280 iki durumdan birinde olabilir. Bir durumda ölçüyor. Diğer durumda bekliyor (uyuyor).

Hangi durumda olduğu 0xF3 kaydının 3. bitine bakılarak kontrol edilebilir.

En son ölçümün sonuçları, cihazın uykuda veya ölçümde olmasına bakılmaksızın, ilgili veri değeri okunarak herhangi bir zamanda elde edilebilir.

BME/P280'i çalıştırmanın da iki yolu vardır. Biri, Ölçüm ve Uyku durumları arasında tekrar tekrar geçiş yapan Sürekli moddur (veri sayfasında Normal mod olarak adlandırılır). Bu modda cihaz bir dizi ölçüm gerçekleştirir, ardından uyku moduna geçer, ardından başka bir ölçüm seti için uyanır ve bu şekilde devam eder. Bireysel ölçümlerin sayısı ve döngünün uyku bölümünün süresi, konfigürasyon kayıtları aracılığıyla kontrol edilebilir.

BME/P280'i çalıştırmanın diğer yolu Tek Çekim modudur (veri sayfasında Zorlama modu olarak adlandırılır). Bu modda cihaz uyku modundan bir ölçüm komutu ile uyandırılır, bir dizi ölçüm yapar ve ardından tekrar uyku moduna geçer. Setteki bireysel ölçümlerin sayısı, cihazı uyandıran konfigürasyon komutunda kontrol edilir.

BMP280'de, tek bir ölçüm yapılırsa, değerdeki en anlamlı 16 bit doldurulur ve değer okumasındaki en az anlamlı dört bitin tümü sıfırdır. Ölçüm sayısı 1, 2, 4, 8 veya 16'ya ayarlanabilir ve ölçüm sayısı arttıkça veri ile doldurulan bit sayısı artar, böylece 16 ölçüm ile 20 bitin tamamı ölçüm verileriyle doldurulur. Veri sayfası bu işleme aşırı örnekleme olarak atıfta bulunur.

BME280'de, sonuç filtrelenmediği sürece aynı düzenleme geçerlidir. Filtreleme kullanılıyorsa, her bir ölçüm döngüsünde kaç ölçüm yapıldığından bağımsız olarak değerler her zaman 20 bittir.

Her bir bireysel ölçüm yaklaşık 2 milisaniye sürer (tipik değer; maksimum değer 2,3 ms'dir). Buna yaklaşık 2 ms'lik (genellikle biraz daha az) sabit bir ek yükü ekleyin, 1 ila 32 ayrı ölçümden oluşabilen bir ölçüm dizisinin 4 ms'den 66 ms'ye kadar sürebileceği anlamına gelir.

Veri sayfası, çeşitli uygulamalar için bir dizi önerilen sıcaklık ve basınç aşırı örnekleme kombinasyonu sağlar.

Yapılandırma kontrol kayıtları

BMP280'deki iki konfigürasyon kontrol kaydı, 0xF4 ve 0xF5 kayıt adreslerindedir ve 6 ayrı konfigürasyon kontrol değerine eşlenir. 0xF4 şunlardan oluşur:

  • 3 bit osrs_t (sıcaklığı 0, 1, 2, 4, 8 veya 16 kez ölçün);
  • 3 bit osrs_p (basıncı 0, 1, 2, 4, 8 veya 16 kez ölçün); ve
  • 2 bit Modu (Uyku, Zorunlu (yani Tek Çekim), Normal (yani sürekli).

0xF5 şunlardan oluşur:

  • 3 bit t_sb (bekleme süresi, 0,5 ms ila 4000 ms);
  • 3 bit filtre (aşağıya bakın); ve
  • SPI veya I2C'yi seçen 1 bit spiw_en.

Filtre parametresi, ham basınç ve sıcaklık ölçüm değerlerine (ancak nem değerlerine değil) uygulanan bir tür üstel bozulma algoritmasını veya Sonsuz Darbe Tepkisi (IIR) filtresini kontrol eder. Denklem veri sayfasında verilmiştir. Başka bir sunum:

Değer(n) = Değer(n-1) * (K-1)/K + ölçüm(n) / K

(n) en son ölçüm ve çıktı değerini gösterir; ve K filtre parametresidir. Filtre parametresi K ve 1, 2, 4, 8 veya 16 olarak ayarlanabilir. K 1 olarak ayarlanırsa denklem sadece Değer(n) = ölçüm(n) olur. Filtre parametresinin kodlaması:

  • filtre = 000, K=1
  • filtre = 001, K=2
  • filtre = 010, K=4
  • filtre = 011, K=8
  • filtre = 1xx, K=16

BME 280, tek bir 3 bitlik parametre osrs_h (nemi 0, 1, 2, 4, 8 veya 16 kez ölçün) ile 0xF2, "ctrl_hum" adresinde başka bir konfigürasyon kontrol kaydı ekler.

Adım 4: Ölçüm ve Okuma Zamanlaması

Komutların zamanlamasını ve ölçüm yanıtlarını göstererek bunu daha sonra eklemeyi planlıyorum.

Iddt - sıcaklık ölçümündeki akım. Tipik değer 325 uA

Iddp - basınç ölçümündeki akım. Tipik değer 720 uA, maks. 1120 uA

Iddsb - bekleme modunda geçerli. Tipik değer 0,2 uA, maks 0,5 uA

Iddsl - uyku modunda geçerli. Tipik değer 0,1 uA, maksimum 0,3 uA

Adım 5: Yazılım Yönergeleri

Yazılım Yönergeleri
Yazılım Yönergeleri
Yazılım Yönergeleri
Yazılım Yönergeleri

I2C Seri Çekim modu

BMP280 veri sayfası, veri okuma hakkında rehberlik sağlar (bölüm 3.9). "Bir patlama okuması kullanılması ve her kaydı ayrı ayrı adreslememesi şiddetle tavsiye edilir. Bu, farklı ölçümlere ait baytların olası karışmasını önleyecek ve arayüz trafiğini azaltacaktır" diyor. Kompanzasyon/kalibrasyon parametrelerinin okunmasıyla ilgili herhangi bir yönlendirme yapılmamıştır. Muhtemelen bunlar statik oldukları ve değişmedikleri için bir sorun değildir.

Bu kitaplık tüm bitişik değerleri tek bir okuma işleminde okur - sıcaklık ve basınç dengeleme parametreleri durumunda 24 bayt, sıcaklık ve basınç birleşimi için 6 bayt ve birleştirilmiş nem, sıcaklık ve basınç için 8 bayt. Yalnızca sıcaklık kontrol edildiğinde, yalnızca 3 bayt okunur.

Makro kullanımı (#define vb.)

Bu kitaplıkta, çoğaltmayı önleyen olağan kitaplık "include guard" makrosu dışında hiçbir makro yoktur.

Tüm sabitler const anahtar sözcüğü kullanılarak tanımlanır ve hata ayıklama yazdırma standart C işlevleriyle kontrol edilir.

Bu benim için bir miktar belirsizliğin kaynağı oldu, ancak bu konudaki birçok yazıyı okumaktan aldığım tavsiye, sabitlerin bildirilmesi (en azından) ve (muhtemelen) hata ayıklama yazdırma kontrolü için #define kullanımının gereksiz ve istenmeyen olduğudur.

#define yerine const kullanımı durumu oldukça açıktır - const, #define (yani sıfır) ile aynı kaynakları kullanır ve elde edilen değerler kapsam belirleme kurallarına uyar, böylece hata olasılığını azaltır.

Hata ayıklama yazdırma kontrolü durumu biraz daha az açıktır, çünkü bunu yapma şeklim, son kodun, hiç uygulanmamış olsalar bile, hata ayıklama yazdırma ifadelerinin mantığını içerdiği anlamına gelir. Kütüphane, çok sınırlı belleğe sahip bir mikrodenetleyici üzerinde büyük bir projede kullanılacaksa, bu bir sorun olabilir. Geliştirmem büyük bir flash belleğe sahip bir ESP8266 üzerinde olduğundan, bu benim için bir sorun gibi görünmüyordu.

Adım 6: Sıcaklık Performansı

Bunu daha sonra eklemeyi planlıyorum.

Adım 7: Basınç Performansı

Bunu daha sonra eklemeyi planlıyorum.

Önerilen: