Sadržaj:

Knjižnica za BMP280 i BME280: 7 koraka
Knjižnica za BMP280 i BME280: 7 koraka

Video: Knjižnica za BMP280 i BME280: 7 koraka

Video: Knjižnica za BMP280 i BME280: 7 koraka
Video: Layak gak? Programming Nodemcu pakai Smartphone Android? (Subtittled) 2024, Srpanj
Anonim
Knjižnica za BMP280 i BME280
Knjižnica za BMP280 i BME280
Knjižnica za BMP280 i BME280
Knjižnica za BMP280 i BME280
Knjižnica za BMP280 i BME280
Knjižnica za BMP280 i BME280

Uvod

Nisam krenuo pisati ovu knjižnicu. To se "dogodilo" kao nuspojava započetog projekta koji koristi BMP280. Taj projekt još nije dovršen, ali mislim da je knjižnica spremna za dijeljenje s drugima. Nakon toga imao sam potrebu koristiti BME280, koji dodaje mjerenje vlažnosti tlaku i temperaturi BMP280. BME280 je "unatrag kompatibilan" s BMP280 - to jest, svi registri i koraci potrebni za očitavanje tlaka i temperature s BME280 isti su kao oni koji se koriste za BMP280. Za očitavanje vlažnosti potrebni su dodatni registri i koraci, primjenjivi samo na BME280. Postavlja se pitanje, jedna knjižnica za obje ili dvije zasebne knjižnice. Hardver za dvije vrste uređaja potpuno je zamjenjiv. Čak su i mnogi moduli koji se prodaju (na primjer na Ebayu i AliExpressu) označeni BME/P280. Da biste saznali o kojoj se vrsti radi, morate pogledati (minijaturni) zapis na samom senzoru ili testirati bajt ID -a uređaja. Odlučio sam otići u jedinstvenu knjižnicu. Čini se da je sve dobro prošlo.

Povratne informacije, posebno svi prijedlozi za poboljšanja, bit će cijenjeni.

Značajke i mogućnosti knjižnice

Knjižnica je dio softvera koji pruža sučelje aplikacijskog programiranja (API) za programera kako bi iskoristio mogućnosti uređaja, a da se ne mora nužno baviti svim sitnim detaljima. Poželjno je da bi API početniku trebao biti jednostavan s jednostavnim zahtjevima za početak, a istovremeno omogućiti potpuno iskorištavanje mogućnosti uređaja. Poželjno je da knjižnica slijedi sve posebne smjernice proizvođača uređaja, kao i opću dobru praksu softvera. Nastojao sam postići sve ovo. Kad sam počeo s BMP280, pronašao sam 3 različite knjižnice za njega: Adafruit_BMP280; Seeed_BMP280; i jedan zvan BMP280 od proizvođača uređaja. Ni Adafruit ni Seeed nisu pružili proširene mogućnosti, iako su dobro radili i bili su laki za upotrebu za osnovne aplikacije. Nisam mogao shvatiti kako se koristi onaj koji je proizveo proizvođač uređaja (Bosch Sensortec). Ovo je možda moj nedostatak, a ne njihov. Međutim, knjižnica je bila mnogo kompliciranija od ostale dvije, nisam mogao pronaći nikakve upute ili primjere uporabe (naknadno sam otkrio da su primjeri u datoteci "bmp280_support.c", međutim oni mi nisu bili od posebne pomoći).

Zbog ovih faktora odlučio sam napisati vlastitu knjižnicu za BMP280.

Proučavajući knjižničnu situaciju za BME280, pronašao sam zasebne knjižnice Adafruit_BME280, Seed_BME280 i još jednu BME280_MOD-1022 koju je napisala Embedded Adventures. Nitko od njih nije kombinirao funkcije za BMP280 u knjižnici sposobnoj za korištenje BME280. Niti jedan od njih izričito ne podržava sposobnost uređaja za spremanje nekoliko bitova podataka dok uređaj i njegov upravljački mikroprocesor spavaju (ta je mogućnost evidentna u podatkovnom listu i podržana u biblioteci koju sam ovdje napisao i opisao).

Kombinirana knjižnica trebala bi imati podršku za sve mogućnosti BME280, ali kada se koristi s BMP280 ne bi trebala nametati nikakve dodatne troškove zbog neiskorištenih funkcija. Prednosti kombinirane knjižnice uključuju manje bibliotečkih datoteka za upravljanje, jednostavno miješanje i usklađivanje različitih uređaja u istom projektu i pojednostavljene promjene za održavanje ili nadogradnju koje se moraju obaviti samo na jednom mjestu, a ne na dva. Sve su to vjerojatno sasvim male, čak i beznačajne, ali …

Mogućnosti uređaja

BMP280 i BME280 su uređaji za površinsko postavljanje kvadratnih 5 mm i visine 1 mm. Postoji 8 jastučića za sučelje, uključujući 2 zasebna ulaza za napajanje i dva uzemljenja. Dostupni su na eBayu kao modul s izvađenim 4 ili 6 pinova. 4-pinski modul ima fiksnu I2C adresu i ne može se konfigurirati za korištenje SPI protokola.

6-pinski modul ili goli uređaj mogu se koristiti s I2C ili SPI protokolima. U načinu rada I2C može imati dvije različite adrese, postignute spajanjem SDO pina bilo na uzemljenje (za baznu adresu = 0x76) ili na Vdd (za baznu adresu +1 = 0x77). U SPI načinu rada ima uobičajen raspored od 1 sata, 2 podataka (po jedan za svaki smjer) i pin za odabir uređaja (CS).

Knjižnica koju sam ovdje napisao i opisao podržava samo I2C. Knjižnice Adafruit_BMP280 i BME_MOD-1022 imaju podršku za i2C i SPI.

Knjižnica se može preuzeti ovdje:

github.com/farmerkeith/BMP280-library

Korak 1: Postavljanje hardvera

Postavljanje hardvera
Postavljanje hardvera

Prije nego što knjižnica može biti korisna, potrebno je spojiti mikrokontroler na BMP280 (ili na dva ako želite).

Koristio sam WeMos D1 mini pro, pa ću pokazati njegove veze. Ostali mikrokontroleri bit će slični, samo trebate pravilno spojiti pinove SDA i SCL.

U slučaju WeMos D1 mini pro, veze su:

Funkcija WeMos pin BMP280 pin Napomene

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominalno 3,3 V Uzemljenje GND Upravljanje adresom SDO Uzemljenje ili Vdd I2C odabir CSB Vdd (GND odabire SPI)

Imajte na umu da je SDO pin na nekim od MP280 modula označen kao SDD, a Vdd pin može biti označen kao VCC. Napomena: SDA i SCL vodovi trebaju imati otpornike za izvlačenje između linije i Vin pina. Obično bi vrijednost od 4,7K trebala biti u redu. Neki moduli BMP280 i BME280 imaju 10K pull-up otpornika uključenih u modul (što nije dobra praksa, jer stavljanje više uređaja na I2C sabirnicu može ga preopteretiti). Međutim, korištenje 2 BME/P280 modula svaki s 10K otpornikom ne bi trebao predstavljati problem u praksi sve dok na istoj sabirnici nema previše drugih uređaja također s otpornicima na izvlačenje.

Nakon što spojite hardver, možete jednostavno provjeriti je li vaš uređaj BMP280 ili BME280 pokretanjem skice I2CScan_ID koju možete pronaći ovdje:

Također možete provjeriti imate li BMP280 ili BME280 gledajući sam uređaj. Smatrao sam da je za to potrebno koristiti digitalni mikroskop, ali ako je vaš vid jako dobar, možda ćete to moći učiniti bez ikakvih pomagala. Na kućištu uređaja postoje dvije linije za ispis. Ključ je prvo slovo u drugom retku, koje je u slučaju uređaja BMP280 "K", a u slučaju uređaja BME280 "U".

Korak 2: API -ji koje pruža knjižnica

API -ji koje pruža knjižnica
API -ji koje pruža knjižnica
API -ji koje pruža knjižnica
API -ji koje pruža knjižnica

Uključivanje knjižnice u skicu

Knjižnica je uključena u skicu na standardni način pomoću izraza

#include "farmerkeith_BMP280.h"

Ovaj izraz treba uključiti u rani dio skice prije početka funkcije setup ().

Izrada softverskog objekta BME ili BMP

Postoje 3 razine za stvaranje softverskog objekta BMP280. Najjednostavnije je upravo

bme280 objectName; ili bmp280 ime objekta;

na primjer, BMP280 bmp0;

Time se stvara softverski objekt sa zadanom adresom 0x76 (tj. Za SDO spojen na masu).

Sljedeća razina za stvaranje softverskog objekta BME280 ili BMP280 ima parametar 0 ili 1, kako slijedi:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parametar (0 ili 1) dodaje se baznoj adresi I2C, tako da se dva BME280 ili BMP280 uređaja mogu koristiti na istoj I2C sabirnici (uključujući po jedan svaki).

Treća razina za stvaranje softverskog objekta BME ili BMP280 ima dva parametra. Prvi parametar, koji je ili 0 ili 1, odnosi se na adresu, kao i u prethodnom slučaju. Drugi parametar kontrolira ispis pogrešaka. Ako je postavljeno na 1, svaka transakcija sa softverskim objektom rezultira izlazima Serial.print koji programeru omogućuju da vidi pojedinosti transakcije. Na primjer:

bmp280 objectNameB (1, 1);

Ako je parametar ispisa za ispravljanje pogrešaka postavljen na 0, softverski objekt vraća se na uobičajeno ponašanje (nema ispisa).

Ovaj izraz ili izraze potrebno je uključiti nakon #include i prije funkcije setup ().

Inicijalizacija softverskog objekta BME ili BMP

Prije uporabe potrebno je pročitati kalibracijske parametre s uređaja i konfigurirati ga za bilo koji način mjerenja, prekomjerno uzorkovanje i postavke filtra.

Za jednostavnu inicijalizaciju opće namjene izjava je:

objectName.begin ();

Ova verzija begin () čita parametre kalibracije s uređaja i postavlja osrs_t = 7 (16 mjerenja temperature), osrs_p = 7 (16 mjerenja tlaka), način = 3 (kontinuirano, normalno), t_sb = 0 (0,5 ms spavanja između mjerni setovi), filter = 0 (K = 1, dakle bez filtriranja) i spiw_en = 0 (SPI onemogućen, pa upotrijebite I2C). U slučaju BME280, postoji dodatni parametar osrs_h = 7 za 16 mjerenja vlažnosti.

Postoji još jedna verzija begin () koja uzima svih šest (ili 7) parametara. Ekvivalent gornje izjave je

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, način rada, t_sb, filter, spiw_en

ili objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, način, t_sb, filter, spiw_en, osrs_h

Cjeloviti popis kodova i njihova značenja nalazi se u podatkovnim tablicama BME280 i BMP280, a također i u komentarima u.cpp datoteci u knjižnici.

Jednostavno mjerenje temperature i tlaka

Najjednostavniji način je mjerenje temperature

dvostruka temperatura = objectName.readTemperature (); // mjerenje temperature

Najjednostavniji način je mjerenje tlaka

dvostruki pritisak = ime objekta.čitaniPritisak (); // mjerenje pritiska

Najjednostavniji način je mjerenje vlažnosti

dvostruka vlažnost = objectName.readHumidity (); // mjerenje vlage (samo BME280)

Za dobivanje i temperature i pritiska gornje dvije izjave mogu se koristiti jedna za drugom, ali postoji još jedna mogućnost, a to je:

dvostruka temperatura;

dvostruki tlak = ime objekta.čitaniPritisak (temperatura); // mjerenje tlaka i temperature

Ova izjava samo jednom čita podatke s uređaja BME280 ili BMP280 te vraća i temperaturu i tlak. Ovo je nešto učinkovitije korištenje I2C sabirnice i osigurava da dva očitanja odgovaraju istom ciklusu mjerenja.

Za BME 280 kombinirana izjava koja dobiva sve tri vrijednosti (vlažnost, temperatura i tlak) je:

dvostruka temperatura, tlak; dvostruka vlažnost = Ime objekta.čitanaVlažnost (temperatura, tlak); // mjerenje vlažnosti, tlaka i temperature

Ova izjava samo jednom čita podatke s BMP280 uređaja i vraća sve tri vrijednosti. Ovo je nešto učinkovitije korištenje I2C sabirnice i osigurava da tri očitanja odgovaraju istom ciklusu mjerenja. Imajte na umu da se nazivi varijabli mogu promijeniti u sve što se korisniku sviđa, ali njihov redoslijed je fiksiran - temperatura je na prvom mjestu, a pritisak na drugom mjestu.

Ti su slučajevi uporabe obuhvaćeni primjerima skica koje se isporučuju s bibliotekom, a to su basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino i basicHumidityAndTemperatureAndPressure.ino.

Sofisticiranije mjerenje temperature i tlaka

Iako će gornji niz izjava raditi bez problema, postoji nekoliko pitanja:

  1. uređaj neprekidno radi i stoga troši energiju na najvećoj razini. Ako energija dolazi iz baterije, možda će biti potrebno to smanjiti.
  2. zbog potrošene energije uređaj će se zagrijati pa će izmjerena temperatura biti viša od temperature okoline. O ovome ću više govoriti u kasnijem koraku.

Rezultat koji troši manje energije i daje temperaturu koja je bliža okolini može se postići korištenjem begin () s parametrima koji ga uspavaju (npr. Način = 0). Na primjer:

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

Zatim, kada se želi mjerenje, probudite uređaj s konfiguracijskom naredbom za registre F2 (ako je potrebno) i F4 koji postavlja odgovarajuće vrijednosti osrs_h, osrs_t i osrs_p, plus način rada = 1 (način pojedinačnog snimanja). Na primjer:

[objectName.updateF2Control (1);] // osrs_h - nikad nije potrebno za BMP280, // i nije potrebno za BME280 ako se broj mjerenja ne mijenja // od vrijednosti navedene u begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, način

Nakon što je probudio uređaj, počet će mjerenje, ali rezultat neće biti dostupan nekoliko milisekundi - najmanje 4 ms, možda do 70 ms ili više, ovisno o navedenom broju mjerenja. Ako se naredba za čitanje pošalje odmah, uređaj će vratiti vrijednosti iz prethodnog mjerenja - što može biti prihvatljivo u nekim aplikacijama, ali u većini je slučajeva vjerojatno bolje odgoditi dok novo mjerenje ne bude dostupno.

Ovo kašnjenje se može učiniti na nekoliko načina.

  1. pričekajte fiksno vrijeme da pokrijete najduže očekivano kašnjenje
  2. pričekajte količinu vremena izračunatu iz maksimalnog vremena mjerenja po mjerenju (tj. 2,3 ms) puta broj mjerenja, plus režijski troškovi, plus marža.
  3. pričekajte kraće vrijeme izračunato kao gore, ali koristeći nominalno vrijeme mjerenja (tj. 2 ms) plus režijske troškove, a zatim počnite provjeravati bit "mjerim" u registru statusa. Kad statusni bit glasi 0 (tj. Ne mjeri se), dobijte očitanja temperature i tlaka.
  4. odmah počnite provjeravati registar statusa i dobiti očitanja temperature i tlaka kada bit statusa glasi 0,

Primjer jednog načina na koji ću to učiniti pokazat ću kasnije.

Operacije registra konfiguracije

Da bi se sve to dogodilo, potrebno nam je nekoliko alata koje još nisam predstavio. Oni su:

byte readRegister (reg)

void updateRegister (reg, vrijednost)

Svaka od njih ima nekoliko izvedenih naredbi u knjižnici, koje pojednostavljuju softver za određene radnje.

Primjer powerSaverPressureAndTemperature.ino koristi metodu br. 3. Redak koda koji vrši ponovnu provjeru je

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

Imajte na umu da je ova skica za mikrokontroler ESP8266. Koristio sam WeMos D1 mini pro. Skica neće raditi s mikrokontrolerima Atmega koji imaju različite upute za spavanje. Ova skica vježba nekoliko drugih naredbi, pa ću ih sve predstaviti prije nego što detaljnije opišem tu skicu.

Kad mikrokontroler spava paralelno sa senzorom BMP280, konfiguracija senzora za potrebna mjerenja može se izvršiti u naredbi begin (), koristeći 6 parametara. Međutim, ako mikrokontroler ne spava, ali senzor spava, tada se u vrijeme mjerenja senzor mora probuditi i reći mu svoju mjernu konfiguraciju. To se može učiniti izravno pomoću

updateRegister (reg, vrijednost)

ali je malo lakše sa sljedeće tri naredbe:

updateF2Control (osrs_h); // samo BME280

updateF4Control (osrs_t, osrs_p, način rada); updateF5Config (t_sb, filter, spi3W_en);

Nakon što je mjerenje obavljeno, ako je način rada Single shot (prisilni način rada), uređaj će se automatski vratiti u stanje mirovanja. Međutim, ako mjerni skup uključuje više mjerenja pomoću kontinuiranog (normalnog) načina rada, BMP280 će se morati vratiti u stanje mirovanja. To se može učiniti bilo kojom od dvije naredbe:

updateF4Control16xSleep ();

updateF4ControlSleep (vrijednost);

Oboje postavljaju bitove načina rada na 00 (tj. Način mirovanja). Međutim, prvi postavlja osrs_t i osrs_p na 111 (tj. 16 mjerenja), dok drugi sprema niskih 6 bita iz "vrijednosti" u bitove 7: 2 registra 0xF4.

Slično, sljedeća izjava sprema niskih šest bitova "vrijednosti" u bitove 7: 2 registra 0xF5.

updateF5ConfigSleep (vrijednost);

Korištenje ovih posljednjih naredbi omogućuje pohranu 12 bitova informacija u registre BMP280 F4 i F5. Barem u slučaju ESP8266, kada se mikrokontroler probudi nakon razdoblja spavanja, on počinje na početku skice bez znanja o svom stanju prije naredbe sleep. Za spremanje znanja o svom stanju prije naredbe sleep, podaci se mogu pohraniti u flash memoriju, pomoću funkcija EEPROM ili zapisom datoteke pomoću SPIFFS -a. Međutim, flash memorija ima ograničenje broja ciklusa pisanja, reda od 10 000 do 100 000. To znači da ako mikrokontroler prolazi kroz ciklus mirovanja svakih nekoliko sekundi, može premašiti dopušteno upisivanje u memoriju ograničenje za nekoliko mjeseci. Pohrana nekoliko bitova podataka u BMP280 nema takvo ograničenje.

Podaci pohranjeni u registrima F4 i F5 mogu se oporaviti kada se mikrokontroler probudi pomoću naredbi

readF4Sleep ();

readF5Sleep ();

Ove funkcije čitaju odgovarajući registar, pomiču sadržaj kako bi uklonile 2 LSB -a i vratile preostalih 6 bita. Ove se funkcije koriste u primjeru skice powerSaverPressureAndTemperatureESP.ino na sljedeći način:

// očitavanje vrijednosti EventCounter natrag s bmp0

bajt bmp0F4value = bmp0.readF4Sleep (); // 0 do 63 bajta bmp0F5value = bmp0.readF5Sleep (); // 0 do 63 eventCounter = bmp0F5value*64+bmp0F4value; // od 0 do 4095

Ove funkcije čitaju odgovarajući registar, pomiču sadržaj kako bi uklonile 2 LSB -a i vratile preostalih 6 bitova. Ove se funkcije koriste u primjeru skice powerSaverPressureAndTemperature.ino na sljedeći način:

// čita vrijednost EventCounter natrag s bmp1

bajt bmp1F4value = bmp1.readF4Sleep (); // 0 do 63 bajta bmp1F5value = bmp1.readF5Sleep (); // 0 do 63 eventCounter = bmp1F5value*64+bmp1F4value; // od 0 do 4095

Sirove funkcije temperature i tlaka

Osnovne funkcije readTemperature, readPressure i readHumidity imaju dvije komponente. Prvo se sirove 20-bitne vrijednosti temperature i tlaka dobivaju iz BME/P280, ili se sirova 16-bitna vrijednost vlažnosti dobiva iz BME280. Zatim se algoritam kompenzacije koristi za generiranje izlaznih vrijednosti u stupnjevima Celzijusa, hPa ili %RH.

Knjižnica nudi zasebne funkcije za ove komponente, tako da se mogu dobiti sirovi podaci o temperaturi, tlaku i vlažnosti, a možda i na neki način njima manipulirati. Također je dan algoritam za izvođenje temperature, tlaka i vlažnosti iz ovih sirovih vrijednosti. U knjižnici su ti algoritmi implementirani pomoću aritmetike s pomičnom zarezom dvostruke duljine. Dobro radi na ESP8266 koji je 32-bitni procesor i koristi 64 bita za "dvostruke" varijable s pomičnim pokretom. Omogućivanje dostupnosti ovih funkcija može biti korisno za procjenu i eventualnu promjenu izračuna za druge platforme.

Ove funkcije su:

readRawPressure (rawTemperature); // čita podatke o sirovom tlaku i temperaturi iz BME/P280readRawHumidity (rawTemperature, rawPressure); // čita podatke o sirovoj vlažnosti, temperaturi i tlaku iz BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Argument "t-fine" ovih funkcija vrijedi malo objasniti. Algoritmi kompenzacije tlaka i vlažnosti uključuju komponentu ovisnu o temperaturi koja se postiže pomoću varijable t_fine. Funkcija calcTemperature upisuje vrijednost u t_fine na temelju logike algoritma kompenzacije temperature, koja se zatim koristi kao ulaz za calcPressure i calcHumidity.

Primjer korištenja ovih funkcija može se pronaći u primjeru skice rawPressureAndTemperature.ino, a također iu kodu za funkciju readHumidity () u.cpp datoteci biblioteke.

Pritisak nadmorske visine i razine mora

Poznata je veza između atmosferskog tlaka i nadmorske visine. Vrijeme također utječe na pritisak. Kad meteorološke organizacije objave podatke o atmosferskom tlaku, obično ih prilagode visini, pa "sinoptička karta" prikazuje izobare (linije stalnog tlaka) standardizirane na srednju razinu mora. Dakle, zaista postoje 3 vrijednosti u ovom odnosu, a poznavanje dvije od njih omogućuje izvođenje treće. Tri vrijednosti su:

  • nadmorske visine
  • stvarni tlak zraka na toj nadmorskoj visini
  • ekvivalentni tlak zraka na razini mora (strože, srednja razina mora jer se trenutna razina mora stalno mijenja)

Ova knjižnica nudi dvije funkcije za ovaj odnos, kako slijedi:

calcAltitude (tlak, seaLevelhPa);

calcNormalisedPressure (tlak, nadmorska visina);

Postoji i pojednostavljena verzija koja pretpostavlja standardni tlak razine mora od 1013,15 hPa.

calcAltitude (tlak); // pretpostavljen standardni standard seaLevelPressure

Korak 3: Pojedinosti o BMP280 uređaju

Pojedinosti o BMP280 uređaju
Pojedinosti o BMP280 uređaju

Mogućnosti hardvera

BMP280 ima 2 bajta konfiguracijskih podataka (na adresama registra 0xF4 i 0xF5) koji se koriste za kontrolu više mogućnosti mjerenja i izlaza podataka. Također pruža 2 bita informacija o statusu i 24 bajta kalibracijskih parametara koji se koriste za pretvaranje vrijednosti sirove temperature i tlaka u konvencionalne jedinice temperature i tlaka. BME280 ima dodatne podatke kako slijedi:

  • 1 dodatni bajt konfiguracijskih podataka na adresi registra 0xF2 koji se koristi za kontrolu više mjerenja vlažnosti;
  • 8 dodatnih bajtova kalibracijskih parametara koji se koriste za pretvaranje vrijednosti vlažne sirovine u postotak relativne vlažnosti.

Registri temperature, tlaka i statusa za BME280 isti su kao i za BMP280 uz manje iznimke, kako slijedi:

  • "ID" bitovi BME280 postavljeni su na 0x60, pa se mogu razlikovati od BMP280 koji mogu biti 0x56, 0x57 ili 0x58
  • kontrola vremena mirovanja (t_sb) se mijenja tako da se dva duga vremena u BMP280 (2000 ms i 4000 ms) zamjenjuju u BME280 s kratkim vremenima od 10 ms i 20 ms. Maksimalno vrijeme spavanja u BME280 je 1000 ms.
  • U BME280 vrijednosti temperature i tlaka su uvijek 20 bita ako se primjenjuje filtriranje. Korištenje 16 do 19 bitnih vrijednosti ograničeno je na slučajeve bez filtriranja (tj. Filter = 0).

Temperatura i tlak su svaki 20 -bitne vrijednosti, koje je potrebno pretvoriti u konvencionalnu temperaturu i tlak pomoću prilično složenog algoritma koji koristi 3 16 -bitne kalibracijske parametre za temperaturu i 9 16 -bitne kalibracijske parametre plus temperaturu za tlak. Granulatnost mjerenja temperature je 0,0003 stupnja Celzijusa za najmanje značajnu promjenu bita (očitanje od 20 bita), povećavajući se na 0,0046 stupnjeva Celzijusa ako se koristi očitanje od 16 bita.

Vlažnost je 16 -bitna vrijednost koju je potrebno pretvoriti u relativnu vlažnost pomoću drugog složenog algoritma pomoću 6 kalibracijskih parametara koji su mješavina 8, 12 i 16 bita.

Tehnički list prikazuje apsolutnu točnost očitanja temperature kao +-0,5 C pri 25 C i +-1 C u rasponu od 0 do 65 C.

Zrnatost mjerenja tlaka je 0,15 Paskala (tj. 0,0015 hektoPaskala) pri 20 bitnoj razlučivosti ili 2,5 Paskala pri 16 bitnoj razlučivosti. Na vrijednost sirovog tlaka utječe temperatura, tako da oko 25 ° C, porast temperature za 1 stupanj C smanjuje izmjereni tlak za 24 Paskala. Temperaturna osjetljivost uračunata je u kalibracijski algoritam, pa bi isporučene vrijednosti tlaka trebale biti točne pri različitim temperaturama.

Tehnički list prikazuje apsolutnu točnost očitanja tlaka kao +-1 hPa za temperature između 0 C i 65 C.

Točnost vlage data je u tehničkom listu kao +-3% RH i +-1% histereza.

Kako radi

24 bajta kalibracijskih podataka o temperaturi i tlaku, a također u slučaju BME280 8 bajta kalibracijskih podataka o vlažnosti moraju se očitati s uređaja i pohraniti u varijable. Ti su podaci pojedinačno tvornički programirani u uređaj, pa različiti uređaji imaju različite vrijednosti - barem za neke od parametara. BME/P280 može biti u jednom od dva stanja. U jednom je stanju mjerno. U drugom stanju čeka (spava).

U kojem se stanju može provjeriti gledajući bit 3 registra 0xF3.

Rezultati najnovijeg mjerenja mogu se dobiti u bilo kojem trenutku čitanjem odgovarajuće vrijednosti podataka, bez obzira spava li uređaj ili mjeri.

Postoje i dva načina rada BME/P280. Jedan je kontinuirani način rada (koji se u podatkovnom listu naziva normalni način rada) koji se neprestano mijenja između stanja mjerenja i stanja mirovanja. U ovom načinu rada uređaj izvodi niz mjerenja, zatim odlazi u san, zatim se budi radi drugog niza mjerenja itd. Broj pojedinačnih mjerenja i trajanje dijela ciklusa mirovanja mogu se kontrolirati kroz konfiguracijske registre.

Drugi način rada BME/P280 je način pojedinačnog snimanja (nazvan prisilni način u podatkovnoj tablici). U ovom načinu rada uređaj se budi iz stanja mirovanja naredbom za mjerenje, vrši niz mjerenja, a zatim se vraća u stanje mirovanja. Broj pojedinačnih mjerenja u skupu kontrolira se u konfiguracijskoj naredbi koja budi uređaj.

U BMP280, ako se izvrši jedno mjerenje, popunjava se 16 najznačajnijih bitova u vrijednosti, a četiri najmanje značajna bita u očitanju vrijednosti su sve nule. Broj mjerenja može se postaviti na 1, 2, 4, 8 ili 16, a kako se broj mjerenja povećava, povećava se broj bitova popunjenih podacima, tako da se sa 16 mjerenja svih 20 bita popunjava mjernim podacima. Tehnički list ovaj proces naziva prekomjernim uzorkovanjem.

U BME280 vrijedi isti raspored sve dok se rezultat ne filtrira. Ako se koristi filtriranje, vrijednosti su uvijek 20 bita, bez obzira na to koliko je mjerenja obavljeno u svakom ciklusu mjerenja.

Svako pojedinačno mjerenje traje oko 2 milisekunde (tipična vrijednost; maksimalna vrijednost je 2,3 ms). Dodamo li tome fiksni trošak od oko 2 ms (obično nešto manji) znači da niz mjerenja, koji se može sastojati od 1 do 32 pojedinačna mjerenja, može trajati od 4 ms do 66 ms.

Tehnički list daje skup preporučenih kombinacija prekomjernog uzorkovanja temperature i tlaka za različite primjene.

Registri kontrole konfiguracije

Dva registra za upravljanje konfiguracijom u BMP280 nalaze se na adresama registara 0xF4 i 0xF5 i mapirana su na 6 pojedinačnih vrijednosti kontrole konfiguracije. 0xF4 sastoji se od:

  • 3 bita osrs_t (izmjerite temperaturu 0, 1, 2, 4, 8 ili 16 puta);
  • 3 bita osrs_p (izmjerite tlak 0, 1, 2, 4, 8 ili 16 puta); i
  • 2 -bitni način rada (spavanje, prisilno (tj. Pojedinačni snimak), normalan (tj. Kontinuiran)).

0xF5 sastoji se od:

  • 3 bita t_sb (vrijeme pripravnosti, 0,5 ms do 4000 ms);
  • 3 -bitni filter (vidi dolje); i
  • 1 bit spiw_en koji odabire SPI ili I2C.

Parametar filtra kontrolira vrstu algoritma eksponencijalnog opadanja ili filtar Infinite Impulse Response (IIR), primijenjen na sirove vrijednosti mjerenja tlaka i temperature (ali ne i na vrijednosti vlažnosti). Jednadžba je navedena u tehničkom listu. Druga prezentacija je:

Vrijednost (n) = Vrijednost (n-1) * (K-1) / K + mjerenje (n) / K

gdje (n) označava najnoviju mjernu i izlaznu vrijednost; a K je parametar filtra. Parametar filtra K i može se postaviti na 1, 2, 4, 8 ili 16. Ako je K postavljeno na 1, jednadžba samo postaje Vrijednost (n) = mjerenje (n). Kodiranje parametra filtra je:

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

BME 280 dodaje daljnji registar za kontrolu konfiguracije na adresi 0xF2, "ctrl_hum" s jednim 3-bitnim parametrom osrs_h (mjerite vlažnost 0, 1, 2, 4, 8 ili 16 puta).

Korak 4: Mjerenje i vrijeme očitavanja

Ovo planiram dodati kasnije, prikazujući vrijeme naredbi i mjerne odgovore.

Iddt - struja pri mjerenju temperature. Uobičajena vrijednost 325 uA

Iddp - struja pri mjerenju tlaka. Uobičajena vrijednost 720 uA, max 1120 uA

Iddsb - struja u stanju čekanja. Uobičajena vrijednost 0,2 uA, max 0,5 uA

Iddsl - struja u stanju mirovanja. Uobičajena vrijednost 0,1 uA, max 0,3 uA

Korak 5: Smjernice za softver

Softverske smjernice
Softverske smjernice
Softverske smjernice
Softverske smjernice

I2C Burst način rada

Tehnički list BMP280 pruža smjernice za očitavanje podataka (odjeljak 3.9). Kaže "snažno se preporučuje korištenje burst čitanja i ne rješavanje svakog registra pojedinačno. To će spriječiti moguće miješanje bajtova koji pripadaju različitim mjerenjima i smanjiti promet sučelja." Ne daju se smjernice za čitanje parametara kompenzacije/kalibracije. Vjerojatno to nije problem jer su statični i ne mijenjaju se.

Ova knjižnica čita sve susjedne vrijednosti u jednoj operaciji čitanja - 24 bajta u slučaju parametara kompenzacije temperature i tlaka, 6 bajta za temperaturu i tlak zajedno, i 8 bajta za vlagu, temperaturu i tlak zajedno. Kad se provjeri samo temperatura, očitavaju se samo 3 bajta.

Korištenje makronaredbi (#define itd.)

U ovoj biblioteci nema makronaredbi osim uobičajene knjižnice "include guard" makro koja sprječava dupliciranje.

Sve se konstante definiraju pomoću ključne riječi const, a ispisivanjem pogrešaka upravlja se standardnim C funkcijama.

To je za mene bio izvor neke neizvjesnosti, ali savjet koji dobijem čitajući mnoge postove na tu temu je da je upotreba #define za deklariranje konstanti (barem) i (vjerojatno) kontrola ispisivanja pogrešaka nepotrebna i nepoželjna.

Slučaj korištenja const umjesto #define prilično je jasan - const koristi iste resurse kao #define (tj. Nula), a rezultirajuće vrijednosti slijede pravila opsega, čime se smanjuje mogućnost pogrešaka.

Slučaj kontrole ispisa za ispravljanje pogrešaka je nešto manje jasan, jer način na koji sam to učinio znači da konačni kod sadrži logiku za ispis ispravljanja pogrešaka, iako se oni nikad ne primjenjuju. Ako će se knjižnica koristiti u velikom projektu na mikrokontroleru s vrlo ograničenom memorijom, to može postati problem. Budući da se moj razvoj odvijao na ESP8266 s velikom flash memorijom, činilo mi se da to nije problem.

Korak 6: Performanse temperature

Ovo planiram dodati kasnije.

Korak 7: Izvođenje tlaka

Ovo planiram dodati kasnije.

Preporučeni: