Turinys:

Biblioteka BMP280 ir BME280: 7 žingsniai
Biblioteka BMP280 ir BME280: 7 žingsniai

Video: Biblioteka BMP280 ir BME280: 7 žingsniai

Video: Biblioteka BMP280 ir BME280: 7 žingsniai
Video: BME280, Датчик атмосферного давления с гигрометром 2024, Liepa
Anonim
Biblioteka BMP280 ir BME280
Biblioteka BMP280 ir BME280
Biblioteka BMP280 ir BME280
Biblioteka BMP280 ir BME280
Biblioteka BMP280 ir BME280
Biblioteka BMP280 ir BME280

Įvadas

Aš nesiruošiau rašyti šios bibliotekos. Tai „atsitiko“kaip šalutinis mano pradėto projekto, kuriame naudojamas BMP280, poveikis. Tas projektas dar nebaigtas, bet manau, kad biblioteka yra pasirengusi dalytis su kitais. Vėliau man reikėjo naudoti BME280, kuris prideda drėgmės matavimą prie BMP280 slėgio ir temperatūros. BME280 yra „suderinamas atgal“su BMP280 - tai yra, visi registrai ir veiksmai, kurių reikia norint nuskaityti slėgį ir temperatūrą iš BME280, yra tokie patys, kaip ir BMP280. Yra papildomų registrų ir veiksmų, reikalingų drėgmei nuskaityti, taikomi tik BME280. Tai kelia klausimą - viena biblioteka abiem arba dvi atskiros bibliotekos. Abiejų tipų įrenginių aparatinė įranga yra visiškai keičiama. Netgi daugelis parduodamų modulių (pavyzdžiui, „Ebay“ir „AliExpress“) yra pažymėti BME/P280. Norėdami sužinoti, kokio tipo jis yra, turite pažvelgti į (smulkų) užrašą ant paties jutiklio arba išbandyti įrenginio ID baitą. Aš nusprendžiau ieškoti vienos bibliotekos. Atrodo, kad viskas pavyko gerai.

Atsiliepimai, ypač bet kokie pasiūlymai dėl patobulinimų, bus vertinami.

Bibliotekos ypatybės ir galimybės

Biblioteka yra programinė įranga, kuri suteikia programuotojo sąsają (API), kad programuotojas galėtų naudotis įrenginio galimybėmis, nebūtinai susidorodamas su smulkiagrūdėmis detalėmis. Pageidautina, kad pradedantiesiems, turintiems paprastus reikalavimus, API būtų lengva pradėti, tuo pačiu užtikrinant visišką įrenginio galimybių naudojimą. Pageidautina, kad biblioteka turėtų vadovautis bet kokiomis konkrečiomis prietaiso gamintojo gairėmis ir bendrąja programinės įrangos praktika. Aš stengiausi visa tai pasiekti. Pradėdamas nuo BMP280, radau jam 3 skirtingas bibliotekas: Adafruit_BMP280; Seeed_BMP280; ir vienas iš prietaiso gamintojo pavadintas BMP280. Nei „Adafruit“, nei „Seeed“nesuteikė išplėstinių galimybių, nors jie gerai veikė ir buvo lengvai naudojami pagrindinėms programoms. Negalėjau suprasti, kaip naudoti prietaiso gamintojo („Bosch Sensortec“) pagamintą. Tai gali būti mano, o ne jų trūkumas. Tačiau biblioteka buvo daug sudėtingesnė nei kitos dvi, neradau jokių instrukcijų ar naudojimo pavyzdžių (vėliau radau pavyzdžių, esančių faile „bmp280_support.c“, tačiau man tai nebuvo ypač naudinga).

Dėl šių veiksnių nusprendžiau parašyti savo biblioteką BMP280.

Žvelgdamas į BME280 bibliotekos situaciją, radau atskiras Adafruit_BME280, Seed_BME280 bibliotekas ir dar vieną BME280_MOD-1022, parašytą „Embedded Adventures“. Nė vienas iš jų neapjungė BMP280 funkcijų bibliotekoje, galinčioje naudoti BME280. Nė vienas iš jų aiškiai nepalaikė įrenginių galimybės išsaugoti keletą duomenų bitų, kol įrenginys ir jį valdantis mikroprocesorius miega (ši galimybė akivaizdi duomenų lape ir palaikoma bibliotekoje, kurią čia parašiau ir aprašiau).

Kombinuota biblioteka turėtų palaikyti visas BME280 galimybes, tačiau, kai naudojama su BMP280, ji neturėtų apkrauti nenaudojamų funkcijų. Kombinuotos bibliotekos pranašumai apima mažiau bibliotekos failų, kuriuos galima valdyti, paprastą skirtingų įrenginių derinimą tame pačiame projekte ir supaprastintus priežiūros ar atnaujinimo pakeitimus, kuriuos reikia atlikti tik vienoje vietoje, o ne dviejose. Visa tai tikriausiai yra gana menka, net nereikšminga, bet…

Įrenginio galimybės

BMP280 ir BME280 yra ant paviršiaus montuojami įtaisai, kurių kvadratas yra apie 5 mm ir 1 mm aukščio. Yra 8 sąsajos pagalvėlės, įskaitant 2 atskirus maitinimo blokus ir du įžeminimo blokus. Juos galima rasti „eBay“kaip modulį su 4 arba 6 kaiščiais. 4 kontaktų modulis turi fiksuotą I2C adresą ir negali būti sukonfigūruotas naudoti SPI protokolą.

6 kontaktų modulį arba pliką įrenginį galima naudoti su I2C arba SPI protokolais. „I2C“režimu jis gali turėti du skirtingus adresus, pasiektus prijungus SDO kaištį prie „Ground“(bazinis adresas = 0x76) arba „Vdd“(bazinis adresas +1 = 0x77). SPI režimu jis turi įprastą 1 laikrodžio, 2 duomenų (po vieną kiekvienai krypčiai) ir įrenginio pasirinkimo kaiščio (CS) išdėstymą.

Mano parašyta ir aprašyta biblioteka palaiko tik I2C. Bibliotekos „Adafruit_BMP280“ir „BME_MOD-1022“palaiko ir „i2C“, ir „SPI“.

Biblioteką galima atsisiųsti čia:

github.com/farmerkeith/BMP280-library

1 veiksmas: nustatykite aparatūrą

Aparatūros nustatymas
Aparatūros nustatymas

Kad biblioteka būtų naudinga, būtina prijungti mikrovaldiklį prie BMP280 (arba prie dviejų iš jų, jei norite).

Aš naudojau „WeMos D1 mini pro“, todėl parodysiu jo ryšius. Kiti mikrovaldikliai bus panašūs, tik reikia teisingai prijungti SDA ir SCL kaiščius.

„WeMos D1 mini pro“atveju jungtys yra šios:

Funkcija „WeMos“kaištis BMP280 kaištis Pastabos

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominalus 3.3V Ground GND Adreso valdymas SDO Ground arba Vdd I2C select CSB Vdd (GND pasirenka SPI)

Atminkite, kad kai kurių MP280 modulių SDO kaištis yra pažymėtas kaip SDD, o Vdd kaištis gali būti pažymėtas kaip VCC. Pastaba: SDA ir SCL linijose tarp linijos ir „Vin“kaiščio turi būti traukiamieji rezistoriai. Paprastai 4,7K vertė turėtų būti tinkama. Kai kurie BMP280 ir BME280 moduliai turi 10K ištraukiamųjų varžų, įtrauktų į modulį (tai nėra gera praktika, nes įdėjus kelis įrenginius į I2C magistralę, gali būti per daug įkrauta). Tačiau naudojant 2 BME/P280 modulius, kurių kiekvienas turi 10K rezistorių, praktiškai neturėtų kilti problemų, kol toje pačioje magistralėje nėra per daug kitų įrenginių, taip pat ir su ištraukiamaisiais rezistoriais.

Prijungę aparatūrą, galite lengvai patikrinti, ar jūsų įrenginys yra BMP280, ar BME280, paleidę eskizą „I2CScan_ID“, kurį rasite čia:

Taip pat galite patikrinti, ar turite BMP280 ar BME280, pažiūrėję į patį įrenginį. Radau, kad tam reikia naudoti skaitmeninį mikroskopą, tačiau jei jūsų regėjimas yra labai geras, galbūt galėsite tai padaryti be jokių pagalbinių priemonių. Ant prietaiso korpuso yra dvi spausdinimo eilutės. Raktas yra pirmoji raidė antroje eilutėje, kuri BMP280 įrenginių atveju yra „K“, o BME280 įrenginių atveju - „U“.

2 veiksmas: bibliotekos pateiktos API

Bibliotekos pateiktos API
Bibliotekos pateiktos API
Bibliotekos pateiktos API
Bibliotekos pateiktos API

Bibliotekos įtraukimas į eskizą

Biblioteka yra įtraukta į eskizą standartiniu būdu, naudojant teiginį

#include "farmerkeith_BMP280.h"

Šis teiginys turi būti įtrauktas į pradinę eskizo dalį prieš pradedant sąrankos () funkciją.

BME arba BMP programinės įrangos objekto kūrimas

Programinės įrangos objektui BMP280 sukurti yra 3 lygiai. Paprasčiausias yra tiesiog

bme280 objectName; arba bmp280 objectName;

pavyzdžiui, BMP280 bmp0;

Taip sukuriamas programinės įrangos objektas, kurio numatytasis adresas yra 0x76 (ty SDO, prijungtas prie žemės).

Kitas BME280 arba BMP280 programinės įrangos objekto kūrimo lygis turi 0 arba 1 parametrą, kaip nurodyta toliau.

bme280 objectNameA (0);

bmp280 objektasVardasB (1);

Parametras (0 arba 1) pridedamas prie pagrindinio I2C adreso, kad toje pačioje I2C magistralėje (įskaitant po vieną) būtų galima naudoti du BME280 arba BMP280 įrenginius.

Trečiasis BME arba BMP280 programinės įrangos objekto kūrimo lygis turi du parametrus. Pirmasis parametras, kuris yra 0 arba 1, yra skirtas adresui, kaip ir ankstesniu atveju. Antrasis parametras valdo derinimo spausdinimą. Jei jis nustatytas į 1, kiekvienos operacijos su programinės įrangos objektu rezultatas yra Serial.print, o tai leidžia programuotojui matyti išsamią operacijos informaciją. Pavyzdžiui:

bmp280 objectNameB (1, 1);

Jei derinimo spausdinimo parametras nustatytas į 0, programinės įrangos objektas grįžta į įprastą elgseną (be spausdinimo).

Šį teiginį ar teiginius reikia įtraukti po funkcijos #include ir prieš setup ().

BME arba BMP programinės įrangos objekto inicijavimas

Prieš naudojimą būtina iš prietaiso perskaityti kalibravimo parametrus ir sukonfigūruoti jį bet kokiam matavimo režimui, per dideliam atrankai ir filtro nustatymams.

Paprastam bendros paskirties inicijavimui teiginys yra toks:

objectName.begin ();

Šioje versijoje begin () nuskaitomi kalibravimo parametrai iš įrenginio ir nustatomi osrs_t = 7 (16 temperatūros matavimų), osrs_p = 7 (16 slėgio matavimų), režimas = 3 (nuolatinis, normalus), t_sb = 0 (miegas tarp 0,5 ms matavimo rinkiniai), filtras = 0 (K = 1, taigi nėra filtravimo) ir spiw_en = 0 (SPI išjungtas, todėl naudokite I2C). BME280 atveju 16 drėgmės matavimų yra papildomas parametras osrs_h = 7.

Yra dar viena „start“() versija, kuri apima visus šešis (arba 7) parametrus. Aukščiau pateikto teiginio atitikmuo yra

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

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

Visas kodų ir jų reikšmių sąrašas yra BME280 ir BMP280 duomenų lape, taip pat bibliotekos.cpp failo komentaruose.

Paprastas temperatūros ir slėgio matavimas

Paprasčiausias būdas yra išmatuoti temperatūrą

dviguba temperatūra = objectName.readTemperature (); // matuoti temperatūrą

Paprasčiausias būdas yra išmatuoti slėgį

dvigubas slėgis = objectName.readPressure (); // matuoti slėgį

Paprasčiausias būdas išmatuoti drėgmę

dviguba drėgmė = objectName.readHumidity (); // matuoti drėgmę (tik BME280)

Norint gauti ir temperatūrą, ir slėgį, du aukščiau pateiktus teiginius galima naudoti vienas po kito, tačiau yra ir kita galimybė:

dviguba temperatūra;

dvigubas slėgis = objectName.readPressure (temperatūra); // matuoti slėgį ir temperatūrą

Šis teiginys BME280 arba BMP280 įrenginio duomenis nuskaito tik vieną kartą ir pateikia tiek temperatūrą, tiek slėgį. Tai yra šiek tiek efektyvesnis I2C magistralės naudojimas ir užtikrina, kad abu rodmenys atitinka tą patį matavimo ciklą.

BME 280 bendras teiginys, gaunantis visas tris vertes (drėgmė, temperatūra ir slėgis):

dviguba temperatūra, slėgis; dviguba drėgmė = objectName.readHumidity (temperatūra, slėgis); // matuoti drėgmę, slėgį ir temperatūrą

Šis teiginys nuskaito duomenis iš BMP280 įrenginio tik vieną kartą ir grąžina visas tris reikšmes. Tai yra šiek tiek efektyvesnis I2C magistralės naudojimas ir užtikrina, kad trys rodmenys atitinka tą patį matavimo ciklą. Atminkite, kad kintamųjų pavadinimai gali būti pakeisti į viską, kas patinka vartotojui, tačiau jų tvarka yra fiksuota - pirmiausia temperatūra, o antra - slėgis.

Šie naudojimo atvejai aprašyti pavyzdiniuose eskizuose, pateikiamuose kartu su biblioteka.

Sudėtingesnis temperatūros ir slėgio matavimas

Nors aukščiau pateikta teiginių serija veiks be problemų, yra keletas problemų:

  1. prietaisas veikia nuolat, todėl sunaudoja maksimalią galią. Jei energija gaunama iš akumuliatoriaus, gali tekti tai sumažinti.
  2. dėl suvartotos energijos prietaisas atšils, todėl išmatuota temperatūra bus aukštesnė už aplinkos temperatūrą. Apie tai plačiau kalbėsiu vėliau.

Rezultatą, kuris sunaudoja mažiau energijos ir suteikia temperatūrą, kuri yra arčiau aplinkos, galima gauti naudojant „start“() su parametrais, kurie jį užmigdo (pvz., Režimas = 0). Pavyzdžiui:

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

Tada, kai norima atlikti matavimą, pažadinkite įrenginį su konfigūravimo komanda, kad registruotų F2 (jei reikia) ir F4, nustatančias atitinkamas osrs_h, osrs_t ir osrs_p reikšmes, plius režimas = 1 (vieno kadro režimas). Pavyzdžiui:

[objectName.updateF2Control (1);] // osrs_h - niekada nereikalingas BMP280, // ir nereikalingas BME280, jei matavimų skaičius nekeičiamas // nuo pradžios () vertės. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Pažadinęs prietaisą, jis pradės matuoti, tačiau rezultatas nebus pasiekiamas per kelias milisekundes - mažiausiai 4 ms, galbūt iki 70 ms ar daugiau, priklausomai nuo nurodytų matavimų skaičiaus. Jei skaitymo komanda bus išsiųsta nedelsiant, prietaisas grąžins ankstesnio matavimo reikšmes - tai gali būti priimtina kai kuriose programose, tačiau daugeliu atvejų tikriausiai geriau atidėti, kol bus pasiektas naujas matavimas.

Šį vėlavimą galima atlikti keliais būdais.

  1. palaukite nustatytą laiką, kad padengtumėte ilgiausią numatytą vėlavimą
  2. palaukite tam tikrą laiką, apskaičiuotą iš maksimalaus matavimo laiko vienam matavimui (ty 2,3 ms), padauginus iš matavimų skaičiaus, pridėjus pridėtines išlaidas ir pridėjus maržą.
  3. palaukite trumpesnį laiką, apskaičiuotą, kaip aprašyta aukščiau, bet naudodamiesi vardine matavimo trukme (ty 2 ms) ir pridėtinėmis išlaidomis, tada pradėkite tikrinti bitą „Aš matuoju“būsenos registre. Kai būsenos bitas rodo 0 (ty nematuoja), gaukite temperatūros ir slėgio rodmenis.
  4. nedelsdami pradėkite tikrinti būsenos registrą ir gaukite temperatūros ir slėgio rodmenis, kai būsenos bitas nuskaito 0,

Kiek vėliau parodysiu vieno iš būdų tai padaryti.

Konfigūracijos registro operacijos

Kad visa tai įvyktų, mums reikia kelių priemonių, kurių dar nesu pristatęs. Jie yra:

baitų skaitymasRegistruokitės (reg)

void updateRegister (reg, value)

Kiekviena iš jų bibliotekoje turi keletą išvestinių komandų, kurios palengvina konkrečių veiksmų programinę įrangą.

PowerSaverPressureAndTemperature.ino pavyzdys naudoja metodą Nr. 3. Kodo eilutė, kuri atlieka pakartotinį tikrinimą, yra

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

Atminkite, kad šis eskizas skirtas ESP8266 mikrovaldikliui. Aš naudoju „WeMos D1 mini pro“. Eskizas neveiks su „Atmega“mikrovaldikliais, kurie turi skirtingas miego instrukcijas. Šis eskizas atlieka keletą kitų komandų, todėl prieš jas išsamiau aprašydamas pristatysiu jas visas.

Kai mikrovaldiklis miega lygiagrečiai su BMP280 jutikliu, reikiamo matavimo jutiklio konfigūraciją galima atlikti komandoje start (), naudojant 6 parametrus. Tačiau jei mikrokontroleris nemiega, o jutiklis miega, matavimo metu jutiklis turi būti pažadintas ir pasakyti jo matavimo konfigūraciją. Tai galima padaryti tiesiogiai su

updateRegister (reg, vertė)

bet yra šiek tiek lengviau naudojant šias tris komandas:

updateF2Control (osrs_h); // tik BME280

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

Atlikus matavimą, jei naudojamas režimas „Single shot“(priverstinis režimas), prietaisas automatiškai užmigs. Tačiau jei matavimo rinkinys apima kelis matavimus, naudojant nuolatinį (normalų) režimą, BMP280 reikės vėl užmigdyti. Tai galima padaryti naudojant vieną iš dviejų komandų:

updateF4Control16xSleep ();

updateF4ControlSleep (vertė);

Abu šie režimo bitai nustatomi į 00 (ty miego režimas). Tačiau pirmasis nustato osrs_t ir osrs_p į 111 (ty 16 matavimų), o antrasis saugo mažus 6 bitus iš „vertės“į 0xF4 registro 7: 2 bitus.

Panašiai šis teiginys saugo mažus šešis „vertės“bitus į 0xF5 registro 7: 2 bitus.

updateF5ConfigSleep (vertė);

Naudojant pastarąsias komandas, galima saugoti 12 bitų informacijos BMP280 registruose F4 ir F5. Bent jau ESP8266 atveju, kai mikrovaldiklis pabunda po tam tikro miego laikotarpio, jis prasideda eskizo pradžioje, nežinodamas jo būsenos prieš miego komandą. Norint išsaugoti žinias apie būseną prieš miego komandą, duomenis galima išsaugoti „flash“atmintyje, naudojant EEPROM funkcijas arba rašant failą naudojant SPIFFS. Tačiau „flash“atminties įrašymo ciklų skaičius yra ribotas, maždaug 10 000–100 000. Tai reiškia, kad jei mikrovaldiklis kas kelias sekundes atlieka miego ir budėjimo ciklą, jis gali viršyti leistiną atminties įrašymo ciklą ribą per kelis mėnesius. Kelių duomenų bitų saugojimas BMP280 neturi tokio apribojimo.

F4 ir F5 registruose saugomus duomenis galima atkurti, kai mikrokontroleris atsibunda naudojant komandas

readF4Sleep ();

readF5Sleep ();

Šios funkcijos nuskaito atitinkamą registrą, perkelia turinį, kad pašalintų 2 LSB, ir grąžina likusius 6 bitus. Šios funkcijos naudojamos „PowerSaverPressureAndTemperatureESP.ino“eskizo pavyzdyje:

// skaityti EventCounter vertę atgal iš bmp0

baitas bmp0F4value = bmp0.readF4Sleep (); // nuo 0 iki 63 baitų bmp0F5value = bmp0.readF5Sleep (); // nuo 0 iki 63 eventCounter = bmp0F5value*64+bmp0F4value; // nuo 0 iki 4095

Šios funkcijos nuskaito atitinkamą registrą, perkelia turinį, kad pašalintų 2 LSB, ir grąžina likusius 6 bitus. Šios funkcijos yra naudojamos pavyzdyje eskizas powerSaverPressureAndTemperature.ino taip:

// skaityti „EventCounter“vertę atgal iš bmp1

baitas bmp1F4value = bmp1.readF4Sleep (); // nuo 0 iki 63 baitų bmp1F5value = bmp1.readF5Sleep (); // nuo 0 iki 63 eventCounter = bmp1F5value*64+bmp1F4value; // nuo 0 iki 4095

Žalios temperatūros ir slėgio funkcijos

Pagrindines skaitymo temperatūros, skaitymo slėgio ir skaitymo drėgmės funkcijas sudaro du komponentai. Pirmiausia iš BME/P280 gaunamos neapdorotos 20 bitų temperatūros ir slėgio vertės arba iš neapdorotos 16 bitų drėgmės vertės iš BME280. Tada kompensacijos algoritmas naudojamas generuoti išvesties reikšmes Celsijaus laipsniais, hPa arba %RH.

Biblioteka šiems komponentams suteikia atskiras funkcijas, kad būtų galima gauti neapdorotos temperatūros, slėgio ir drėgmės duomenis ir galbūt juos kažkaip manipuliuoti. Taip pat pateiktas algoritmas temperatūrai, slėgiui ir drėgmei išvesti iš šių neapdorotų verčių. Bibliotekoje šie algoritmai įgyvendinami naudojant dvigubo ilgio slankiojo kablelio aritmetiką. Jis gerai veikia ESP8266, kuris yra 32 bitų procesorius ir naudoja 64 bitus „dvigubiems“plūdiniams kintamiesiems. Šių funkcijų prieinamumas gali būti naudingas vertinant ir galbūt keičiant kitų platformų skaičiavimus.

Šios funkcijos yra:

readRawPressure (žaliavinė temperatūra); // skaito neapdoroto slėgio ir temperatūros duomenis iš BME/P280readRawHumidity (rawTemperature, rawPressure); // skaito neapdorotos drėgmės, temperatūros ir slėgio duomenis iš BME280 calcTemperature (rawTemperature, t_fine); calcPressure (neapdorotas slėgis, t_fine); calcHumidity (rawHumidity, t_fine)

Šių funkcijų „t-fine“argumentas vertas šiek tiek paaiškinimo. Tiek slėgio, tiek drėgmės kompensavimo algoritmai apima nuo temperatūros priklausomą komponentą, kuris pasiekiamas naudojant kintamąjį t_fine. Funkcija calcTemperature užrašo reikšmę t_fine, remdamasi temperatūros kompensavimo algoritmo logika, kuri vėliau naudojama kaip įvestis tiek calcPressure, tiek calcHumidity.

Šių funkcijų naudojimo pavyzdį rasite eskizo rawPressureAndTemperature.ino eskizo pavyzdyje, taip pat bibliotekos.cpp failo funkcijos readHumidity () kode.

Aukščio ir jūros lygio slėgis

Yra žinomas ryšys tarp atmosferos slėgio ir aukščio. Oras taip pat turi įtakos spaudimui. Kai orų organizacijos skelbia informaciją apie atmosferos slėgį, jos paprastai ją pakoreguoja pagal aukštį, todėl „sinoptinėje diagramoje“rodomos izobaros (pastovaus slėgio linijos), standartizuotos pagal vidutinį jūros lygį. Taigi iš tikrųjų šiuose santykiuose yra 3 vertybės, o žinant dvi iš jų galima išvesti trečiąją. 3 vertės yra šios:

  • aukštis virš jūros lygio
  • faktinis oro slėgis tame aukštyje
  • ekvivalentinis oro slėgis jūros lygyje (tiksliau, vidutinis jūros lygis, nes momentinis jūros lygis nuolat kinta)

Šioje bibliotekoje yra dvi šios santykio funkcijos:

calcAltitude (slėgis, jūros lygis);

calcNormalized Pressure (slėgis, aukštis);

Taip pat yra supaprastinta versija, kuri numato standartinį 1013,15 hPa slėgį jūros lygyje.

calcAltitude (slėgis); // standartinis „seaLevel“slėgis

3 veiksmas: išsami informacija apie BMP280 įrenginį

Informacija apie įrenginį BMP280
Informacija apie įrenginį BMP280

Techninės įrangos galimybės

BMP280 turi 2 baitus konfigūracijos duomenų (registro adresuose 0xF4 ir 0xF5), kurie naudojami valdyti kelias matavimo ir duomenų išvesties parinktis. Jame taip pat pateikiama 2 bitų būsenos informacija ir 24 baitai kalibravimo parametrų, kurie naudojami neapdorotai temperatūrai ir slėgiui konvertuoti į įprastus temperatūros ir slėgio vienetus. BME280 turi papildomų duomenų:

  • 1 papildomas konfigūracijos duomenų baitas registro adresu 0xF2, naudojamas kontroliuoti kelis drėgmės matavimus;
  • 8 papildomi baitai kalibravimo parametrų, naudojamų neapdorotos drėgmės vertei konvertuoti į santykinės drėgmės procentą.

BME280 temperatūros, slėgio ir būsenos registrai yra tokie patys kaip ir BMP280, išskyrus nedideles išimtis:

  • BME280 „ID“bitai yra nustatyti į 0x60, todėl juos galima atskirti nuo BMP280, kurie gali būti 0x56, 0x57 arba 0x58
  • miego laiko valdiklis (t_sb) pakeičiamas taip, kad du ilgi BMP280 laikai (2000 ms ir 4000 ms) būtų pakeisti BME280 trumpu 10 ms ir 20 ms laiku. Maksimalus miego laikas BME280 yra 1000 ms.
  • BME280 temperatūroje ir slėgio neapdorotos vertės visada yra 20 bitų, jei naudojamas filtravimas. 16–19 bitų reikšmės naudojamos tik tais atvejais, kai nėra filtravimo (ty filtras = 0).

Temperatūra ir slėgis yra 20 bitų vertės, kurias reikia konvertuoti į įprastą temperatūrą ir slėgį naudojant gana sudėtingą algoritmą, naudojant 3 16 bitų temperatūros kalibravimo parametrus ir 9 16 bitų kalibravimo parametrus plius slėgio temperatūrą. Temperatūros matavimo granuliacija yra 0,0003 laipsnių Celsijaus, kai bitų pokytis yra mažiausiai reikšmingas (20 bitų rodmenys), padidėja iki 0,0046 laipsnių Celsijaus, jei naudojamas 16 bitų rodmuo.

Drėgmė yra 16 bitų reikšmė, kurią reikia konvertuoti į santykinę drėgmę naudojant kitą sudėtingą algoritmą, naudojant 6 kalibravimo parametrus, kurie yra 8, 12 ir 16 bitų mišinys.

Duomenų lapas rodo absoliučią temperatūros rodymo tikslumą +-0,5 C esant 25 C ir +-1 C intervale nuo 0 iki 65 C.

Slėgio matavimo detalumas yra 0,15 Pascals (ty 0,0015 hectoPascals) esant 20 bitų rezoliucijai arba 2,5 Pascals esant 16 bitų rezoliucijai. Neapdoroto slėgio vertę veikia temperatūra, todėl maždaug 25 ° C temperatūrai padidėjus 1 laipsniu C, išmatuotas slėgis sumažėja 24 paskaliais. Kalibravimo algoritme atsižvelgiama į jautrumą temperatūrai, todėl pateikiamos slėgio vertės turi būti tikslios esant skirtingoms temperatūroms.

Duomenų lapas rodo absoliutų slėgio rodmens tikslumą kaip +-1 hPa esant temperatūrai nuo 0 C iki 65 C.

Drėgmės tikslumas duomenų lape nurodomas kaip +-3% RH ir +-1% histerezė.

Kaip tai veikia

24 baitai temperatūros ir slėgio kalibravimo duomenų, taip pat BME280 atveju - 8 baitai drėgmės kalibravimo duomenų turi būti nuskaityti iš įrenginio ir saugomi kintamaisiais. Šie duomenys yra individualiai programuojami į įrenginį gamykloje, todėl skirtingi įrenginiai turi skirtingas vertes - bent jau kai kurių parametrų. BME/P280 gali būti vienoje iš dviejų būsenų. Vienoje būsenoje jis matuojamas. Kitoje būsenoje jis laukia (miega).

Kokioje būsenoje jis yra, galima patikrinti pažiūrėjus į registro 0xF3 3 bitą.

Paskutinio matavimo rezultatus galima gauti bet kuriuo metu, skaitant atitinkamą duomenų vertę, nepriklausomai nuo to, ar prietaisas miega, ar matuoja.

Taip pat yra du BME/P280 valdymo būdai. Vienas iš jų yra nuolatinis režimas (duomenų lape vadinamas normalus režimas), kuris pakartotinai perjungia matavimo ir miego būsenas. Šiuo režimu prietaisas atlieka matavimų rinkinį, tada eina miegoti, tada atsibunda kitam matavimų rinkiniui ir pan. Individualių matavimų skaičių ir ciklo miego dalies trukmę galima valdyti naudojant konfigūracijos registrus.

Kitas BME/P280 valdymo būdas yra vieno kadro režimas (duomenų lape vadinamas priverstiniu režimu). Šiuo režimu prietaisas pažadinamas iš miego režimo pagal komandą matuoti, jis atlieka matavimų rinkinį, tada vėl užmiega. Rinkinio atskirų matavimų skaičius valdomas konfigūravimo komanda, kuri pažadina įrenginį.

BMP280, jei atliekamas vienas matavimas, užpildomi 16 reikšmingiausių bitų, o keturi mažiausiai reikšmingi bitai vertės rodmenyje yra nuliai. Matavimų skaičių galima nustatyti į 1, 2, 4, 8 arba 16, o matavimų skaičiui didėjant, bitų, užpildytų duomenimis, skaičius didėja, todėl 16 matavimų metu visi 20 bitų užpildomi matavimo duomenimis. Duomenų lape šis procesas vadinamas per dideliu atranka.

BME280 ta pati tvarka taikoma tol, kol rezultatas nėra filtruojamas. Jei naudojamas filtravimas, reikšmės visada yra 20 bitų, nepriklausomai nuo to, kiek matavimų buvo atlikta per kiekvieną matavimo ciklą.

Kiekvienas matavimas trunka apie 2 milisekundes (tipinė vertė; didžiausia vertė yra 2,3 ms). Prie to pridėjus fiksuotą maždaug 2 ms (paprastai šiek tiek mažiau) pridėtinę kainą, matavimo seka, kurią gali sudaryti nuo 1 iki 32 atskirų matavimų, gali trukti nuo 4 ms iki 66 ms.

Duomenų lape pateikiamas rekomenduojamų temperatūros ir slėgio per didelio mėginių ėmimo derinių rinkinys įvairioms reikmėms.

Konfigūracijos valdymo registrai

Du BMP280 konfigūracijos valdymo registrai yra registrų adresuose 0xF4 ir 0xF5 ir susieti su 6 atskiromis konfigūracijos valdymo reikšmėmis. 0xF4 sudaro:

  • 3 bitai osrs_t (išmatuokite temperatūrą 0, 1, 2, 4, 8 arba 16 kartų);
  • 3 bitai osrs_p (išmatuokite slėgį 0, 1, 2, 4, 8 arba 16 kartų); ir
  • 2 bitų režimas (miego režimas, priverstinis (ty vienas kadras), normalus (ty nuolatinis).

0xF5 sudaro:

  • 3 bitai t_sb (budėjimo laikas, nuo 0,5 ms iki 4000 ms);
  • 3 bitų filtras (žr. Žemiau); ir
  • 1 bitas spiw_en, kuris pasirenka SPI arba I2C.

Filtro parametras valdo eksponentinio skilimo algoritmo tipą arba „Infinite Impulse Response“(IIR) filtrą, taikomą neapdorotam slėgiui ir temperatūrai (bet ne drėgmės vertėms). Lygtis pateikta duomenų lape. Kitas pristatymas yra:

Reikšmė (n) = Vertė (n-1) * (K-1) / K + matavimas (n) / K

kur (n) nurodo naujausią matavimo ir išvesties vertę; ir K yra filtro parametras. Filtro parametras K ir gali būti nustatytas į 1, 2, 4, 8 arba 16. Jei K yra nustatytas į 1, lygtis tiesiog tampa Reikšmė (n) = matavimas (n). Filtro parametro kodavimas yra toks:

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

BME 280 prideda papildomą konfigūracijos valdymo registrą adresu 0xF2 „ctrl_hum“su vienu 3 bitų parametru osrs_h (išmatuokite drėgmę 0, 1, 2, 4, 8 arba 16 kartų).

4 žingsnis: matavimo ir nuskaitymo laikas

Aš planuoju tai pridėti vėliau, parodydamas komandų ir matavimo atsakymų laiką.

Iddt - srovė matuojant temperatūrą. Tipinė vertė 325 uA

Iddp - srovė matuojant slėgį. Įprasta vertė 720 uA, maks. 1120 uA

Iddsb - dabartinis laukimo režime. Tipinė vertė 0,2 uA, maks. 0,5 uA

Iddsl - srovė miego režimu. Tipinė vertė 0,1 uA, maks. 0,3 uA

5 veiksmas: programinės įrangos gairės

Programinės įrangos gairės
Programinės įrangos gairės
Programinės įrangos gairės
Programinės įrangos gairės

„I2C“serijos režimas

BMP280 duomenų lape pateikiamos duomenų nuskaitymo gairės (3.9 skyrius). Jame sakoma: „primygtinai rekomenduojama naudoti serijinį skaitymą, o ne adresuoti kiekvieną registrą atskirai. Taip išvengsite galimo skirtingų matavimų baitų sumaišymo ir sumažinsite sąsajos srautą“. Kompensacijos/kalibravimo parametrų nuskaitymo gairių nėra. Tikriausiai tai nėra problema, nes jie yra statiški ir nesikeičia.

Ši biblioteka nuskaito visas gretutines vertes vienu nuskaitymo veiksmu - 24 baitai, esant temperatūros ir slėgio kompensavimo parametrams, 6 baitai, kai derinama temperatūra ir slėgis, ir 8 baitai, kai derinama drėgmė, temperatūra ir slėgis. Tikrinant vien temperatūrą, nuskaitomi tik 3 baitai.

Makrokomandų naudojimas (#define ir kt.)

Šioje bibliotekoje nėra kitų makrokomandų, išskyrus įprastą biblioteką „include guard“, kuri apsaugo nuo dubliavimosi.

Visos konstantos apibrėžtos naudojant raktinį žodį const, o derinimo spausdinimas valdomas naudojant standartines C funkcijas.

Man tai sukėlė tam tikrą neapibrėžtumą, tačiau patarimas, kurį gaunu skaitydamas daugelį pranešimų šia tema, yra tas, kad #define naudojimas konstantoms deklaruoti (bent jau) ir (tikriausiai) derinimo spausdinimo valdymas yra nereikalingas ir nepageidaujamas.

Const, o ne #define naudojimo atvejis yra gana aiškus - const naudoja tuos pačius išteklius kaip #define (ty nulis), o gautos vertės atitinka taikymo srities taisykles, taip sumažinant klaidų tikimybę.

Derinimo spausdinimo valdymo atvejis yra šiek tiek mažiau aiškus, nes tai, kaip aš tai padariau, reiškia, kad galutiniame kode yra derinimo spausdinimo teiginių logika, nors jie niekada nėra naudojami. Jei biblioteka bus naudojama dideliame mikrovaldiklio su labai ribota atmintimi projekte, tai gali tapti problema. Kadangi kūriau ESP8266 su didele „flash“atmintimi, man tai neatrodė problema.

6 žingsnis: Temperatūros veikimas

Aš planuoju tai pridėti vėliau.

7 žingsnis: slėgio našumas

Aš planuoju tai pridėti vėliau.

Rekomenduojamas: