Mündəricat:

BMP280 və BME280 üçün kitabxana: 7 addım
BMP280 və BME280 üçün kitabxana: 7 addım

Video: BMP280 və BME280 üçün kitabxana: 7 addım

Video: BMP280 və BME280 üçün kitabxana: 7 addım
Video: Arduino Nano, BME280 и SSD1306 OLED-метеостанция 2024, Noyabr
Anonim
BMP280 və BME280 üçün kitabxana
BMP280 və BME280 üçün kitabxana
BMP280 və BME280 üçün kitabxana
BMP280 və BME280 üçün kitabxana
BMP280 və BME280 üçün kitabxana
BMP280 və BME280 üçün kitabxana

Giriş

Bu kitabxananı yazmağı düşünmədim. BMP280 istifadə edən başladığım bir layihənin yan təsiri olaraq "oldu". Bu layihə hələ bitməyib, amma düşünürəm ki, kitabxana başqaları ilə paylaşmağa hazırdır. Sonradan BMP280 -in təzyiq və temperatur qabiliyyətinə rütubət ölçüsü əlavə edən BME280 istifadə etməliyəm. BME280, BMP280 ilə "geriyə uyğundur" - yəni BME280 -dən təzyiq və temperaturun oxunması üçün lazım olan bütün qeydlər və addımlar BMP280 üçün istifadə edilənlərlə eynidir. Yalnız BME280 üçün tətbiq olunan rütubəti oxumaq üçün lazım olan əlavə qeydlər və addımlar var. Bu sual yaranır, hər ikisi üçün bir kitabxana və ya iki ayrı kitabxana. İki cihaz növü üçün avadanlıq tamamilə bir -birini əvəz edir. Hətta satılan bir çox modul (məsələn, Ebay və AliExpress -də) BME/P280 etiketlidir. Hansı növ olduğunu öyrənmək üçün sensorun özündəki (kiçik) yazıya baxmaq və ya cihazın ID baytını yoxlamaq lazımdır. Bir kitabxanaya getməyə qərar verdim. Göründüyü kimi, hər şey qaydasındadır.

Əlaqə, xüsusən də təkmilləşdirmə üçün hər hansı bir təklif təqdir ediləcəkdir.

Kitabxananın xüsusiyyətləri və imkanları

Kitabxana, bir proqramçının cihazın imkanlarını tətbiq etməsi üçün bütün incə dənə detalları ilə məşğul olmaq məcburiyyətində qalmadan Tətbiq Proqramlaşdırma İnterfeysi (API) təmin edən bir proqramdır. İstənilən halda, cihazın imkanlarından tam istifadə etməyi təmin edərkən sadə tələbləri olan bir başlanğıc üçün API asan olmalıdır. İstənilən halda kitabxana, cihaz istehsalçısının hər hansı bir xüsusi təlimatına və ümumi proqram təminatının yaxşı təcrübəsinə riayət etməlidir. Bütün bunlara nail olmaq üçün səy göstərmişəm. BMP280 ilə başlayanda bunun üçün 3 fərqli kitabxana tapdım: Adafruit_BMP280; Seeed_BMP280; və biri cihaz istehsalçısından BMP280 adlanır. Nə Adafruit, nə də Seeed yaxşı işləsələr də və əsas tətbiqlər üçün istifadəsi asan olsa da genişləndirilmiş qabiliyyətlər təmin etməmişlər. Cihaz istehsalçısı (Bosch Sensortec) tərəfindən istehsal ediləndən necə istifadə edəcəyimizi anlaya bilmədim. Bu, onların yox, mənim çatışmazlığım ola bilər. Ancaq kitabxana digər ikisindən çox daha mürəkkəb idi, heç bir təlimat və ya istifadə nümunəsi tapa bilmədim (sonradan nümunələrin "bmp280_support.c" faylında olduğunu gördüm, lakin bunlar mənim üçün xüsusilə faydalı olmadı).

Bu amillər nəticəsində BMP280 üçün öz kitabxanamı yazmağa qərar verdim.

BME280 üçün kitabxana vəziyyətinə baxaraq, ayrı kitabxanalar Adafruit_BME280, Seed_BME280 və Embedded Adventures tərəfindən yazılmış BME280_MOD-1022 kitabxanalarını tapdım. Heç biri BME280 -dən istifadə edə bilən kitabxanada BMP280 funksiyalarını birləşdirmədi. Cihaz və nəzarət edən mikroprosessor yatarkən cihazların bir neçə bit məlumat saxlama qabiliyyətini açıq şəkildə dəstəkləmədilər (bu qabiliyyət məlumat cədvəlində aydındır və burada yazdığım və təsvir etdiyim kitabxanada dəstəklənir).

Birləşdirilmiş kitabxana BME280 -in bütün imkanlarını dəstəkləməlidir, lakin BMP280 ilə istifadə edildikdə istifadə olunmamış funksiyalardan heç bir əlavə xərc çəkməməlidir. Birləşdirilmiş kitabxananın üstünlükləri, idarə etmək üçün daha az kitabxana faylları, eyni layihədə fərqli cihazların asan qarışdırılması və texniki xidmət və ya təkmilləşdirmə üçün sadələşdirilmiş dəyişikliklərdir, bunlar iki deyil, yalnız bir yerdə edilməlidir. Yəqin ki, bunların hamısı olduqca kiçik, hətta əhəmiyyətsizdir, amma…

Cihaz imkanları

BMP280 və BME280, təxminən 5 mm kvadrat və 1 mm yüksəklikdə səthə quraşdırılmış qurğulardır. 2 ayrı güc giriş yastığı və iki Ground yastığı daxil olmaqla 8 interfeys yastığı var. EBay -də 4 və ya 6 pin çıxarılan bir modul olaraq mövcuddur. 4 pinli modul sabit bir I2C ünvanına malikdir və SPI protokolundan istifadə etmək üçün konfiqurasiya edilə bilməz.

6 pinli modul və ya çılpaq cihaz I2C və ya SPI protokolları ilə istifadə edilə bilər. I2C rejimində, SDO pinini yerə (baza ünvanı üçün = 0x76) və ya Vdd -ə (əsas ünvan üçün +1 = 0x77) bağlamaqla əldə edilən iki fərqli ünvana sahib ola bilər. SPI rejimində adi 1 saat, 2 məlumat (hər istiqamət üçün bir) və bir cihaz seçmək pimi (CS) var.

Burada yazdığım və təsvir etdiyim kitabxana yalnız I2C -ni dəstəkləyir. Adafruit_BMP280 və BME_MOD-1022 kitabxanalarında həm i2C, həm də SPI dəstəyi var.

Kitabxananı buradan yükləyə bilərsiniz:

github.com/farmerkeith/BMP280-library

Addım 1: Avadanlıq qurulması

Avadanlığın Qurulması
Avadanlığın Qurulması

Kitabxananın faydalı ola bilməsi üçün BMP280 -ə (və ya istəsəniz ikisinə) mikrokontrolör bağlamaq lazımdır.

WeMos D1 mini pro istifadə etdim, ona görə də əlaqələrini göstərəcəyəm. Digər mikro nəzarətçilər oxşar olacaq, sadəcə SDA və SCL pinlərini düzgün bağlamalısınız.

WeMos D1 mini pro vəziyyətində əlaqələr aşağıdakılardır:

Funksiya WeMos pin BMP280 pin Qeydlər

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND Ünvan idarəetmə SDO Ground və ya Vdd I2C CSB Vdd seçin (GND SPI seçir)

Bəzi MP280 modullarındakı SDO pininin SDD, Vdd pininin isə VCC olaraq etiketlənə biləcəyini unutmayın. Qeyd: SDA və SCL xətlərində xətt və Vin pimi arasında çəkmə rezistorları olmalıdır. Tipik olaraq, 4.7K dəyəri OK olmalıdır. Bəzi BMP280 və BME280 modullarında modula daxil edilmiş 10K çəkmə rezistorları var (bu, yaxşı təcrübə deyil, çünki I2C avtobusuna birdən çox qurğu yükləmək həddindən artıq yüklənə bilər). Bununla birlikdə, hər birində 10K rezistoru olan 2 BME/P280 modulunun istifadəsi, eyni avtobusda çəkmə rezistorlu çoxlu cihaz olmadığı üçün praktik olaraq problem yaratmamalıdır.

Cihazı bağladıqdan sonra, burada tapa biləcəyiniz I2CScan_ID eskizini işlədərək cihazınızın BMP280 və ya BME280 olub olmadığını asanlıqla yoxlaya bilərsiniz:

Cihazın özünə baxaraq BMP280 və ya BME280 olub olmadığını da yoxlaya bilərsiniz. Bunu etmək üçün rəqəmsal mikroskopdan istifadə etməyi lazım bildim, amma görmə qabiliyyətiniz çox yaxşıdırsa, heç bir köməkçi olmadan edə bilərsiniz. Cihazın korpusunda iki sətir çap var. Açar, BMP280 cihazlarında "K", BME280 cihazlarında isə "U" olan ikinci sətirdəki ilk hərfdir.

Addım 2: Kitabxana tərəfindən verilən API -lər

Kitabxana tərəfindən təmin edilən API -lər
Kitabxana tərəfindən təmin edilən API -lər
Kitabxana tərəfindən təmin edilən API -lər
Kitabxana tərəfindən təmin edilən API -lər

Kitabxananın bir eskizinə daxildir

Kitabxana, ifadədən istifadə edərək standart şəkildə bir eskizə daxil edilmişdir

#"farmerkeith_BMP280.h" daxil edin

Bu bəyanat, setup () funksiyasına başlamazdan əvvəl eskizin ilk hissəsinə daxil edilməlidir.

BME və ya BMP proqram obyekti yaratmaq

BMP280 proqram obyektini yaratmaq üçün 3 səviyyə var. Ən sadə olanı sadəcə

bme280 obyekt adı; və ya bmp280 objectName;

məsələn, BMP280 bmp0;

Bu, standart ünvanı 0x76 olan bir proqram obyekti yaradır (yəni yerə bağlı SDO üçün).

BME280 və ya BMP280 proqram obyekti yaratmaq üçün növbəti səviyyə aşağıdakı kimi 0 və ya 1 parametrə malikdir:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parametr (0 və ya 1) I2C əsas ünvanına əlavə olunur ki, eyni I2C avtobusunda iki BME280 və ya BMP280 cihazı (hər biri daxil olmaqla) istifadə olunsun.

BME və ya BMP280 proqram obyekti yaratmaq üçün üçüncü səviyyə iki parametrə malikdir. 0 və ya 1 olan ilk parametr, əvvəlki vəziyyətdə olduğu kimi, ünvan üçündür. İkinci parametr ayıklama çapını idarə edir. 1 olaraq təyin olunarsa, proqram obyekti ilə edilən hər bir əməliyyat, proqramçının əməliyyatın detallarını görməsinə imkan verən Serial.print çıxışları ilə nəticələnir. Misal üçün:

bmp280 objectNameB (1, 1);

Ayıklama çap parametri 0 olaraq təyin olunarsa, proqram obyekti normal davranışa qayıdır (çap yoxdur).

Bu ifadə və ya ifadələr #include sonra və setup () funksiyasından əvvəl daxil edilməlidir.

BME və ya BMP proqram obyektinin işə salınması

İstifadədən əvvəl cihazdan kalibrləmə parametrlərini oxumaq və istənilən ölçmə rejimi, həddindən artıq nümunə götürmə və filtr parametrləri uyğun olaraq konfiqurasiya etmək lazımdır.

Sadə, ümumi məqsədli bir başlanğıc üçün bəyanat belədir:

objectName.begin ();

Begin () bu versiyası cihazdan kalibrləmə parametrlərini oxuyur və osrs_t = 7 (16 temperatur ölçümü), osrs_p = 7 (16 təzyiq ölçümü), rejim = 3 (davamlı, Normal), t_sb = 0 (aralarında 0,5 ms yuxu) ölçmə dəstləri), filter = 0 (K = 1, buna görə süzgəc yoxdur) və spiw_en = 0 (SPI deaktivdir, buna görə I2C istifadə edin). BME280 vəziyyətində 16 rütubət ölçümü üçün əlavə bir parametr osrs_h = 7 mövcuddur.

Başqa bir versiya var () bütün altı (və ya 7) parametri alır. Yuxarıdakı ifadənin ekvivalenti

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en

və ya objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en, osrs_h

Kodların və onların mənalarının tam siyahısı BME280 və BMP280 məlumat vərəqində, həmçinin kitabxanadakı.cpp faylındakı şərhlərdədir.

Sadə temperatur və təzyiq ölçülməsi

İstilik ölçməsinin ən sadə yolu

ikiqat temperatur = objectName.readTemperature (); // temperaturun ölçülməsi

Təzyiq ölçmək üçün ən asan yol

ikiqat təzyiq = objectName.readPressure (); // təzyiqi ölçmək

Rütubətin ölçülməsi üçün ən asan yol

ikiqat rütubət = objectName.readHumidity (); // rütubəti ölçün (yalnız BME280)

Həm temperaturu, həm də təzyiqi əldə etmək üçün yuxarıdakı iki ifadə bir -birinin ardınca istifadə edilə bilər, ancaq başqa bir seçim var:

ikiqat temperatur;

ikiqat təzyiq = objectName.readPressure (temperatur); // təzyiqi və temperaturu ölçmək

Bu ifadə BME280 və ya BMP280 cihazından alınan məlumatları yalnız bir dəfə oxuyur və həm temperaturu, həm də təzyiqi qaytarır. Bu I2C avtobusunun bir az daha səmərəli istifadəsidir və iki oxunuşun eyni ölçü dövrünə uyğun olmasını təmin edir.

BME 280 üçün hər üç dəyəri (rütubət, temperatur və təzyiq) alan birləşmiş ifadə:

ikiqat temperatur, təzyiq; ikiqat rütubət = objectName.readHumidity (temperatur, təzyiq); // rütubəti, təzyiqi və temperaturu ölçmək

Bu bəyanat BMP280 cihazından verilən məlumatları yalnız bir dəfə oxuyur və hər üç dəyəri qaytarır. Bu I2C avtobusunun bir az daha səmərəli istifadəsidir və üç oxunuşun eyni ölçü dövrünə uyğun olmasını təmin edir. Diqqət yetirin ki, dəyişənlərin adları istifadəçinin bəyəndiyi hər şeyə dəyişdirilə bilər, lakin onların qaydası sabitdir - temperatur birinci, təzyiq isə ikinci yerdədir.

Bu istifadə halları, kitabxana ilə təmin edilmiş nümunə eskizlərində əhatə olunur.

Daha mürəkkəb temperatur və təzyiq ölçümü

Yuxarıdakı ifadələr silsiləsi problemsiz işləsə də, bir neçə məsələ var:

  1. cihaz fasiləsiz işləyir və buna görə də maksimum səviyyədə enerji istehlak edir. Enerji bir batareyadan gəlirsə, bunu azaltmaq lazım ola bilər.
  2. istehlak olunan enerji səbəbindən cihaz istiləşmə yaşayacaq və buna görə də ölçülən temperatur ətraf mühit istiliyindən daha yüksək olacaq. Sonrakı bir addımda bunu daha ətraflı izah edəcəyəm.

Daha az enerji sərf edən və ətraf mühitə daha yaxın bir temperatur verən bir nəticə, yuxuya qoyan parametrləri olan start () istifadə edərək əldə edilə bilər (məsələn, rejim = 0). Misal üçün:

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

Ardından, bir ölçü istədikdə, osrs_h, osrs_t və osrs_p, plus rejimi = 1 (tək vuruş rejimi) üçün müvafiq dəyərləri təyin edən F2 (lazım olduqda) və F4 qeyd etmək üçün cihazı konfiqurasiya əmri ilə oyandırın. Misal üçün:

[objectName.updateF2Control (1);] // osrs_h - BMP280 üçün heç vaxt lazım deyil, // və ölçü sayı dəyişdirilməsə, BME280 üçün lazım deyil // begin () də verilən dəyərdən. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, rejim

Cihazı yuxudan oyadıqdan sonra ölçməyə başlayacaq, ancaq nəticə bəzi millisaniyələrdə olmayacaq - göstərilən ölçülərin sayından asılı olaraq ən azı 4 ms, bəlkə də 70 ms və ya daha çox. Oxu əmri dərhal göndərilsə, cihaz əvvəlki ölçmənin dəyərlərini geri qaytaracaq - bu bəzi tətbiqlərdə məqbul ola bilər, lakin əksər hallarda yeni ölçü əldə olunana qədər təxirə salmaq daha yaxşıdır.

Bu gecikmə bir neçə yolla edilə bilər.

  1. ən uzun gözlənilən gecikməni ödəmək üçün müəyyən bir müddət gözləyin
  2. Ölçmə sayının maksimum ölçmə vaxtından (yəni 2.3 ms) ölçmə sayının, üstəgəl əlavə xərcin və üstəlik bir marjın hesablandığı bir müddət gözləyin.
  3. yuxarıdakı kimi hesablanmış daha qısa bir müddət gözləyin, ancaq nominal ölçmə vaxtını (yəni 2 ms) və əlavə yükü istifadə edərək, sonra vəziyyət qeydində "ölçürəm" bitini yoxlamağa başlayın. Status biti 0 oxuduqda (yəni ölçmür), temperatur və təzyiq oxunuşlarını alın.
  4. dərhal status qeydini yoxlamağa başlayın və status biti 0 oxuduqda temperatur və təzyiq oxunuşlarını əldə edin,

Bunu etmək üçün bir yolun nümunəsini bir az sonra göstərəcəyəm.

Konfiqurasiya qeyd əməliyyatları

Bütün bunları həyata keçirmək üçün hələ təqdim etmədiyim bir neçə vasitəyə ehtiyacımız var. Onlar:

bayt oxumaq Qeydiyyatdan keç (reg)

void updateRegister (reg, dəyər)

Bunların hər birinin kitabxanada müəyyən hərəkətlər üçün proqramı bir az daha asanlaşdıran bir neçə əmri var.

PowerSaverPressureAndTemperature.ino nümunəsi 3 saylı metoddan istifadə edir. Təkrar yoxlamanı yerinə yetirən kod xətti

while (bmp0.readRegister (0xF3) >> 3); // loop untl F3bit 3 == 0

Qeyd edək ki, bu eskiz ESP8266 mikro nəzarətçi üçündür. WeMos D1 mini pro istifadə etdim. Eskiz, yuxu üçün fərqli təlimatlara malik olan Atmega mikrokontrolörləri ilə işləməyəcək. Bu eskiz bir neçə digər əmrləri yerinə yetirir, buna görə də bu eskizi daha ətraflı təsvir etməzdən əvvəl hamısını təqdim edəcəyəm.

Mikrokontoller BMP280 sensoru ilə paralel olaraq yatarkən, 6 parametrdən istifadə edərək start () əmrində lazımi ölçülər üçün sensorun konfiqurasiyası edilə bilər. Bununla birlikdə, mikro nəzarətçi yuxuda deyil, ancaq sensordursa, ölçmə zamanı sensoru oyatmaq və ölçü konfiqurasiyasını söyləmək lazımdır. Bu birbaşa ilə edilə bilər

updateRegister (qeyd, dəyər)

lakin aşağıdakı üç əmrlə bir az daha asandır:

updateF2Control (osrs_h); // yalnız BME280

updateF4Control (osrs_t, osrs_p, rejimi); updateF5Config (t_sb, filter, spi3W_en);

Ölçmə bitdikdən sonra, istifadə olunan rejim Tək çəkiliş (Məcburi rejim) olarsa, cihaz avtomatik olaraq yenidən yuxuya gedəcək. Bununla birlikdə, ölçmə dəsti davamlı (Normal) rejimdən istifadə edərək birdən çox ölçmə aparırsa, BMP280 -ni yenidən yuxuya qoymaq lazımdır. Bu, aşağıdakı iki əmrdən biri ilə edilə bilər:

updateF4Control16xSleep ();

updateF4ControlSleep (dəyər);

Bunların hər ikisi rejim bitlərini 00 -a (yəni yuxu rejimi) təyin edir. Ancaq birincisi osrs_t və osrs_p -ni 111 (yəni 16 ölçü) olaraq təyin edir, ikincisi "dəyər" dən aşağı olan 6 biti 0xF4 qeydinin 7: 2 bitinə saxlayır.

Eynilə, aşağıdakı bəyanat "dəyər" in aşağı altı bitini 0xF5 qeydinin 7: 2 bitlərində saxlayır.

updateF5ConfigSleep (dəyər);

Bu son əmrlərin istifadəsi BMP280 F4 və F5 qeydlərində 12 bit məlumatın saxlanmasına imkan verir. Ən azından ESP8266 vəziyyətində, mikro nəzarətçi bir müddət yuxudan sonra oyandıqda, yuxu əmrindən əvvəl vəziyyəti haqqında heç bir məlumatı olmayan eskizin əvvəlindən başlayır. Yuxu əmrindən əvvəl vəziyyətini bilmək üçün məlumatları ya EEPROM funksiyalarından istifadə edərək, ya da SPIFFS -dən istifadə edərək fayl yazmaqla flash yaddaşda saxlamaq olar. Bununla birlikdə, flash yaddaşın yazılma dövrü sayına görə 10 000-100 000 arasında bir məhdudiyyət var. Bu o deməkdir ki, mikrokontrolör bir neçə saniyədə bir yuxu-oyanma dövrü keçirsə, icazə verilən yaddaş yazımını aşa bilər. bir neçə ay ərzində məhdudiyyət qoyun. BMP280 -də bir neçə bit məlumatın saxlanmasının belə bir məhdudiyyəti yoxdur.

F4 və F5 registrlərində saxlanılan məlumatlar mikro nəzarətçi əmrlərdən istifadə edərək oyandıqda bərpa oluna bilər.

readF4Sleep ();

readF5Sleep ();

Bu funksiyalar müvafiq reyestri oxuyur, 2 LSB -ni çıxarmaq və qalan 6 biti qaytarmaq üçün məzmunu dəyişir. Bu funksiyalar powerSaverPressureAndTemperatureESP.ino eskiz nümunəsində aşağıdakı kimi istifadə olunur:

// EventCounter dəyərini bmp0 -dan geri oxuyun

bayt bmp0F4value = bmp0.readF4Sleep (); // 0 - 63 bayt bmp0F5value = bmp0.readF5Sleep (); // 0 ilə 63 eventCounter = bmp0F5value*64+bmp0F4value; // 0 ilə 4095

Bu funksiyalar müvafiq reyestri oxuyur, 2 LSB -ni çıxarmaq və qalan 6 biti qaytarmaq üçün məzmunu dəyişir. Bu funksiyalar powerSaverPressureAndTemperature.ino eskiz nümunəsində aşağıdakı kimi istifadə olunur:

// EventCounter dəyərini bmp1 -dən geri oxuyun

bayt bmp1F4value = bmp1.readF4Sleep (); // 0 - 63 bayt bmp1F5value = bmp1.readF5Sleep (); // 0 ilə 63 eventCounter = bmp1F5value*64+bmp1F4value; // 0 ilə 4095

Ham temperatur və təzyiq funksiyaları

Əsas readTemperature, readPressure və readHumidity funksiyaları iki komponentdən ibarətdir. Əvvəlcə xam 20 bitlik temperatur və təzyiq dəyərləri BME/P280-dən və ya xam 16 bitlik rütubət dəyəri BME280-dən alınır. Sonra kompensasiya alqoritmi çıxış dəyərlərini Selsi, hPa və ya %RH ilə yaratmaq üçün istifadə olunur.

Kitabxana bu komponentlər üçün ayrıca funksiyalar təmin edir ki, xam temperatur, təzyiq və rütubət məlumatları əldə olunsun və bəlkə də bir şəkildə manipulyasiya olunsun. Bu xam dəyərlərdən temperatur, təzyiq və rütubət əldə etmək alqoritmi də təmin edilmişdir. Kitabxanada bu alqoritmlər ikiqat uzunluqlu üzən nöqtə arifmetikindən istifadə etməklə həyata keçirilir. 32 bitlik bir prosessor olan "ikiqat" dəyişkən dəyişənlər üçün 64 bit istifadə edən ESP8266-da yaxşı işləyir. Bu funksiyaları əlçatan etmək digər platformalar üçün hesablamanın qiymətləndirilməsi və ehtimal ki dəyişdirilməsi üçün faydalı ola bilər.

Bu funksiyalar:

readRawPressure (rawTemperature); // BME/P280readRawHumidity (rawTemperature, rawPressure) -dən xam təzyiq və temperatur məlumatlarını oxuyur; // BME280 calcTemperature (rawTemperature, t_fine) nəm, temperatur və təzyiq məlumatlarını oxuyur; calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Bu funksiyaların "t-fine" arqumenti bir qədər izah etməyə dəyər. Həm təzyiq, həm də rütubət kompensasiya alqoritmləri t_fine dəyişən vasitəsilə əldə edilən temperaturdan asılı bir komponenti ehtiva edir. CalcTemperature funksiyası, temperaturun kompensasiya alqoritmi məntiqinə əsaslanaraq t_fine -də bir dəyər yazır, sonra həm calcPressure, həm də calcHumidity -də bir giriş olaraq istifadə olunur.

Bu funksiyaların istifadəsinə bir nümunə rawPressureAndTemperature.ino eskizində və kitabxananın.cpp faylında readHumidity () funksiyasının kodunda tapıla bilər.

Yüksəklik və dəniz səviyyəsindəki təzyiq

Atmosfer təzyiqi ilə yüksəklik arasında bilinən bir əlaqə var. Hava təzyiqi də təsir edir. Hava təşkilatları atmosfer təzyiqi haqqında məlumat dərc etdikdə, ümumiyyətlə yüksəkliyə uyğunlaşdırırlar və buna görə də "sinoptik cədvəl" dəniz səviyyəsi üçün standartlaşdırılmış izobarları (sabit təzyiq xətləri) göstərir. Beləliklə, bu əlaqədə həqiqətən 3 dəyər var və bunlardan ikisini bilmək üçüncüsünü çıxarmağa imkan verir. 3 dəyər:

  • dəniz səviyyəsindən yüksəklik
  • bu yüksəklikdəki əsl hava təzyiqi
  • dəniz səviyyəsindəki ekvivalent hava təzyiqi (daha dəqiq desək, orta dəniz səviyyəsi, çünki ani dəniz səviyyəsi daim dəyişir)

Bu kitabxana bu əlaqələr üçün aşağıdakı kimi iki funksiya təmin edir:

calcAltitude (təzyiq, dəniz səviyyəsiPa);

calcNormalised Pressure (təzyiq, yüksəklik);

Dəniz səviyyəsinin 1013.15 hPa standart təzyiqini qəbul edən sadələşdirilmiş bir versiya da var.

calcAltitude (təzyiq); // standart seaLevelPressure qəbul edildi

Addım 3: BMP280 Cihaz Təfərrüatları

BMP280 Cihaz Təfərrüatları
BMP280 Cihaz Təfərrüatları

Avadanlıq imkanları

BMP280, çox ölçmə və məlumat çıxışı seçimlərini idarə etmək üçün istifadə olunan 2 bayt konfiqurasiya məlumatlarına malikdir (0xF4 və 0xF5 qeyd ünvanlarında). Həm də xam temperatur və təzyiq dəyərlərini şərti temperatur və təzyiq vahidlərinə çevirmək üçün istifadə olunan 2 bit status məlumatı və 24 bayt kalibrləmə parametrləri təmin edir. BME280 aşağıdakı kimi əlavə məlumatlara malikdir:

  • 0xF2 qeyd ünvanında çoxlu rütubət ölçmələrini idarə etmək üçün istifadə olunan 1 əlavə bayt konfiqurasiya məlumatı;
  • Xam nəm dəyərini nisbi rütubət faizinə çevirmək üçün istifadə olunan 8 əlavə bayt kalibrləmə parametrləri.

BME280 üçün temperatur, təzyiq və status qeydləri BMP280 ilə eynidir, kiçik istisnalar istisna olmaqla:

  • BME280 -in "ID" bitləri 0x60 olaraq təyin olunur, buna görə də 0x56, 0x57 və ya 0x58 ola bilən BMP280 -dən fərqlənə bilər.
  • yuxu vaxtı nəzarəti (t_sb), BMP280 -dəki iki uzun zaman (2000 ms və 4000 ms) BME280 -də 10 ms və 20 ms qısa zamanlarla əvəz edilərək dəyişdirilir. BME280 -də maksimum yuxu müddəti 1000 ms -dir.
  • Süzgəc tətbiq edildikdə BME280 -də temperatur və təzyiq xam dəyərləri həmişə 20 bitdir. 16 ilə 19 bitlik dəyərlərin istifadəsi heç bir süzgəc olmayan hallarla məhdudlaşır (yəni filter = 0).

Temperatur və təzyiq, temperatur üçün 3 16 bitlik kalibrləmə parametrləri və 9 16 bitlik kalibrləmə parametrləri və təzyiq üçün temperaturdan istifadə etməklə olduqca mürəkkəb bir alqoritm vasitəsilə şərti temperatura və təzyiqə çevrilməli olan hər 20 bit dəyərdir. İstilik ölçməsinin dənəvərliyi, ən az əhəmiyyətli bir bit dəyişikliyi (20 bit oxunması) üçün 0.0003 dərəcə Selsidir və 16 bit oxunuş istifadə edilərsə 0.0046 Selsi səviyyəsinə yüksəlir.

Rütubət, 8, 12 və 16 bitlik bir qarışıq olan 6 kalibrləmə parametrindən istifadə edərək başqa bir kompleks alqoritmlə nisbi rütubətə çevrilməsi lazım olan 16 bitlik bir dəyərdir.

Məlumat vərəqi, temperaturun oxunmasının mütləq dəqiqliyini 25 ° C-də +0.5 C və 0 ilə 65 C aralığında +-1 C olaraq göstərir.

Təzyiq ölçüsünün dənəvərliyi 20 bit qətnamədə 0,15 Paskal (yəni 0,0015 hektoPaskal) və ya 16 bit qətnamədə 2,5 Paskaldır. Xam təzyiq dəyəri temperaturdan təsirlənir, belə ki, 25C ətrafında, temperaturun 1 dərəcə C artması ölçülmüş təzyiqi 24 Paskal azaldır. İstilik həssaslığı kalibrləmə alqoritmində nəzərə alınır, buna görə də verilən təzyiq dəyərləri fərqli temperaturlarda dəqiq olmalıdır.

Məlumat vərəqi, 0 C ilə 65 C arasındakı temperaturlar üçün təzyiqin oxunmasının mütləq dəqiqliyini +-1 hPa olaraq göstərir.

Rütubətin dəqiqliyi məlumat vərəqində +-3% RH və +-1% histerezis olaraq verilir.

Bu necə işləyir

24 bayt temperatur və təzyiq kalibrləmə məlumatları, həmçinin BME280 vəziyyətində 8 bayt rütubət kalibrləmə məlumatları cihazdan oxunmalı və dəyişənlərdə saxlanılmalıdır. Bu məlumatlar fabrikdəki cihazda fərdi olaraq proqramlaşdırılır, buna görə fərqli qurğular fərqli dəyərlərə malikdir - ən azı bəzi parametrlər üçün. BME/P280 iki əyalətdən birində ola bilər. Bir vəziyyətdə ölçülür. Digər vəziyyətdə gözləyir (yatır).

Hansı vəziyyətdə olduğunu 0xF3 registrinin 3 -cü bitinə baxaraq yoxlamaq olar.

Cihazın yatmasından və ya ölçməsindən asılı olmayaraq, ən son ölçmənin nəticələrini istənilən vaxt oxunaraq əldə etmək olar.

BME/P280 -in işləməsinin iki yolu var. Biri, Ölçmə və Yuxu vəziyyətləri arasında dəfələrlə dövr edən Davamlı rejim (məlumat vərəqində Normal rejim adlanır). Bu rejimdə cihaz bir sıra ölçmələr aparır, sonra yuxuya gedir, sonra başqa bir ölçü dəsti üçün oyanır və s. Fərdi ölçmələrin sayı və dövrün yuxu hissəsinin müddəti konfiqurasiya qeydləri vasitəsi ilə idarə oluna bilər.

BME/P280 -in işləməsinin digər yolu Tək Çekim rejimidir (məlumat vərəqində Məcburi rejim adlanır). Bu rejimdə cihaz ölçmək əmri ilə yuxudan oyanır, bir sıra ölçmələr aparır və sonra yenidən yuxuya gedir. Dəstdəki fərdi ölçmələrin sayı cihazı oyadan konfiqurasiya əmrində idarə olunur.

BMP280 -də, tək bir ölçmə aparılırsa, dəyərdəki ən əhəmiyyətli 16 bit doldurulur və dəyər oxunuşunda ən az əhəmiyyətli dörd bitin hamısı sıfırdır. Ölçmələrin sayı 1, 2, 4, 8 və ya 16 olaraq təyin edilə bilər və ölçülərin sayı artdıqca məlumatlarla doldurulan bitlərin sayı artır, beləliklə 16 ölçü ilə 20 bitin hamısı ölçü məlumatları ilə doldurulur. Məlumat vərəqində bu prosesə həddindən artıq seçmə deyilir.

BME280 -də, nəticə süzülmədiyi müddətdə eyni tənzimləmə tətbiq olunur. Süzgəcdən istifadə olunarsa, hər ölçmə dövrü ərzində neçə ölçü alınmasından asılı olmayaraq, dəyərlər həmişə 20 bitdir.

Hər bir fərdi ölçmə təxminən 2 millisaniyə çəkir (tipik dəyər; maksimum dəyər 2.3 ms). Təxminən 2 ms (ümumiyyətlə bir az daha az) sabit bir əlavə yükləmə, 1 -dən 32 -ə qədər fərdi ölçüdən ibarət ola biləcək bir ölçmə ardıcıllığının 4 ms -dən 66 ms -ə qədər davam edə biləcəyi deməkdir.

Məlumat vərəqi, müxtəlif tətbiqlər üçün tövsiyə olunan temperatur və təzyiqin həddindən artıq seçilməsinin bir araya gəlməsini təmin edir.

Konfiqurasiya nəzarət qeydləri

BMP280 -dəki iki konfiqurasiya nəzarət reyestri 0xF4 və 0xF5 qeyd ünvanlarında yerləşir və 6 fərdi konfiqurasiya idarəetmə dəyərinə uyğunlaşdırılır. 0xF4 aşağıdakılardan ibarətdir:

  • 3 bit osrs_t (temperaturun ölçülməsi 0, 1, 2, 4, 8 və ya 16 dəfə);
  • 3 bit osrs_p (təzyiqi 0, 1, 2, 4, 8 və ya 16 dəfə ölçün); və
  • 2 bit rejimi (Yuxu, Məcburi (yəni Tək Çekim), Normal (yəni davamlı).

0xF5 aşağıdakılardan ibarətdir:

  • 3 bit t_sb (gözləmə müddəti, 0.5ms - 4000 ms);
  • 3 bitlik filtr (aşağıya baxın); və
  • SPI və ya I2C seçən 1 bit spiw_en.

Süzgəc parametri, xam təzyiq və temperatur ölçmə dəyərlərinə (lakin rütubət dəyərlərinə deyil) tətbiq olunan bir növ eksponent tənəzzül alqoritmini və ya Sonsuz İmpuls Cavabı (IIR) filtrini idarə edir. Tənlik məlumat vərəqində verilir. Başqa bir təqdimat:

Dəyər (n) = Dəyər (n-1) * (K-1) / K + ölçmə (n) / K

burada (n) ən son ölçmə və çıxış dəyərini göstərir; və K filtr parametridir. Süzgəc parametri K və 1, 2, 4, 8 və ya 16 olaraq təyin edilə bilər. K 1 olaraq təyin olunarsa, tənlik yalnız Dəyər (n) = ölçü (n) olur. Filtr parametrinin kodlaşdırılması belədir:

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

BME 280, 0xF2 ünvanında "ctrl_hum" ünvanında başqa bir konfiqurasiya nəzarət reyestri əlavə edir, tək bir 3 bitlik parametr osrs_h ilə (rütubəti 0, 1, 2, 4, 8 və ya 16 dəfə ölçün).

Addım 4: Ölçmə və Oxuma Zamanlaması

Əmrlərin və ölçü cavablarının vaxtını göstərərək bunu daha sonra əlavə etməyi planlaşdırıram.

Iddt - temperaturun ölçülməsi zamanı cərəyan. Tipik dəyər 325 uA

Iddp - təzyiq ölçülməsindəki cərəyan. Tipik dəyər 720 uA, maksimum 1120 uA

Iddsb - gözləmə rejimində cari. Tipik dəyər 0,2 uA, maksimum 0,5 uA

Iddsl - yuxu rejimində cari. Tipik dəyər 0.1 uA, maksimum 0.3 uA

Addım 5: Proqram Təlimatları

Proqram Təlimatları
Proqram Təlimatları
Proqram Təlimatları
Proqram Təlimatları

I2C Burst rejimi

BMP280 məlumat vərəqi məlumatların oxunması ilə bağlı təlimat verir (bölmə 3.9). Orada "hər bir reyestri ayrı-ayrılıqda oxumamaq tövsiyə olunur. Bu, fərqli ölçülərə aid olan baytların mümkün qarışmasının qarşısını alacaq və interfeys trafikini azaldacaq." Kompensasiya/kalibrləmə parametrlərinin oxunması ilə bağlı heç bir təlimat verilmir. Ehtimal ki, bunlar bir məsələ deyil, çünki statikdir və dəyişmir.

Bu kitabxana, bütün bitişik dəyərləri bir oxuma əməliyyatında oxuyur - temperatur və təzyiq kompensasiya parametrləri halında 24 bayt, temperatur və təzyiqin birləşməsi üçün 6 bayt, rütubət, temperatur və təzyiqin birləşməsi üçün 8 bayt. Yalnız temperatur yoxlandıqda, yalnız 3 bayt oxunur.

Makroların istifadəsi (#define və s.)

Bu kitabxanada, təkrarlanmanın qarşısını alan adi kitabxanadan ibarət "mühafizəçi" makrosundan başqa heç bir makro yoxdur.

Bütün sabitlər const açar sözündən istifadə edərək təyin olunur və debug çapı standart C funksiyaları ilə idarə olunur.

Mənim üçün müəyyən bir qeyri -müəyyənliyin mənbəyi oldu, amma bu mövzuda bir çox yazı oxumaqdan aldığım məsləhət, sabitlərin (ən azından) və (ehtimal ki) ayıklama çap nəzarətinin elan edilməsi üçün #define istifadəsinin lazımsız və arzuolunmaz olmasıdır.

#Define -dən çox const -un istifadəsi ilə bağlı vəziyyət olduqca aydındır - const #define (yəni sıfır) ilə eyni mənbələrdən istifadə edir və nəticədə əldə edilən dəyərlər əhatələmə qaydalarına riayət edir və bununla da səhv ehtimalını azaldır.

Ayıklama çapına nəzarət işi bir az daha aydın deyil, çünki mənim etdiyim üsul heç vaxt tətbiq olunmasa da, son kodun debug çap ifadələrinin məntiqini ehtiva etdiyi deməkdir. Kitabxana çox məhdud yaddaşa malik bir mikro nəzarətçi üzərində böyük bir layihədə istifadə ediləcəyi təqdirdə bu problem ola bilər. İnkişafım böyük bir flash yaddaşı olan bir ESP8266 -da olduğu üçün bu mənim üçün bir problem kimi görünmürdü.

Addım 6: Temperatur Performansı

Bunu daha sonra əlavə etməyi düşünürəm.

Addım 7: Təzyiq Performansı

Bunu daha sonra əlavə etməyi düşünürəm.

Tövsiyə: