Sisukord:

Raamatukogu BMP280 ja BME280 jaoks: 7 sammu
Raamatukogu BMP280 ja BME280 jaoks: 7 sammu

Video: Raamatukogu BMP280 ja BME280 jaoks: 7 sammu

Video: Raamatukogu BMP280 ja BME280 jaoks: 7 sammu
Video: BME280 Sensor Test with Arduino: pressure, humidity and temperature for the New Chronograph Project 2024, Juuli
Anonim
Raamatukogu BMP280 ja BME280 jaoks
Raamatukogu BMP280 ja BME280 jaoks
Raamatukogu BMP280 ja BME280 jaoks
Raamatukogu BMP280 ja BME280 jaoks
Raamatukogu BMP280 ja BME280 jaoks
Raamatukogu BMP280 ja BME280 jaoks

Sissejuhatus

Ma ei tahtnud seda raamatukogu kirjutada. See "juhtus" minu algatatud projekti kõrvalmõjuna, mis kasutab BMP280. See projekt pole veel lõppenud, kuid ma arvan, et raamatukogu on valmis teistega jagama. Hiljem tekkis mul vajadus kasutada BME280, mis lisab niiskuse mõõtmist BMP280 rõhule ja temperatuurile. BME280 on BMP280 -ga "tagurpidi ühilduv" - see tähendab, et kõik registrid ja sammud, mida on vaja BME280 -st rõhu ja temperatuuri lugemiseks, on samad, mida BMP280 puhul. Niiskuse lugemiseks on vaja täiendavaid registreid ja samme, mis kehtivad ainult BME280 puhul. See tekitab küsimuse, kas üks raamatukogu mõlema jaoks või kaks eraldi raamatukogu. Kahe seadme tüübi riistvara on täielikult vahetatav. Isegi paljud müüdavad moodulid (näiteks Ebays ja AliExpressis) on märgistatud BME/P280. Selleks, et teada saada, mis tüüpi see on, peate vaatama anduril olevat (väikest) kirja või testima seadme ID baiti. Otsustasin minna ühte raamatukokku. Tundub, et see läks korda.

Tagasiside, eriti kõik parandusettepanekud, on teretulnud.

Raamatukogu funktsioonid ja võimalused

Raamatukogu on tarkvaratükk, mis pakub programmeerijale rakenduse programmeerimisliidest (API), et ta saaks kasutada seadme võimalusi, ilma et peaks tingimata tegelema kõigi peeneteraliste detailidega. Soovitavalt peaks algaja olema lihtne algajatele, kellel on lihtsad nõuded, alustades samal ajal seadme võimaluste täielikust ärakasutamisest. Soovitavalt peaks raamatukogu järgima seadme tootja konkreetseid juhiseid ja üldist tarkvara head tava. Olen püüdnud seda kõike saavutada. BMP280 -ga alustades leidsin selle jaoks 3 erinevat raamatukogu: Adafruit_BMP280; Seeed_BMP280; ja üks nimega BMP280 seadme tootjalt. Adafruit ega Seeed ei pakkunud laiendatud võimalusi, kuigi need töötasid hästi ja neid oli lihtne kasutada põhirakenduste jaoks. Ma ei saanud aru, kuidas kasutada seadme tootja (Bosch Sensortec) toodet. See võib olla minu, mitte nende puudus. Kuid raamatukogu oli palju keerulisem kui ülejäänud kaks, ei leidnud ma ühtegi kasutusjuhendit ega näiteid (hiljem leidsin näiteid failist "bmp280_support.c", kuid need ei olnud mulle eriti kasulikud).

Nende tegurite tõttu otsustasin kirjutada oma raamatukogu BMP280 jaoks.

Uurides BME280 raamatukogusituatsiooni, leidsin eraldi raamatukogud Adafruit_BME280, Seed_BME280 ja veel ühe BME280_MOD-1022, mille on kirjutanud Embedded Adventures. Ükski neist ei ühendanud BMP280 funktsioone raamatukogus, mis suudab BME280 kasutada. Ükski neist ei toetanud selgesõnaliselt seadmete võimet salvestada paar bitti andmeid sel ajal, kui seade ja seda juhtiv mikroprotsessor magavad (see võimalus ilmneb andmelehel ja seda toetab minu siin kirjutatud ja kirjeldatud teek).

Kombineeritud raamatukogu peaks toetama kõiki BME280 võimalusi, kuid kui seda kasutatakse koos BMP280 -ga, ei tohiks see kasutamata funktsioonidest mingeid lisakulusid tekitada. Kombineeritud raamatukogu eelised hõlmavad vähem hallatavaid teegifaile, sama projekti erinevate seadmete hõlpsat kombineerimist ja lihtsustatud muudatusi hoolduses või uuendamises, mida tuleb teha ainult ühes kohas, mitte kahes. Need on ilmselt üsna väikesed, isegi ebaolulised, kuid…

Seadme võimalused

BMP280 ja BME280 on pinnale paigaldatavad seadmed, mille ruut on umbes 5 mm ja kõrgus 1 mm. Seal on 8 liidesepatja, sealhulgas 2 eraldi toiteplokki ja kaks maanduspadja. Need on saadaval eBays moodulina, kus on välja toodud kas 4 või 6 kontakti. 4-pin-moodulil on kindel I2C-aadress ja seda ei saa konfigureerida kasutama SPI-protokolli.

6-kontaktilist moodulit või paljast seadet saab kasutada kas I2C või SPI protokollidega. I2C -režiimis võib sellel olla kaks erinevat aadressi, mis saavutatakse SDO -tihvti ühendamisega kas maandusega (baasaadress = 0x76) või Vdd -ga (baasaadress +1 = 0x77). SPI -režiimis on sellel tavaline paigutus: 1 kell, 2 andmeid (üks iga suuna jaoks) ja seadme valimise tihvt (CS).

Raamatukogu, mille siin kirjutasin ja kirjeldasin, toetab ainult I2C -d. Teegid Adafruit_BMP280 ja BME_MOD-1022 toetavad nii i2C kui ka SPI.

Raamatukogu saab alla laadida siit:

github.com/farmerkeith/BMP280-library

Samm: riistvara seadistamine

Riistvara seadistamine
Riistvara seadistamine

Enne kui raamatukogu saab kasulikuks muuta, tuleb BMP280 -ga (või soovi korral kahega) ühendada mikrokontroller.

Kasutasin WeMos D1 mini pro, seega näitan selle seoseid. Teised mikrokontrollerid on sarnased, peate lihtsalt SDA- ja SCL -kontaktid õigesti ühendama.

WeMos D1 mini pro puhul on ühendused järgmised:

Funktsioon WeMos pin BMP280 pin Märkused

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND Address control SDO Ground või Vdd I2C select CSB Vdd (GND valib SPI)

Pange tähele, et mõne MP280 mooduli SDO -tihvt on märgistatud kui SDD ja Vdd -tihvt võib olla märgistatud kui VCC. Märkus: SDA- ja SCL-liinidel peavad olema liini ja Viini tihvti vahel tõmbetakistid. Tavaliselt peaks väärtus 4,7K olema korras. Mõnel BMP280 ja BME280 moodulil on moodulisse kaasatud 10K tõmbetakistid (mis ei ole hea tava, kuna mitme seadme I2C siinile asetamine võib seda liigselt koormata). Kuid kahe BME/P280 mooduli kasutamine, millest igaühel on 10K takisti, ei tohiks praktikas olla probleem, kui sama bussiga ei ole liiga palju seadmeid, millel on ka tõmbetakistid.

Kui olete riistvara ühendanud, saate hõlpsalt kontrollida, kas teie seade on BMP280 või BME280, käivitades visandi I2CScan_ID, mille leiate siit:

Seadet ennast vaadates saate kontrollida ka seda, kas teil on BMP280 või BME280. Ma leidsin, et selleks on vaja kasutada digitaalset mikroskoopi, kuid kui teie nägemine on väga hea, saate seda ilma abivahenditeta teha. Seadme korpusele on trükitud kaks rida. Võti on teise rea esimene täht, mis BMP280 seadmete puhul on "K" ja BME280 seadmete puhul "U".

2. samm: raamatukogu pakutavad API -d

Raamatukogu pakutavad API -d
Raamatukogu pakutavad API -d
Raamatukogu pakutavad API -d
Raamatukogu pakutavad API -d

Raamatukogu kaasamine eskiisi

Raamatukogu lisatakse visandile standardsel viisil, kasutades lauset

#include "farmerkeith_BMP280.h"

See avaldus tuleb lisada eskiisi algusesse enne funktsiooni setup () käivitamist.

BME või BMP tarkvaraobjekti loomine

Tarkvaraobjekti BMP280 loomiseks on 3 taset. Lihtsaim on lihtsalt

bme280 objectName; või bmp280 objectName;

näiteks BMP280 bmp0;

See loob tarkvaraobjekti vaikimisi aadressiga 0x76 (st maaga ühendatud SDO jaoks).

BME280 või BMP280 tarkvaraobjekti loomise järgmise taseme parameeter on 0 või 1 järgmiselt.

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parameeter (0 või 1) lisatakse I2C baasaadressile, nii et samal I2C siinil saab kasutada kahte BME280 või BMP280 seadet (kaasa arvatud üks neist).

BME või BMP280 tarkvaraobjekti loomise kolmandal tasemel on kaks parameetrit. Esimene parameeter, mis on kas 0 või 1, on aadressi jaoks, nagu ka eelmisel juhul. Teine parameeter juhib silumise printimist. Kui see on seatud väärtusele 1, annab iga tarkvaraobjektiga tehtud tehing Serial.print väljundi, mis võimaldab programmeerijal näha tehingu üksikasju. Näiteks:

bmp280 objectNameB (1, 1);

Kui silumisprintimise parameeter on seatud väärtusele 0, naaseb tarkvaraobjekt tavapärasele käitumisele (printimine puudub).

See avaldus või avaldused tuleb lisada pärast funktsiooni #include ja enne setup ().

BME või BMP tarkvaraobjekti initsialiseerimine

Enne kasutamist on vaja seadmest välja lugeda kalibreerimisparameetrid ja seadistada see mis tahes mõõtmisrežiimi, üleproovide võtmise ja filtri seadete jaoks.

Lihtsa üldotstarbelise initsialiseerimise jaoks on avaldus järgmine:

objectName.begin ();

See algus () versioon loeb seadmest kalibreerimisparameetrid ja määrab osrs_t = 7 (16 temperatuuri mõõtmist), osrs_p = 7 (16 rõhumõõtmist), mode = 3 (pidev, normaalne), t_sb = 0 (uneaeg 0,5 ms mõõtekomplektid), filter = 0 (K = 1, seega filtreerimine puudub) ja spiw_en = 0 (SPI keelatud, seega kasutage I2C). BME280 puhul on 16 niiskuse mõõtmise jaoks lisparameeter osrs_h = 7.

On veel üks start () versioon, mis võtab kõik kuus (või 7) parameetrit. Ülaltoodud väite ekvivalent on

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

või objektiNimi.algus (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en, osrs_h

Koodide ja nende tähenduste täielik loetelu on BME280 ja BMP280 andmelehel ning ka raamatukogu.cpp -faili kommentaarides.

Lihtne temperatuuri ja rõhu mõõtmine

Temperatuuri mõõtmiseks on kõige lihtsam viis

topelttemperatuur = objektiNimi.lugemistemperatuur (); // temperatuuri mõõtmine

Lihtsaim viis rõhu mõõtmiseks on

topeltrõhk = objektiNimi.lugemisrõhk (); // mõõta survet

Niiskuse mõõtmiseks on kõige lihtsam viis

topeltniiskus = objectName.readHumidity (); // niiskuse mõõtmine (ainult BME280)

Nii temperatuuri kui ka rõhu saamiseks saab kahte ülaltoodud lauset kasutada üksteise järel, kuid on veel üks võimalus:

kahekordne temperatuur;

kahekordne rõhk = objektiNimi.loeRõhk (temperatuur); // mõõta rõhku ja temperatuuri

See avaldus loeb BME280 või BMP280 seadme andmeid ainult üks kord ja tagastab nii temperatuuri kui ka rõhu. See on I2C siini veidi tõhusam kasutamine ja tagab, et kaks näitu vastavad samale mõõtmistsüklile.

BME 280 puhul on kombineeritud avaldus, mis saab kõik kolm väärtust (niiskus, temperatuur ja rõhk):

kahekordne temperatuur, rõhk; kahekordne niiskus = objectName.readHumidity (temperatuur, rõhk); // mõõta niiskust, rõhku ja temperatuuri

See avaldus loeb BMP280 seadme andmeid ainult üks kord ja tagastab kõik kolm väärtust. See on I2C siini veidi tõhusam kasutamine ja tagab, et kolm näitu vastavad samale mõõtmistsüklile. Pange tähele, et muutujate nimesid saab muuta kasutajale meelepäraseks, kuid nende järjekord on fikseeritud - esikohal on temperatuur ja teisel kohal rõhk.

Neid kasutusjuhtumeid käsitletakse raamatukoguga kaasasolevates näidisvisandites, mis on basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino ja basicHumidityAndTemperatureAndPressure.ino.

Keerukam temperatuuri ja rõhu mõõtmine

Kuigi ülaltoodud avalduste seeria töötab probleemideta, on paar probleemi:

  1. seade töötab pidevalt ja seetõttu tarbib see energiat maksimaalsel tasemel. Kui energia tuleb patareist, tuleb seda vähendada.
  2. tarbitava võimsuse tõttu kogeb seade soojenemist ja seetõttu on mõõdetud temperatuur ümbritsevast temperatuurist kõrgem. Ma käsitlen seda üksikasjalikumalt hilisemas etapis.

Tulemuse, mis kulutab vähem energiat ja annab ümbritsevale temperatuurile lähema temperatuuri, on võimalik saada, kui alustada () parameetritega, mis panevad selle magama (nt režiim = 0). Näiteks:

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

Seejärel, kui mõõtmist soovitakse, äratage seade konfiguratsioonikäsklusega registrisse F2 (vajadusel) ja F4, mis määrab osrs_h, osrs_t ja osrs_p vastavad väärtused, pluss mode = 1 (ühe võtte režiim). Näiteks:

[objectName.updateF2Control (1);] // osrs_h - pole kunagi BMP280 jaoks vajalik, // ja pole BME280 jaoks vajalik, kui mõõtmiste arvu ei muudeta // väärtusest, mis on antud alguses (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Pärast seadme äratamist hakkab see mõõtma, kuid tulemus ei ole mõne millisekundi jooksul saadaval - vähemalt 4 ms, võib -olla kuni 70 ms või rohkem, sõltuvalt määratud mõõtmiste arvust. Kui lugemiskäsk saadetakse kohe, tagastab seade eelmise mõõtmise väärtused - mis võib mõnes rakenduses olla vastuvõetav, kuid enamikul juhtudel on ilmselt parem viivitada, kuni uus mõõtmine on saadaval.

Seda viivitust saab teha mitmel viisil.

  1. oodake fikseeritud aega, et katta pikim eeldatav viivitus
  2. oodake aega, mis arvutatakse maksimaalse mõõtmisaja kohta ühe mõõtmise kohta (st 2,3 ms) korrutades mõõtmiste arvu, millele lisanduvad üldkulud, millele lisandub varu.
  3. oodake lühemat aega, mis on arvutatud ülalkirjeldatud viisil, kuid kasutades nominaalset mõõtmisaega (st 2 ms) pluss üldkulud, ja seejärel alustage olekuregistri biti "ma mõõdan" kontrollimist. Kui olekuribi väärtus on 0 (st ei mõõda), lugege temperatuuri ja rõhku.
  4. hakake kohe staatuseregistrit kontrollima ja saate temperatuuri ja rõhu näidud, kui olekuribal on 0,

Toon näite ühest viisist seda teha veidi hiljem.

Konfiguratsiooniregistri toimingud

Selle kõige teostamiseks vajame mitmeid tööriistu, mida ma pole veel tutvustanud. Nemad on:

bait lugedaRegistreeri (reg)

void updateRegister (reg, väärtus)

Kõigil neist on raamatukogus mitu tuletatud käsku, mis muudavad tarkvara teatud toimingute jaoks pisut lihtsamaks.

Näites powerSaverPressureAndTemperature.ino kasutatakse meetodit nr 3. Korduvkontrolliv koodirida on

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

Pange tähele, et see visand on mõeldud ESP8266 mikrokontrollerile. Kasutasin WeMos D1 mini pro. Visand ei tööta Atmega mikrokontrolleritega, millel on magamiseks erinevad juhised. See visand täidab mitmeid muid käske, seega tutvustan neid kõiki enne selle visandi üksikasjalikumat kirjeldamist.

Kui mikrokontroller magab paralleelselt anduriga BMP280, saab anduri konfigureerida vajalike mõõtmiste jaoks käsuga start (), kasutades 6 parameetrit. Kui aga mikrokontroller ei maga, kuid andur on, tuleb mõõtmise ajal andur üles äratada ja öelda selle mõõtmise konfiguratsioon. Seda saab teha otse

updateRegister (reg, väärtus)

kuid see on mõnevõrra lihtsam järgmiste kolme käsuga:

updateF2Control (osrs_h); // ainult BME280

updateF4Control (osrs_t, osrs_p, režiim); updateF5Config (t_sb, filter, spi3W_en);

Kui pärast mõõtmist on kasutatud üksikvõtet (sundrežiim), lülitub seade automaatselt unerežiimi. Kui aga mõõtmiskomplekt hõlmab mitut mõõtmist pideva (normaalse) režiimi abil, tuleb BMP280 uuesti magama panna. Seda saab teha ühega järgmistest käskudest:

updateF4Control16xSleep ();

updateF4ControlSleep (väärtus);

Mõlemad seadistavad režiimi bitid 00 (st unerežiim). Kuid esimene määrab osrs_t ja osrs_p väärtuseks 111 (st 16 mõõtmist), teine aga salvestab 0 -F4 registri madalad 6 bitti väärtusest bittidesse 7: 2.

Samamoodi salvestab järgmine avaldus 0xF5 registri bitti 7: 2 madalad kuus "väärtuse" bitti.

updateF5ConfigSleep (väärtus);

Nende viimaste käskude kasutamine võimaldab salvestada 12 bitti teavet BMP280 registritesse F4 ja F5. Vähemalt ESP8266 puhul, kui mikrokontroller ärkab pärast uneaega, algab see visandi algusest, teadmata selle olekust enne unekäsu. Teadmiste salvestamiseks selle olekust enne unerežiimi käsku saab andmeid salvestada välkmällu, kasutades kas EEPROM -funktsioone või kirjutades faili SPIFFS -i abil. Kuid välkmälu piirab kirjutamistsüklite arvu, suurusjärgus 10 000 kuni 100 000. See tähendab, et kui mikrokontroller läbib iga paari sekundi järel unerežiimi, võib see ületada lubatud mälu kirjutamise arvu. piirata mõne kuuga. Mõne andmebiti salvestamisel BMP280 -s pole selliseid piiranguid.

Registritesse F4 ja F5 salvestatud andmeid saab käskude abil mikrokontrolleri ärgates taastada

readF4Sleep ();

readF5Sleep ();

Need funktsioonid loevad vastavat registrit, nihutavad sisu 2 LSB eemaldamiseks ja tagastavad ülejäänud 6 bitti. Neid funktsioone kasutatakse näites sketch powerSaverPressureAndTemperatureESP.ino järgmiselt:

// loe EventCounter väärtust tagasi bmp0 -st

bait bmp0F4value = bmp0.readF4Sleep (); // 0 kuni 63 baiti bmp0F5value = bmp0.readF5Sleep (); // 0 kuni 63 eventCounter = bmp0F5value*64+bmp0F4value; 0 kuni 4095

Need funktsioonid loevad vastavat registrit, nihutavad sisu 2 LSB eemaldamiseks ja tagastavad ülejäänud 6 bitti. Neid funktsioone kasutatakse näites sketch powerSaverPressureAndTemperature.ino järgmiselt:

// loe EventCounter väärtust tagasi bmp1 -st

bait bmp1F4value = bmp1.readF4Sleep (); // 0 kuni 63 baiti bmp1F5value = bmp1.readF5Sleep (); // 0 kuni 63 eventCounter = bmp1F5value*64+bmp1F4value; 0 kuni 4095

Toore temperatuuri ja rõhu funktsioonid

Põhilised funktsioonid readTemperatuur, lugemisrõhk ja lugemisniiskus sisaldavad kahte komponenti. Esmalt saadakse BME/P280 toore 20-bitise temperatuuri ja rõhu väärtused või toore 16-bitise niiskuse väärtus BME280-st. Seejärel kasutatakse kompenseerimisalgoritmi väljundväärtuste genereerimiseks Celsiuse kraadides, hPa või %RH.

Raamatukogu pakub nende komponentide jaoks eraldi funktsioone, nii et on võimalik saada tooreid temperatuuri, rõhu ja niiskuse andmeid ning neid võib -olla ka mingil viisil manipuleerida. Samuti on esitatud algoritm temperatuuri, rõhu ja niiskuse tuletamiseks nendest toorväärtustest. Raamatukogus rakendatakse neid algoritme topeltpikkusega ujukomaaritmeetika abil. See töötab hästi ESP8266-l, mis on 32-bitine protsessor ja kasutab kahekordsete ujukmuutujate jaoks 64 bitti. Nende funktsioonide kättesaadavaks tegemine võib olla kasulik teiste platvormide arvutuste hindamiseks ja võimalikuks muutmiseks.

Need funktsioonid on järgmised:

readRawPressure (toorestemperatuur); // loeb toorõhu ja temperatuuri andmeid BME/P280readRawHumidity (rawTemperature, rawPressure); // loeb toorniiskuse, temperatuuri ja rõhu andmeid BME280 calcTemperature (rawTemperature, t_fine); calcPressure (tooresurve, t_peen); calcHumidity (rawHumidity, t_fine)

Nende funktsioonide "t-fine" argument väärib natuke selgitust. Mõlemad rõhu ja niiskuse kompenseerimise algoritmid sisaldavad temperatuurist sõltuvat komponenti, mis saavutatakse muutuja t_fine kaudu. Funktsioon calcTemperature kirjutab temperatuuri kompenseerimise algoritmi loogika põhjal väärtuse t_fine, mida kasutatakse seejärel sisendina nii calcPressure kui ka calcHumidity.

Nende funktsioonide kasutamise näite leiate näitest sketch rawPressureAndTemperature.ino ja ka teegi.cpp -faili funktsiooni readHumidity () koodist.

Kõrgus ja merepinna rõhk

Atmosfäärirõhu ja kõrguse vahel on teadaolev seos. Ilm mõjutab ka survet. Kui ilmastikuorganisatsioonid avaldavad teavet atmosfäärirõhu kohta, kohandavad nad seda tavaliselt kõrguse järgi ja seega näitab "sünoptiline diagramm" isobaare (püsirõhu jooned), mis on standardiseeritud keskmise merepinna järgi. Nii et tõesti on selles suhtes 3 väärtust ja kahe neist teadmine võimaldab tuletada kolmanda. 3 väärtust on järgmised:

  • kõrgus merepinnast
  • tegelik õhurõhk sellel kõrgusel
  • ekvivalentne õhurõhk merepinnal (täpsemalt keskmine merepind, sest hetkeline merepind muutub pidevalt)

See teek pakub selle suhte jaoks kahte funktsiooni.

calcAltitude (rõhk, meretasePa);

calcNormalisedRõhk (rõhk, kõrgus);

Samuti on olemas lihtsustatud versioon, mis eeldab standardset merepinna rõhku 1013,15 hPa.

calcAltitude (rõhk); // eeldatakse standardset meretaseme rõhku

Samm: BMP280 seadme üksikasjad

BMP280 seadme üksikasjad
BMP280 seadme üksikasjad

Riistvara võimalused

BMP280 -l on 2 baiti konfiguratsiooniandmeid (registriaadressidel 0xF4 ja 0xF5), mida kasutatakse mitmete mõõtmis- ja andmete väljastamise valikute juhtimiseks. Samuti pakub see 2 bitti olekuteavet ja 24 baiti kalibreerimisparameetreid, mida kasutatakse töötlemata temperatuuri ja rõhu väärtuste teisendamiseks tavapärasteks temperatuuri- ja rõhuühikuteks. BME280 sisaldab järgmisi täiendavaid andmeid:

  • 1 täiendav bait konfiguratsiooniandmeid registriaadressil 0xF2, mida kasutatakse mitmete niiskuse mõõtmiste juhtimiseks;
  • 8 täiendavat baiti kalibreerimisparameetreid, mida kasutatakse toorniiskuse väärtuse teisendamiseks suhtelise niiskuse protsendiks.

BME280 temperatuuri, rõhu ja oleku registrid on samad, mis BMP280 puhul, välja arvatud järgmised erandid:

  • BME280 "ID" bitid on seatud väärtusele 0x60, nii et neid saab eristada BMP280 -st, mis võivad olla 0x56, 0x57 või 0x58
  • uneaja juhtnuppu (t_sb) muudetakse nii, et BMP280 kaks pikka aega (2000 ms ja 4000 ms) asendatakse BME280 lühikeste aegadega 10 ms ja 20 ms. BME280 maksimaalne uneaeg on 1000 ms.
  • BME280 -s on temperatuuri ja rõhu toorväärtused filtreerimise korral alati 20 bitti. 16–19 -bitiste väärtuste kasutamine piirdub filtreerimata juhtumitega (st filter = 0).

Temperatuur ja rõhk on mõlemad 20 -bitised väärtused, mis tuleb teisendada tavaliseks temperatuuriks ja rõhuks üsna keeruka algoritmi abil, kasutades temperatuuri 3 16 -bitist kalibreerimisparameetrit ja 9 16 -bitist kalibreerimisparameetrit pluss rõhu temperatuur. Temperatuuri mõõtmise granuleeritavus on 0,0003 kraadi Celsiuse järgi, kui biti muutub kõige vähem (20 -bitine näit), 16 -bitise näidu kasutamisel suureneb see 0,0046 kraadini.

Niiskus on 16 -bitine väärtus, mis tuleb teisese keeruka algoritmi abil teisendada suhteliseks õhuniiskuseks, kasutades 6 kalibreerimisparameetrit, mis koosnevad 8, 12 ja 16 bitist.

Andmeleht näitab temperatuurinäidu absoluutset täpsust +-0,5 ° C juures 25 ° C ja +-1 ° C vahemikus 0 kuni 65 ° C.

Rõhu mõõtmise täpsus on 0,15 paskalit (st 0,0015 hekopaskalit) 20 -bitise eraldusvõimega või 2,5 paskalit 16 -bitise eraldusvõimega. Toorõhu väärtust mõjutab temperatuur, nii et umbes 25 ° C juures vähendab temperatuuri tõus 1 kraadi võrra mõõdetud rõhku 24 paskali võrra. Temperatuuritundlikkust arvestatakse kalibreerimisalgoritmiga, seega peaksid rõhu väärtused olema täpsed erinevatel temperatuuridel.

Andmeleht näitab rõhunäidu absoluutset täpsust +-1 hPa temperatuuridel vahemikus 0 ° C kuni 65 ° C.

Niiskuse täpsus on andmelehel esitatud +-3% suhtelise niiskuse ja +-1% hüstereesina.

Kuidas see töötab

Seadmest tuleb lugeda ja salvestada muutujatesse 24 baiti temperatuuri ja rõhu kalibreerimisandmeid ning ka BME280 puhul 8 baiti niiskuse kalibreerimisandmeid. Need andmed on tehases seadmesse individuaalselt programmeeritud, seega on erinevatel seadmetel erinevad väärtused - vähemalt mõne parameetri puhul. BME/P280 võib olla ühes kahest olekust. Ühes olekus see mõõdab. Teises olekus see ootab (magab).

Millises olekus see on, saab kontrollida, vaadates registri 0xF3 bitti 3.

Viimase mõõtmise tulemusi on võimalik igal ajal saada, lugedes vastavat andmeväärtust, olenemata sellest, kas seade magab või mõõdab.

BME/P280 käitamiseks on ka kaks võimalust. Üks neist on pidev režiim (andmelehel nimetatakse seda tavarežiimiks), mis vaheldub korduvalt mõõtmis- ja unerežiimide vahel. Selles režiimis teostab seade mõõtmiste komplekti, läheb siis magama, siis ärkab teise mõõtmistulemuse jaoks jne. Üksikute mõõtmiste arvu ja tsükli uneosa kestust saab kõik konfiguratsiooniregistrite kaudu juhtida.

Teine viis BME/P280 juhtimiseks on ühe võtte režiim (andmelehel nimetatakse sundrežiimi). Selles režiimis äratatakse seade unerežiimist käsu abil mõõta, see teeb mõõtmiste komplekti ja läheb seejärel uuesti magama. Komplekti üksikute mõõtmiste arvu kontrollitakse seadet käivitavas konfiguratsioonikäskluses.

Kui BMP280 -s tehakse üks mõõtmine, täidetakse väärtuse 16 kõige olulisemat bitti ja neli kõige vähem olulist bitti väärtuse lugemil on nullid. Mõõtmiste arvuks saab seada 1, 2, 4, 8 või 16 ning mõõtmiste arvu suurenemisega suureneb andmetega täidetud bittide arv, nii et 16 mõõtmise korral on kõik 20 bitti täidetud mõõtmisandmetega. Andmelehel viidatakse sellele protsessile kui üleproovimisele.

BME280 puhul kehtib sama paigutus seni, kuni tulemust ei filtreerita. Kui kasutatakse filtreerimist, on väärtused alati 20 bitti, olenemata sellest, kui palju mõõtmisi igas mõõtmistsüklis tehakse.

Iga üksik mõõtmine võtab aega umbes 2 millisekundit (tüüpiline väärtus; maksimaalne väärtus on 2,3 ms). Kui lisada sellele umbes 2 ms (tavaliselt natuke vähem) üldkulud, tähendab see, et mõõtmisjärjestus, mis võib koosneda 1 kuni 32 individuaalsest mõõtmisest, võib kesta 4 ms kuni 66 ms.

Andmeleht sisaldab komplekti soovitatavaid temperatuuri ja rõhu üleproovide kombinatsioone erinevate rakenduste jaoks.

Konfiguratsiooni juhtregistrid

BMP280 kaks konfiguratsiooni juhtregistrit asuvad registriaadressidel 0xF4 ja 0xF5 ning on kaardistatud kuuele individuaalsele konfiguratsiooni juhtväärtusele. 0xF4 koosneb:

  • 3 bitti osrs_t (mõõtke temperatuuri 0, 1, 2, 4, 8 või 16 korda);
  • 3 bitti osrs_p (mõõtke rõhku 0, 1, 2, 4, 8 või 16 korda); ja
  • 2 -bitine režiim (unerežiim, sunniviisiline (st ühe võtte), tavaline (st pidev)).

0xF5 koosneb:

  • 3 bitti t_sb (ooteaeg, 0,5 ms kuni 4000 ms);
  • 3 -bitine filter (vt allpool); ja
  • 1 bit spiw_en, mis valib SPI või I2C.

Filtri parameeter juhib eksponentsiaalse lagunemise algoritmi tüüpi või Infinite Impulse Response (IIR) filtrit, mida rakendatakse toorõhu ja temperatuuri mõõtmisväärtustele (kuid mitte niiskuse väärtustele). Võrrand on toodud andmelehel. Teine esitlus on:

Väärtus (n) = väärtus (n-1) * (K-1) / K + mõõtmine (n) / K

kus (n) näitab viimast mõõtmis- ja väljundväärtust; ja K on filtri parameeter. Filtri parameeter K ja selle saab seada väärtustele 1, 2, 4, 8 või 16. Kui väärtuseks K on seatud 1, muutub võrrand lihtsalt väärtuseks (n) = mõõtmine (n). Filtri parameetri kodeering on järgmine:

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

BME 280 lisab täiendava konfiguratsiooni juhtregistri aadressile 0xF2, "ctrl_hum", millel on üks 3-bitine parameeter osrs_h (mõõdab niiskust 0, 1, 2, 4, 8 või 16 korda).

4. samm: mõõtmine ja lugemise ajastamine

Kavatsen selle hiljem lisada, näidates käskude ja mõõtmisreaktsioonide ajastust.

Iddt - vool temperatuuri mõõtmisel. Tüüpiline väärtus 325 uA

Iddp - vool rõhu mõõtmisel. Tüüpiline väärtus 720 uA, max 1120 uA

Iddsb - praegune ooterežiimis. Tüüpiline väärtus 0,2 uA, max 0,5 uA

Iddsl - praegune unerežiimis. Tüüpiline väärtus 0,1 uA, max 0,3 uA

Samm 5: Tarkvara juhised

Tarkvara juhised
Tarkvara juhised
Tarkvara juhised
Tarkvara juhised

I2C sarivõtte režiim

BMP280 andmeleht annab juhiseid andmete lugemise kohta (jaotis 3.9). See ütleb: "on tungivalt soovitatav kasutada sarivõtte lugemist ja mitte iga registrit eraldi käsitleda. See hoiab ära võimaliku erinevate mõõtmiste baitide segunemise ja vähendab liidese liiklust." Kompensatsiooni/kalibreerimise parameetrite lugemise kohta pole juhiseid antud. Arvatavasti ei ole need probleemid, sest need on staatilised ega muutu.

See raamatukogu loeb kõiki külgnevaid väärtusi ühe lugemisoperatsiooniga - 24 baiti temperatuuri ja rõhu kompenseerimise parameetrite puhul, 6 baiti temperatuuri ja rõhu kokku ning 8 baiti niiskuse, temperatuuri ja rõhu kohta kokku. Ainult temperatuuri kontrollimisel loetakse ainult 3 baiti.

Makrode kasutamine (#define jne)

Selles teegis pole muid makrosid peale tavalise raamatukogu "include guard" makro, mis takistab dubleerimist.

Kõik konstandid määratakse märksõnaga const ja silumisprintimist kontrollitakse standardsete C -funktsioonidega.

See on minu jaoks tekitanud teatud ebakindlust, kuid nõuanne, mida saan selleteemaliste postituste lugemisel, on see, et #define kasutamine konstantide deklareerimiseks (vähemalt) ja (tõenäoliselt) silumise printimise juhtimiseks on tarbetu ja ebasoovitav.

Const -i ja #define'i kasutamise juhtum on üsna selge - const kasutab samu ressursse nagu #define (st null) ja sellest tulenevad väärtused järgivad ulatuse reegleid, vähendades seeläbi vigade tõenäosust.

Silumisprintimise juhtum on natuke vähem selge, sest see, kuidas ma seda olen teinud, tähendab, et lõplik kood sisaldab silumisprintimise avalduste loogikat, kuigi neid ei kasutata kunagi. Kui raamatukogu kasutatakse suures projektis väga piiratud mäluga mikrokontrolleri abil, võib see muutuda probleemiks. Kuna minu arendus toimus suure välkmäluga ESP8266 -l, ei tundunud see minu jaoks probleem.

6. samm: temperatuuri toimivus

Kavatsen selle hiljem lisada.

Samm 7: Rõhu jõudlus

Kavatsen selle hiljem lisada.

Soovitan: