Sadržaj:

Biblioteka za BMP280 i BME280: 7 koraka
Biblioteka za BMP280 i BME280: 7 koraka

Video: Biblioteka za BMP280 i BME280: 7 koraka

Video: Biblioteka za BMP280 i BME280: 7 koraka
Video: BME280 и BMP280, датчики для измерения атмосферного давления, температуры и влажности, различия 2024, Juli
Anonim
Biblioteka za BMP280 i BME280
Biblioteka za BMP280 i BME280
Biblioteka za BMP280 i BME280
Biblioteka za BMP280 i BME280
Biblioteka za BMP280 i BME280
Biblioteka za BMP280 i BME280

Uvod

Nisam krenuo u pisanje ove biblioteke. To se "dogodilo" kao nuspojava projekta koji sam započeo i koji koristi BMP280. Taj projekt još nije završen, ali mislim da je biblioteka spremna za dijeljenje s drugima. Nakon toga sam imao potrebu koristiti BME280, koji dodaje mjerenje vlažnosti tlaku i temperaturi BMP280. BME280 je "kompatibilan sa unatrag" s BMP280 - to jest, svi registri i koraci potrebni za očitavanje pritiska i temperature iz BME280 su isti 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 biblioteka za obje ili dvije zasebne biblioteke. Hardver za dva tipa 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 uređaja. Odlučio sam otići u jednu biblioteku. Izgleda da je sve u redu.

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

Značajke i mogućnosti biblioteke

Biblioteka je dio softvera koji pruža aplikacijsko sučelje za programiranje (API) za programera da vježba sposobnosti uređaja, bez potrebe da se bavi 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 mogućnosti bi biblioteka trebala slijediti sve posebne smjernice proizvođača uređaja, kao i opću dobru praksu softvera. Nastojao sam sve ovo postići. Kada sam počinjao s BMP280, pronašao sam 3 različite biblioteke za njega: Adafruit_BMP280; Seeed_BMP280; i jedan koji se zove 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 koristiti onu koju je proizveo proizvođač uređaja (Bosch Sensortec). Ovo je možda moj nedostatak, a ne njihov. Međutim, biblioteka je bila mnogo složenija od ostale dvije, nisam mogao pronaći upute ili primjere korištenja (naknadno sam otkrio da su primjeri u datoteci "bmp280_support.c", međutim oni mi nisu bili od posebne pomoći).

Kao rezultat ovih faktora, odlučio sam da napišem svoju biblioteku za BMP280.

Istražujući situaciju s bibliotekama za BME280, pronašao sam zasebne biblioteke Adafruit_BME280, Seed_BME280 i još jednu BME280_MOD-1022 koju je napisala Embedded Adventures. Nijedna od njih nije kombinirala funkcije za BMP280 u biblioteci koja može koristiti BME280. Nijedan od njih nije izričito podržavao sposobnost uređaja za pohranu nekoliko bitova podataka dok uređaj i njegov mikroprocesor za upravljanje spavaju (ta je mogućnost evidentna u podatkovnom listu i podržana u biblioteci koju sam ovdje napisao i opisao).

Kombinirana biblioteka 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 biblioteke uključuju manje bibliotečkih datoteka za upravljanje, jednostavno miješanje i podudaranje 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. Ovo su vjerovatno sve manje, č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 eBay -u kao modul sa 4 ili 6 izvađenih 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 sa I2C ili SPI protokolima. U I2C načinu rada može imati dvije različite adrese, postignute spajanjem SDO pina ili 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).

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

Biblioteku možete preuzeti ovdje:

github.com/farmerkeith/BMP280-library

Korak 1: Postavljanje hardvera

Postavljanje hardvera
Postavljanje hardvera

Prije nego što biblioteka 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 će biti 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 Kontrola adrese 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 linije trebale bi imati otpornike za povlač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 postavljanje više uređaja na I2C sabirnicu može ga preopteretiti). Međutim, korištenje 2 BME/P280 modula od kojih svaki ima 10K otpornik ne bi trebao predstavljati problem u praksi sve dok na istoj sabirnici nema previše drugih uređaja također sa otpornicima za podizanje.

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đe možete provjeriti imate li BMP280 ili BME280 tako što ćete pogledati 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 BMP280 uređaja "K", a u slučaju BME280 uređaja "U".

Korak 2: API -ji koje pruža biblioteka

API -ji koje pruža biblioteka
API -ji koje pruža biblioteka
API -ji koje pruža biblioteka
API -ji koje pruža biblioteka

Uključivanje biblioteke u skicu

Biblioteka 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 ().

Kreiranje softverskog objekta BME ili BMP

Postoje 3 nivoa za kreiranje softverskog objekta BMP280. Najjednostavnije je upravo

bme280 objectName; ili bmp280 objectName;

na primjer, BMP280 bmp0;

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

Sljedeći nivo za kreiranje 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 od svakog).

Treći nivo za kreiranje 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 ispisivanje pogrešaka. Ako je postavljeno na 1, svaka transakcija sa softverskim objektom rezultira izlazima Serial.print koji omogućavaju programeru da vidi detalje transakcije. Na primjer:

bmp280 objectNameB (1, 1);

Ako je parametar ispisivanja za otklanjanje grešaka postavljen na 0, softverski objekt se vraća na normalno ponašanje (nema ispisa).

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

Inicijalizacija softverskog objekta BME ili BMP

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

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), mode = 3 (kontinuirano, normalno), t_sb = 0 (0,5 ms spavanja između mjerni setovi), filter = 0 (K = 1, tako da nema filtriranja) i spiw_en = 0 (SPI onemogućen, pa koristite 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

Potpuna lista kodova i njihovo značenje nalazi se u BME280 i BMP280 podacima, kao i u komentarima u.cpp datoteci u biblioteci.

Jednostavno mjerenje temperature i pritiska

Najjednostavniji način je mjerenje temperature

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

Najjednostavniji način je mjerenje pritiska

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

Najjednostavniji način je mjerenje vlažnosti

dvostruka vlažnost = objectName.readHumidity (); // mjerenje vlažnosti (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 pritisak = ime objekta.čitaniPritisak (temperatura); // mjerenje pritiska i temperature

Ova izjava samo jednom čita podatke s BME280 ili BMP280 uređaja i vraća i temperaturu i pritisak. Ovo je malo učinkovitija upotreba sabirnice I2C i osigurava da dva očitanja odgovaraju istom ciklusu mjerenja.

Za BME 280, kombinovana izjava koja dobija sve tri vrijednosti (vlažnost, temperatura i pritisak) je:

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

Ova naredba samo jednom čita podatke s BMP280 uređaja i vraća sve tri vrijednosti. Ovo je nešto efikasnije 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 sviđa korisniku, ali njihov redoslijed je fiksiran - temperatura je na prvom mjestu, a pritisak na drugom mjestu.

Ovi slučajevi upotrebe obuhvaćeni su 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 pritiska

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

  1. uređaj radi neprekidno i stoga troši energiju na svom maksimalnom nivou. 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 koristi 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 rada = 0). Na primjer:

objectName.begin (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, način rada, 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 rada

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 broju zadanih 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 slučajeva vjerojatno je bolje odgoditi dok novo mjerenje ne bude dostupno.

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

  1. sačekajte fiksno vreme da pokrijete najduže očekivano kašnjenje
  2. sačekajte vremensko razdoblje izračunato 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ći vremenski period izračunat 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. Kada statusni bit čita 0 (tj. Ne mjeri se), dobijte očitanja temperature i pritiska.
  4. odmah započnite provjeru registra statusa i dobijte očitanja temperature i pritiska 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 ovo 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 biblioteci, koje pojednostavljuju softver za određene radnje.

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

while (bmp0.readRegister (0xF3) >> 3); // petlja unsl 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 koristi nekoliko drugih naredbi, pa ću ih sve predstaviti prije nego što detaljnije opišem tu skicu.

Kada 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, a senzor spava, tada se u vrijeme mjerenja senzor mora probuditi i reći mu svoju mjernu konfiguraciju. To se može učiniti direktno 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 obavljenog mjerenja, ako je način rada Single shot (prisilni način rada), uređaj će se automatski vratiti u stanje mirovanja. Međutim, ako skup mjerenja uključuje više mjerenja korištenjem kontinuiranog (normalnog) načina rada, BMP280 će se morati vratiti u stanje mirovanja. To se može učiniti pomoću bilo koje od dvije naredbe:

updateF4Control16xSleep ();

updateF4ControlSleep (vrijednost);

Oboje postavljaju bitove moda 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ći iskaz sprema niskih šest bitova "vrijednosti" u bitove 7: 2 registra 0xF5.

updateF5ConfigSleep (vrijednost);

Upotreba 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 perioda 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 pisanjem 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 spavanja-budnosti svakih nekoliko sekundi, može premašiti dozvoljeno upisivanje u memoriju ograničenje za nekoliko meseci. Pohranjivanje 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:

// čita vrijednost EventCounter natrag sa bmp0

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

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 powerSaverPressureAndTemperature.ino na sljedeći način:

// čita vrijednost EventCounter natrag sa bmp1

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

Sirove funkcije temperature i pritiska

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 vlažnost dobiva iz BME280. Zatim se algoritam kompenzacije koristi za generiranje izlaznih vrijednosti u stupnjevima Celzijusa, hPa ili %RH.

Biblioteka nudi zasebne funkcije za ove komponente, tako da se mogu dobiti sirovi podaci o temperaturi, pritisku i vlažnosti, a na neki način i manipulirati. Također je dat algoritam za izvođenje temperature, pritiska i vlažnosti iz ovih sirovih vrijednosti. U biblioteci se ovi algoritmi implementiraju pomoću aritmetike s pomičnim zarezom dvostruke dužine. Odlično funkcionira na ESP8266 koji je 32-bitni procesor i koristi 64 bita za "dvostruke" float varijable. Omogućavanje 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 pritisku i temperaturi iz BME/P280readRawHumidity (rawTemperature, rawPressure); // očitava sirove podatke o 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 kroz varijablu 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, kao i u kodu za funkciju readHumidity () u.cpp datoteci biblioteke.

Visina i pritisak na nivou mora

Poznata je veza između atmosferskog pritiska i nadmorske visine. Vrijeme također utječe na pritisak. Kada meteorološke organizacije objavljuju podatke o atmosferskom tlaku, obično ih prilagođavaju visini, pa "sinoptička karta" prikazuje izobare (linije konstantnog pritiska) 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 pritisak vazduha na toj nadmorskoj visini
  • ekvivalentni tlak zraka na razini mora (strože, srednja razina mora, jer se trenutna razina mora stalno mijenja)

Ova biblioteka nudi dvije funkcije za ovaj odnos, kako slijedi:

calcAltitude (tlak, seaLevelhPa);

calcNormalisedPressure (pritisak, nadmorska visina);

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

calcAltitude (pritisak); // pretpostavljen standardni standard seaLevelPressure

Korak 3: Detalji o uređaju BMP280

BMP280 Detalji o uređaju
BMP280 Detalji o uređaju

Mogućnosti hardvera

BMP280 ima 2 bajta konfiguracijskih podataka (na adresama registra 0xF4 i 0xF5) koji se koristi za kontrolu višestrukih opcija mjerenja i izlaza podataka. On također pruža 2 bita informacija o statusu i 24 bajta kalibracijskih parametara koji se koriste za pretvaranje sirove temperature i vrijednosti tlaka u konvencionalne jedinice temperature i pritiska. 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, pritiska 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 sa 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 pritisak putem 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 stepena Celzijusa za najmanje značajnu promjenu bita (očitavanje od 20 bita), povećavajući se na 0,0046 stepeni Celzijusa ako se koristi čitanje od 16 bita.

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

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

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

Tehnički list prikazuje apsolutnu tačnost očitavanja pritiska kao +-1 hPa za temperature između 0 C i 65 C.

Tačnost vlažnosti data je u tehničkom listu kao +-3% RH i +-1% histereze.

Kako radi

24 bajta kalibracijskih podataka o temperaturi i tlaku, a također u slučaju BME280 8 bajtova 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 stanju to je mjerenje. U drugom stanju čeka (spava).

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

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

Postoje i dva načina rada BME/P280. Jedan je kontinuirani način rada (koji se u listu sa podacima 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 stanje mirovanja, zatim se budi radi drugog skupa 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 snimanja pojedinačnim snimanjem (u tablici sa podacima naziva se prisilni način rada). U ovom načinu rada uređaj se budi iz stanja sna naredbom za mjerenje, vrši niz mjerenja, a zatim se vraća u stanje mirovanja. Broj pojedinačnih mjerenja u skupu kontrolira se u naredbi za konfiguraciju 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 nule. Broj mjerenja može se postaviti na 1, 2, 4, 8 ili 16, a kako se broj mjerenja povećava, broj bitova popunjenih podacima raste, tako da se sa 16 mjerenja svih 20 bita popunjava mjernim podacima. Tehnički list naziva ovaj proces preuzorkivanjem.

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). Dodajte tome fiksni režijski 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 pruža skup preporučenih kombinacija prekomjernog uzorkovanja temperature i pritiska 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 se sastoji od:

  • 3 bita osrs_t (mjerite temperaturu 0, 1, 2, 4, 8 ili 16 puta);
  • 3 bita osrs_p (mjerite pritisak 0, 1, 2, 4, 8 ili 16 puta); i
  • 2 bita Režim (spavanje, prisilno (tj. Pojedinačni snimak), normalan (tj. Kontinuiran)).

0xF5 se sastoji od:

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

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

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

gdje (n) označava najnovije mjerenje i izlaznu vrijednost; a K je parametar filtra. Parametar filtera 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 filtera 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 konfiguraciju 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

Planiram ovo dodati kasnije, pokazujući vrijeme naredbi i mjerne odgovore.

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

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

Iddsb - trenutno u stanju pripravnosti. Uobičajena vrijednost 0,2 uA, max 0,5 uA

Iddsl - trenutno 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 adresiranje 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 biblioteka č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 vlažnost, temperaturu i tlak zajedno. Kada se provjeri samo temperatura, očitavaju se samo 3 bajta.

Upotreba makroa (#define itd.)

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

Sve konstante su definirane pomoću ključne riječi const, a ispisivanjem pogrešaka kontroliraju se standardne C funkcije.

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

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

Slučaj za kontrolu ispisivanja greš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 ispise za ispravljanje pogrešaka, iako se oni nikada ne primjenjuju. Ako se biblioteka koristi 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, to mi se nije činilo problemom.

Korak 6: Performanse temperature

Ovo planiram da dodam kasnije.

Korak 7: Performanse pritiska

Ovo planiram da dodam kasnije.

Preporučuje se: