Kazalo:

Knjižnica za BMP280 in BME280: 7 korakov
Knjižnica za BMP280 in BME280: 7 korakov

Video: Knjižnica za BMP280 in BME280: 7 korakov

Video: Knjižnica za BMP280 in BME280: 7 korakov
Video: Layak gak? Programming Nodemcu pakai Smartphone Android? (Subtittled) 2024, Julij
Anonim
Knjižnica za BMP280 in BME280
Knjižnica za BMP280 in BME280
Knjižnica za BMP280 in BME280
Knjižnica za BMP280 in BME280
Knjižnica za BMP280 in BME280
Knjižnica za BMP280 in BME280

Uvod

Nisem se odločil za pisanje te knjižnice. "To se je zgodilo" kot stranski učinek projekta, ki sem ga začel, ki uporablja BMP280. Ta projekt še ni končan, vendar mislim, da je knjižnica pripravljena deliti z drugimi. Nato sem moral uporabiti BME280, ki dodaja merjenje vlažnosti tlaku in temperaturi zmogljivosti BMP280. BME280 je "nazaj kompatibilen" z BMP280 - to pomeni, da so vsi registri in koraki, potrebni za branje tlaka in temperature iz BME280, enaki kot pri BMP280. Za branje vlažnosti so potrebni dodatni registri in koraki, ki veljajo samo za BME280. Ob tem se postavlja vprašanje, ena knjižnica za obe ali dve ločeni knjižnici. Strojna oprema za obe vrsti naprav je popolnoma zamenljiva. Tudi mnogi moduli, ki se prodajajo (na primer na Ebayu in AliExpressu), imajo oznako BME/P280. Če želite ugotoviti, za katero vrsto gre, morate pogledati (miniaturno) napis na samem senzorju ali preizkusiti bajt ID -ja naprave. Odločil sem se za eno knjižnico. Zdi se, da je šlo v redu.

Povratne informacije, zlasti predlogi za izboljšave, bodo cenjeni.

Knjižnične funkcije in zmogljivosti

Knjižnica je del programske opreme, ki programerju ponuja vmesnik za aplikacijsko programiranje (API) za izvajanje zmogljivosti naprave, ne da bi se bilo treba ukvarjati z vsemi podrobnostmi. Zaželeno je, da bi bil vmesnik API preprost za začetnike s preprostimi zahtevami za začetek, hkrati pa bi zagotovil popolno izkoriščanje zmogljivosti naprave. Zaželeno je, da bi knjižnica upoštevala vse posebne smernice proizvajalca naprave in splošno dobro programsko prakso. Vse to sem si prizadeval doseči. Ko sem začel z BMP280, sem zanj našel 3 različne knjižnice: Adafruit_BMP280; Seeed_BMP280; in enega, imenovanega BMP280, proizvajalca naprave. Niti Adafruit niti Seeed nista nudila razširjenih zmogljivosti, čeprav sta dobro delovala in sta bili enostavni za uporabo v osnovnih aplikacijah. Nisem si mogel predstavljati, kako uporabiti tisto, ki jo je izdelal proizvajalec naprave (Bosch Sensortec). To je lahko moja pomanjkljivost in ne njihova. Vendar je bila knjižnica veliko bolj zapletena od ostalih dveh, nisem našel navodil ali primerov uporabe (pozneje sem ugotovil, da so primeri v datoteki "bmp280_support.c", vendar mi ti niso bili v veliko pomoč).

Zaradi teh dejavnikov sem se odločil, da bom za BMP280 napisal svojo knjižnico.

Če pogledam stanje knjižnice za BME280, sem našel ločene knjižnice Adafruit_BME280, Seed_BME280 in še eno BME280_MOD-1022, ki jo je napisal Embedded Adventures. Nobena od njih ni združila funkcij za BMP280 v knjižnici, ki lahko uporablja BME280. Nobena od njih izrecno ne podpira zmožnosti naprav, da shranijo nekaj bitov podatkov, medtem ko naprava in njen krmilni mikroprocesor spijo (ta sposobnost je očitna v podatkovnem listu in je podprta v knjižnici, ki sem jo tukaj napisal in opisal).

Kombinirana knjižnica bi morala podpirati vse zmogljivosti BME280, vendar pri uporabi z BMP280 ne bi smela nalagati dodatnih stroškov zaradi neuporabljenih funkcij. Prednosti kombinirane knjižnice vključujejo manj knjižničnih datotek za upravljanje, enostavno mešanje in ujemanje različnih naprav v istem projektu in poenostavljene spremembe za vzdrževanje ali nadgradnje, ki jih je treba opraviti le na enem mestu in ne na dveh. Vse to so verjetno precej majhne, celo nepomembne, vendar …

Zmogljivosti naprave

BMP280 in BME280 sta površinsko nameščeni napravi velikosti približno 5 mm kvadratni in 1 mm visoki. Obstaja 8 vmesniških ploščic, vključno z 2 ločenima vhodnima blazinicama in dvema ozemljitvenima ploščicama. Na voljo so na eBayu kot modul s 4 ali 6 zatiči. 4-polni modul ima stalen naslov I2C in ga ni mogoče konfigurirati za uporabo protokola SPI.

6-polni modul ali golo napravo lahko uporabljate s protokoli I2C ali SPI. V načinu I2C ima lahko dva različna naslova, ki jih dosežete s priključitvijo zatiča SDO bodisi na ozemljitev (za osnovni naslov = 0x76) bodisi na Vdd (za osnovni naslov +1 = 0x77). V načinu SPI ima običajno razporeditev 1 ure, 2 podatkov (po en za vsako smer) in zatiča za izbiro naprave (CS).

Knjižnica, ki sem jo napisal in opisal, podpira samo I2C. Knjižnici Adafruit_BMP280 in BME_MOD-1022 podpirata i2C in SPI.

Knjižnico lahko prenesete tukaj:

github.com/farmerkeith/BMP280-library

1. korak: Nastavitev strojne opreme

Nastavitev strojne opreme
Nastavitev strojne opreme

Preden je knjižnica uporabna, je potrebno mikrokontroler priključiti na BMP280 (ali na dva, če želite).

Uporabil sem WeMos D1 mini pro, zato bom pokazal njegove povezave. Drugi mikrokrmilniki bodo podobni, le pravilno priključiti zatiče SDA in SCL.

V primeru WeMos D1 mini pro so povezave:

Funkcija pin WeMos pin BMP280 Opombe

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominalno 3.3V Ground GND Nadzor naslova SDO Ground ali Vdd I2C izberite CSB Vdd (GND izbere SPI)

Upoštevajte, da je pin SDO na nekaterih modulih MP280 označen s SDD, pin Vdd pa z oznako VCC. Opomba: Linije SDA in SCL bi morale imeti vlečne upore med linijo in vmesnikom Vin. Običajno bi morala biti vrednost 4,7K v redu. Nekateri moduli BMP280 in BME280 imajo v modulu vključenih 10K vlečnih uporov (kar ni dobra praksa, saj lahko dajanje več naprav na vodilo I2C povzroči prekomerno obremenitev). Vendar uporaba 2 modulov BME/P280, vsak z 10K uporom, v praksi ne bi smel biti problem, če na istem vodilu ni preveč drugih naprav, tudi z vlečnimi upori.

Ko priključite strojno opremo, lahko preprosto preverite, ali je vaša naprava BMP280 ali BME280, tako da zaženete skico I2CScan_ID, ki jo najdete tukaj:

Ali imate BMP280 ali BME280, lahko preverite tudi tako, da pogledate samo napravo. Ugotovil sem, da je za to potrebno uporabiti digitalni mikroskop, če pa je vaš vid zelo dober, boste to morda storili brez kakršnih koli pripomočkov. Na ohišju naprave sta dve vrsti tiskanja. Ključ je prva črka v drugi vrstici, ki je v primeru naprav BMP280 "K" in v primeru naprav BME280 "U".

2. korak: API -ji, ki jih ponuja knjižnica

API -ji, ki jih ponuja knjižnica
API -ji, ki jih ponuja knjižnica
API -ji, ki jih ponuja knjižnica
API -ji, ki jih ponuja knjižnica

Vključitev knjižnice v skico

Knjižnica je standardno vključena v skico z uporabo stavka

#include "farmerkeith_BMP280.h"

Ta stavek je treba vključiti v zgodnji del skice pred začetkom funkcije setup ().

Ustvarjanje programskega predmeta BME ali BMP

Obstajajo 3 stopnje za ustvarjanje programskega predmeta BMP280. Najenostavnejše je samo

bme280 objectName; ali bmp280 objectName;

na primer BMP280 bmp0;

Tako nastane objekt programske opreme s privzetim naslovom 0x76 (tj. Za SDO, priključen na ozemljitev).

Naslednja raven za ustvarjanje programskega objekta BME280 ali BMP280 ima parameter bodisi 0 ali 1, kot sledi:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parameter (0 ali 1) je dodan osnovnemu naslovu I2C, tako da lahko na istem vodilu I2C (vključno z vsakim po eno) uporabite dve napravi BME280 ali BMP280.

Tretja stopnja za ustvarjanje programskega objekta BME ali BMP280 ima dva parametra. Prvi parameter, ki je 0 ali 1, je za naslov, tako kot za prejšnji primer. Drugi parameter nadzoruje tiskanje napak. Če je nastavljeno na 1, vsaka transakcija s objektom programske opreme povzroči izhode Serial.print, ki programerju omogočajo, da vidi podrobnosti transakcije. Na primer:

bmp280 objectNameB (1, 1);

Če je parameter za odpravljanje napak nastavljen na 0, se predmet programske opreme vrne v običajno vedenje (brez tiskanja).

Ta stavek ali stavke je treba vključiti po #include in pred funkcijo setup ().

Inicializiranje programskega objekta BME ali BMP

Pred uporabo morate prebrati kalibracijske parametre iz naprave in jo konfigurirati za kateri koli način merjenja, preveliko vzorčenje in nastavitve filtra.

Za preprosto inicializacijo splošnega namena je izjava:

objectName.begin ();

Ta različica begin () bere kalibracijske parametre iz naprave in nastavi osrs_t = 7 (16 meritev temperature), osrs_p = 7 (16 meritev tlaka), način = 3 (neprekinjeno, normalno), t_sb = 0 (0,5 ms spanja med merilni sklopi), filter = 0 (K = 1, torej brez filtriranja) in spiw_en = 0 (SPI onemogočen, zato uporabite I2C). V primeru BME280 obstaja dodatni parameter osrs_h = 7 za 16 meritev vlažnosti.

Obstaja še ena različica begin (), ki sprejme vseh šest (ali 7) parametrov. Ekvivalent zgornje izjave je

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

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

Celoten seznam kod in njihovih pomenov je v podatkovnem listu BME280 in BMP280 ter v komentarjih v datoteki.cpp v knjižnici.

Enostavno merjenje temperature in tlaka

Najlažji način za merjenje temperature je

dvojna temperatura = objectName.readTemperature (); // merjenje temperature

Najlažji način za merjenje tlaka je

dvojni tlak = objectName.readPressure (); // merjenje tlaka

Najlažji način za merjenje vlažnosti je

dvojna vlažnost = objectName.readHumidity (); // merjenje vlažnosti (samo BME280)

Za doseganje temperature in tlaka se lahko zgornji dve izjavi uporabljata ena za drugo, vendar obstaja še ena možnost, in sicer:

dvojna temperatura;

dvojni tlak = ime objekta.readPressure (temperatura); // merjenje tlaka in temperature

Ta izjava samo enkrat prebere podatke iz naprav BME280 ali BMP280 in vrne temperaturo in tlak. To je nekoliko učinkovitejša uporaba vodila I2C in zagotavlja, da obe odčitki ustrezata istemu merilnemu ciklu.

Za BME 280 je kombinirana izjava, ki dobi vse tri vrednosti (vlažnost, temperaturo in tlak):

dvojna temperatura, tlak; dvojna vlažnost = ime objekta.readHumidity (temperatura, tlak); // merjenje vlažnosti, tlaka in temperature

Ta stavek samo enkrat prebere podatke iz naprave BMP280 in vrne vse tri vrednosti. To je nekoliko učinkovitejša uporaba vodila I2C in zagotavlja, da tri odčitke ustrezajo istemu merilnemu ciklu. Upoštevajte, da se imena spremenljivk lahko spremenijo v vse, kar je uporabniku všeč, vendar je njihov vrstni red določen - temperatura je na prvem mestu, pritisk pa na drugem.

Ti primeri uporabe so zajeti v vzorčnih skicah, ki so priložene knjižnici, in sicer basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino in basicHumidityAndTemperatureAndPressure.ino.

Bolj izpopolnjeno merjenje temperature in tlaka

Čeprav bo zgornja serija izjav delovala brez težav, obstaja nekaj vprašanj:

  1. naprava neprekinjeno deluje in zato porablja energijo na najvišji ravni. Če energija prihaja iz baterije, jo boste morda morali zmanjšati.
  2. zaradi porabljene energije se bo naprava segrela, zato bo izmerjena temperatura višja od temperature okolice. O tem bom podrobneje govoril v naslednjem koraku.

Rezultat, ki porabi manj energije in daje temperaturo, ki je bližje okolici, je mogoče doseči z uporabo begin () s parametri, ki ga zaspijo (npr. Način = 0). Na primer:

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

Nato, ko želite meritev, prebudite napravo s konfiguracijskim ukazom za registra F2 (če je potrebno) in F4, ki nastavi ustrezne vrednosti osrs_h, osrs_t in osrs_p, plus način = 1 (način posamičnega posnetka). Na primer:

[objectName.updateF2Control (1);] // osrs_h - nikoli ni potrebno za BMP280, // in ni potrebno za BME280, če se število meritev ne spremeni // od vrednosti, navedene v begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, način

Ko je naprava prebudila, se bo začela meriti, vendar rezultat ne bo na voljo nekaj milisekund - vsaj 4 ms, morda do 70 ms ali več, odvisno od števila podanih meritev. Če je ukaz za branje poslan takoj, bo naprava vrnila vrednosti iz prejšnje meritve - kar je v nekaterih aplikacijah morda sprejemljivo, vendar je v večini primerov verjetno bolje odložiti, dokler nova meritev ni na voljo.

To zamudo je mogoče narediti na več načinov.

  1. počakajte na določen čas, da pokrijete najdaljšo pričakovano zamudo
  2. počakajte na čas, izračunan iz največjega časa merjenja na meritev (tj. 2,3 ms), ki je pomnožen s številom meritev, skupaj z režijskimi stroški in rezervo.
  3. počakajte na krajši čas, izračunan kot zgoraj, vendar z uporabo nominalnega časa merjenja (tj. 2 ms) plus režijske stroške, nato pa začnite preverjati bit "merim" v registru stanja. Ko statusni bit odčita 0 (tj. Ne meri), dobite odčitke temperature in tlaka.
  4. takoj začnite preverjati register stanja in pridobite odčitke temperature in tlaka, ko statusni bit odčita 0,

Primer enega od načinov tega bom pokazal nekoliko kasneje.

Operacije registra konfiguracije

Za vse to potrebujemo več orodij, ki jih še nisem predstavil. So:

byte readRegister (reg)

void updateRegister (reg, vrednost)

Vsak od teh ima v knjižnici več izvedenih ukazov, ki nekoliko olajšajo programsko opremo za določena dejanja.

Primer powerSaverPressureAndTemperature.ino uporablja metodo št. 3. Vrstica kode, ki izvaja ponavljajoče se preverjanje, je

while (bmp0.readRegister (0xF3) >> 3); // zanka unsl F3bit 3 == 0

Upoštevajte, da je ta skica namenjena mikrokrmilniku ESP8266. Uporabil sem WeMos D1 mini pro. Skica ne bo delovala z mikrokrmilniki Atmega, ki imajo drugačna navodila za spanje. Ta skica izvaja več drugih ukazov, zato jih bom predstavil, preden bom to skico podrobneje opisal.

Ko mikrokrmilnik spi vzporedno s tipalom BMP280, lahko konfiguracijo tipala za potrebne meritve izvedete v ukazu begin () z uporabo 6 parametrov. Če pa mikrokrmilnik ne spi, senzor pa spi, ga je treba v času merjenja prebuditi in mu povedati njegovo konfiguracijo merjenja. To lahko storite neposredno z

updateRegister (reg, vrednost)

vendar je z naslednjimi tremi ukazi nekoliko lažje:

updateF2Control (osrs_h); // samo BME280

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

Če je način merjenja enkratni posnetek (prisilni način), se naprava samodejno vrne v stanje spanja. Če pa merilni niz vključuje več meritev z neprekinjenim (normalnim) načinom, bo treba BMP280 preklopiti nazaj v stanje spanja. To lahko storite z enim od naslednjih dveh ukazov:

updateF4Control16xSleep ();

updateF4ControlSleep (vrednost);

Oba nastavita bita načina na 00 (tj. Način mirovanja). Vendar prvi nastavi osrs_t in osrs_p na 111 (tj. 16 meritev), drugi pa shrani nizkih 6 bitov iz "vrednosti" v bite 7: 2 registra 0xF4.

Podobno naslednji stavek shrani nizkih šest bitov "vrednosti" v bite 7: 2 registra 0xF5.

updateF5ConfigSleep (vrednost);

Uporaba teh zadnjih ukazov omogoča shranjevanje 12 bitov informacij v registre BMP280 F4 in F5. Vsaj v primeru ESP8266, ko se mikrokrmilnik prebudi po obdobju spanja, se zažene na začetku skice, ne da bi vedel za svoje stanje pred ukazom za spanje. Za shranjevanje znanja o svojem stanju pred ukazom za spanje lahko podatke shranimo v pomnilnik flash z uporabo funkcij EEPROM ali s pisanjem datoteke s SPIFFS. Vendar ima flash pomnilnik omejitev števila ciklov pisanja, in sicer od 10 000 do 100 000. To pomeni, da lahko mikrokrmilnik vsakih nekaj sekund skozi cikel spanja in budnosti preseže dovoljeno zapisovanje v pomnilnik. omejitev v nekaj mesecih. Shranjevanje nekaj bitov podatkov v BMP280 nima takšnih omejitev.

Podatke, shranjene v registrih F4 in F5, je mogoče obnoviti, ko se mikrokrmilnik prebudi z ukazi

readF4Sleep ();

readF5Sleep ();

Te funkcije preberejo ustrezen register, premaknejo vsebino, da odstranijo 2 LSB -ja in vrnejo preostalih 6 bitov. Te funkcije se v primeru skice powerSaverPressureAndTemperatureESP.ino uporabljajo na naslednji način:

// odčitamo vrednost EventCounterja iz bmp0

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

Te funkcije preberejo ustrezen register, premaknejo vsebino, da odstranijo 2 LSB -ja in vrnejo preostalih 6 bitov. Te funkcije se v primeru skice powerSaverPressureAndTemperature.ino uporabljajo na naslednji način:

// odčitamo vrednost EventCounterja iz bmp1

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

Neobdelane funkcije temperature in tlaka

Osnovne funkcije readTemperature, readPressure in readHumidity imajo dve komponenti. Najprej se iz BME/P280 pridobijo surove 20-bitne vrednosti temperature in tlaka ali pa surove 16-bitne vrednosti vlažnosti iz BME280. Nato se kompenzacijski algoritem uporabi za ustvarjanje izhodnih vrednosti v stopinjah Celzija, hPa ali %RH.

Knjižnica ponuja ločene funkcije za te komponente, tako da je mogoče pridobiti surove podatke o temperaturi, tlaku in vlažnosti in jih morda na nek način upravljati. Zagotovljen je tudi algoritem za določanje temperature, tlaka in vlažnosti iz teh surovih vrednosti. V knjižnici se ti algoritmi izvajajo z aritmetiko s plavajočo vejico z dvojno dolžino. Dobro deluje na ESP8266, ki je 32-bitni procesor in uporablja 64 bitov za "dvojne" plavajoče spremenljivke. Omogočanje dostopnosti teh funkcij je lahko koristno za oceno in morebitno spremembo izračuna za druge platforme.

Te funkcije so:

readRawPressure (rawTemperature); // bere surove podatke o tlaku in temperaturi iz BME/P280readRawHumidity (rawTemperature, rawPressure); // bere surove podatke o vlažnosti, temperaturi in tlaku iz BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Argument "t-fine" za te funkcije je vreden nekoliko razlage. Tako algoritmi za kompenzacijo tlaka in vlažnosti vključujejo komponento, ki je odvisna od temperature, kar se doseže s spremenljivko t_fine. Funkcija calcTemperature zapiše vrednost v t_fine na podlagi logike algoritma kompenzacije temperature, ki se nato uporabi kot vhod v kalcPressure in calcHumidity.

Primer uporabe teh funkcij lahko najdete v primeru skice rawPressureAndTemperature.ino in tudi v kodi za funkcijo readHumidity () v datoteki.cpp knjižnice.

Nadmorska višina in tlak morske gladine

Znano je razmerje med atmosferskim tlakom in nadmorsko višino. Na pritisk vpliva tudi vreme. Ko vremenske organizacije objavijo podatke o atmosferskem tlaku, jih običajno prilagodijo višini, zato "sinoptična karta" prikazuje izobarje (črte stalnega tlaka), standardizirane na povprečno morsko gladino. Torej v resnici obstajajo 3 vrednote in poznavanje dveh od njih omogoča izpeljavo tretje. Tri vrednosti so:

  • nadmorske višine
  • dejanski zračni tlak na tej nadmorski višini
  • enakovreden zračni tlak na morski gladini (strožje, povprečna morska gladina, ker se trenutna gladina morja nenehno spreminja)

Ta knjižnica ponuja dve funkciji za to razmerje, in sicer:

calcAltitude (tlak, seaLevelhPa);

kalcNormaliziran tlak (tlak, nadmorska višina);

Obstaja tudi poenostavljena različica, ki predvideva standardni tlak morske gladine 1013,15 hPa.

calcAltitude (tlak); // predpostavljen standardni standard seaLevelPressure

3. korak: Podrobnosti o napravi BMP280

Podrobnosti o napravi BMP280
Podrobnosti o napravi BMP280

Zmogljivosti strojne opreme

BMP280 ima 2 bajta konfiguracijskih podatkov (na naslovih registra 0xF4 in 0xF5), ki se uporablja za nadzor več možnosti merjenja in izhoda podatkov. Zagotavlja tudi 2 bita informacij o stanju in 24 bajtov kalibracijskih parametrov, ki se uporabljajo pri pretvorbi surove temperature in vrednosti tlaka v običajne enote temperature in tlaka. BME280 ima naslednje dodatne podatke:

  • 1 dodaten bajt konfiguracijskih podatkov na naslovu registra 0xF2, ki se uporablja za nadzor več meritev vlažnosti;
  • 8 dodatnih bajtov kalibracijskih parametrov, uporabljenih za pretvorbo vrednosti surove vlage v odstotek relativne vlažnosti.

Registri temperature, tlaka in stanja za BME280 so enaki kot za BMP280 z manjšimi izjemami:

  • bitovi "ID" BME280 so nastavljeni na 0x60, zato jih je mogoče razlikovati od BMP280, ki je lahko 0x56, 0x57 ali 0x58
  • nadzor časa mirovanja (t_sb) se spremeni tako, da se dva dolga časa v BMP280 (2000 ms in 4000 ms) zamenjata v BME280 s kratkimi časi 10 ms in 20 ms. Največji čas spanja v BME280 je 1000 ms.
  • Pri uporabi filtra BME280 sta surovi vrednosti temperature in tlaka vedno 20 bitov. Uporaba 16 do 19 bitnih vrednosti je omejena na primere brez filtriranja (tj. Filter = 0).

Temperatura in tlak sta vsaki 20 -bitni vrednosti, ki ju je treba pretvoriti v običajno temperaturo in tlak s precej zapletenim algoritmom z uporabo 3 16 -bitnih kalibracijskih parametrov za temperaturo in 9 16 -bitnih kalibracijskih parametrov ter temperature za tlak. Zrnatost merjenja temperature je 0,0003 stopinj Celzija za najmanj pomembno spremembo bitov (20 -bitni odčitek), če se uporabi 16 -bitno odčitavanje, se poveča na 0,0046 stopinje Celzija.

Vlažnost je 16 -bitna vrednost, ki jo je treba pretvoriti v relativno vlažnost s pomočjo drugega kompleksnega algoritma z uporabo 6 kalibracijskih parametrov, ki so mešanica 8, 12 in 16 bitov.

Podatkovni list prikazuje absolutno natančnost odčitavanja temperature kot +-0,5 C pri 25 C in +-1 C v območju od 0 do 65 C.

Zrnatost merjenja tlaka je 0,15 Paskalov (tj. 0,0015 hektoPaskala) pri 20 -bitni ločljivosti ali 2,5 Pascala pri 16 -bitni ločljivosti. Na vrednost surovega tlaka vpliva temperatura, tako da okoli 25 ° C zvišanje temperature za 1 stopinjo C zmanjša izmerjeni tlak za 24 Paskalov. Temperaturna občutljivost je upoštevana v kalibracijskem algoritmu, zato morajo biti vrednosti tlaka pri različnih temperaturah točne.

Tehnični list prikazuje absolutno natančnost odčitka tlaka kot +-1 hPa za temperature med 0 C in 65 C.

Natančnost vlažnosti je v podatkovnem listu podana kot +-3% RH in +-1% histereza.

Kako deluje

24 bajtov kalibracijskih podatkov o temperaturi in tlaku, v primeru BME280 pa 8 bajtov kalibracijskih podatkov o vlažnosti, je treba prebrati iz naprave in shraniti v spremenljivke. Ti podatki so v napravi tovarniško programirani posamično, zato imajo različne naprave različne vrednosti - vsaj za nekatere parametre. BME/P280 je lahko v enem od dveh stanj. V enem stanju je merilno. V drugem stanju čaka (spi).

V katerem stanju je, lahko preverite tako, da pogledate bit 3 registra 0xF3.

Rezultate najnovejše meritve lahko kadar koli dobite z branjem ustrezne vrednosti podatkov, ne glede na to, ali naprava spi ali meri.

BME/P280 delujeta tudi na dva načina. Eden je neprekinjen način (v podatkovnem listu imenovan normalni način), ki večkrat preklaplja med merilnimi in spalnimi stanji. V tem načinu naprava izvede niz meritev, nato zaspi, nato se zbudi za še en niz meritev itd. Število posameznih meritev in trajanje spalnega dela cikla je mogoče nadzorovati prek konfiguracijskih registrov.

Drugi način upravljanja BME/P280 je način Single Shot (v podatkovnem listu se imenuje prisilni način). V tem načinu napravo z ukazom za merjenje prebudi iz stanja spanja, opravi niz meritev in se nato vrne v stanje spanja. Število posameznih meritev v nizu je nadzorovano v konfiguracijskem ukazu, ki prebudi napravo.

V BMP280 se, če se izvede ena sama meritev, zapolni 16 najpomembnejših bitov vrednosti, štirje najmanj pomembni biti v odčitani vrednosti pa so ničle. Število meritev lahko nastavite na 1, 2, 4, 8 ali 16 in s povečanjem števila meritev se poveča število bitov, zasedenih s podatki, tako da se pri 16 meritvah vseh 20 bitov naseli z merilnimi podatki. V podatkovnem listu se ta postopek imenuje preveliko vzorčenje.

V BME280 velja ista ureditev, dokler rezultat ni filtriran. Če se uporablja filtriranje, so vrednosti vedno 20 bitov, ne glede na to, koliko meritev se izvede v vsakem merilnem ciklu.

Vsaka posamezna meritev traja približno 2 milisekundi (tipična vrednost; največja vrednost je 2,3 ms). Če k temu dodamo fiksne režijske stroške približno 2 ms (običajno nekoliko manj), pomeni, da lahko merilno zaporedje, ki ga lahko sestavlja od 1 do 32 posameznih meritev, traja od 4 ms do 66 ms.

Tehnični list vsebuje niz priporočenih kombinacij prevelikega vzorčenja temperature in tlaka za različne aplikacije.

Registri za nadzor konfiguracije

Dva registra za nadzor konfiguracije v BMP280 sta na naslovih registrov 0xF4 in 0xF5 in sta preslikana na 6 posameznih vrednosti nadzora konfiguracije. 0xF4 je sestavljen iz:

  • 3 bitov osrs_t (izmerite temperaturo 0, 1, 2, 4, 8 ali 16 -krat);
  • 3 bitov osrs_p (izmerite tlak 0, 1, 2, 4, 8 ali 16 -krat); in
  • 2 -bitni način (spanje, prisilno (tj. Posamični posnetek), normalno (tj. Neprekinjeno).

0xF5 je sestavljen iz:

  • 3 bitov t_sb (čas pripravljenosti, 0,5 ms do 4000 ms);
  • 3 -bitni filter (glej spodaj); in
  • 1 bit spiw_en, ki izbere SPI ali I2C.

Parameter filtra nadzoruje vrsto algoritma eksponentnega upadanja ali filter Infinite Impulse Response (IIR), uporabljen za vrednosti surovega tlaka in temperature (vendar ne za vrednosti vlažnosti). Enačba je podana v podatkovnem listu. Druga predstavitev je:

Vrednost (n) = Vrednost (n-1) * (K-1) / K + meritev (n) / K

kjer (n) označuje najnovejšo merilno in izhodno vrednost; in K je parameter filtra. Parameter filtra K in ga lahko nastavite na 1, 2, 4, 8 ali 16. Če je K nastavljen na 1, enačba postane samo vrednost (n) = meritev (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 doda nadaljnji register za nadzor konfiguracije na naslovu 0xF2, "ctrl_hum" z enim samim 3-bitnim parametrom osrs_h (izmerite vlažnost 0, 1, 2, 4, 8 ali 16-krat).

4. korak: Merjenje in čas odčitavanja

To nameravam dodati pozneje in prikazati čas ukazov in odzive na meritve.

Iddt - tok pri merjenju temperature. Tipična vrednost 325 uA

Iddp - tok pri merjenju tlaka. Tipična vrednost 720 uA, največ 1120 uA

Iddsb - trenutno v stanju pripravljenosti. Tipična vrednost 0,2 uA, največ 0,5 uA

Iddsl - trenutno v načinu mirovanja. Tipična vrednost 0,1 uA, največ 0,3 uA

5. korak: Smernice za programsko opremo

Smernice za programsko opremo
Smernice za programsko opremo
Smernice za programsko opremo
Smernice za programsko opremo

Način Burst I2C

Podatkovni list BMP280 vsebuje navodila za odčitavanje podatkov (poglavje 3.9). Piše: "močno priporočamo uporabo burst branja in ne naslavljamo vsakega registra posebej. To bo preprečilo morebitno mešanje bajtov, ki pripadajo različnim meritvam, in zmanjšalo vmesniški promet." V zvezi z odčitavanjem kompenzacijskih/kalibracijskih parametrov ni nobenih navodil. Verjetno to ni problem, ker so statični in se ne spreminjajo.

Ta knjižnica bere vse sosednje vrednosti v enem samem branju - 24 bajtov v primeru parametrov kompenzacije temperature in tlaka, 6 bajtov za temperaturo in tlak skupaj ter 8 bajtov za vlažnost, temperaturo in tlak skupaj. Ko se preveri samo temperatura, se preberejo le 3 bajti.

Uporaba makrov (#define itd.)

V tej knjižnici ni nobenega makra, razen običajnega knjižničnega makra "include guard", ki preprečuje podvajanje.

Vse konstante so definirane s ključno besedo const, odpravljanje napak pa je nadzorovano s standardnimi funkcijami C.

To je bil zame vir neke negotovosti, vendar nasvet, ki ga dobim ob branju številnih objav na to temo, je, da je uporaba #define za deklariranje konstant (vsaj) in (verjetno) odpravljanje napak pri tiskanju nepotrebna in nezaželena.

Primer uporabe const namesto #define je precej jasen - const uporablja iste vire kot #define (tj. Nič), posledične vrednosti pa sledijo pravilom določanja obsega, s čimer se zmanjša možnost napak.

Primer kontrole tiskanja za odpravljanje napak je nekoliko manj jasen, saj način, kako sem to naredil, pomeni, da končna koda vsebuje logiko za izjave o tiskanju za odpravljanje napak, čeprav se nikoli ne izvajajo. Če bo knjižnica uporabljena v velikem projektu na mikrokrmilniku z zelo omejenim pomnilnikom, lahko to postane problem. Ker je bil moj razvoj na ESP8266 z velikim bliskovnim pomnilnikom, se mi to ni zdelo problem.

6. korak: Temperaturna zmogljivost

To nameravam dodati kasneje.

7. korak: Učinkovitost tlaka

To nameravam dodati kasneje.

Priporočena: