Sisällysluettelo:

Kirjasto BMP280 ja BME280: 7 vaihetta
Kirjasto BMP280 ja BME280: 7 vaihetta

Video: Kirjasto BMP280 ja BME280: 7 vaihetta

Video: Kirjasto BMP280 ja BME280: 7 vaihetta
Video: Урок 96: Датчик атмосферного давления, температуры, приблизительной высоты BMP390 с ЖК-дисплеем 2024, Heinäkuu
Anonim
Kirjasto BMP280 ja BME280
Kirjasto BMP280 ja BME280
Kirjasto BMP280 ja BME280
Kirjasto BMP280 ja BME280
Kirjasto BMP280 ja BME280
Kirjasto BMP280 ja BME280

Johdanto

En aikonut kirjoittaa tätä kirjastoa. Se "tapahtui" sivuvaikutuksena aloittamastani projektista, joka käyttää BMP280: ta. Projekti ei ole vielä päättynyt, mutta mielestäni kirjasto on valmis jakamaan muiden kanssa. Myöhemmin minun oli käytettävä BME280 -laitetta, joka lisää kosteusmittausta BMP280: n paine- ja lämpötilakykyyn. BME280 on "taaksepäin yhteensopiva" BMP280: n kanssa - eli kaikki rekisterit ja vaiheet, jotka tarvitaan paineen ja lämpötilan lukemiseen BME280: sta, ovat samat kuin BMP280: ssa. Kosteuden lukemiseen tarvitaan muita rekistereitä ja vaiheita, jotka koskevat vain BME280 -laitetta. Tämä herättää kysymyksen, yksi kirjasto molemmille tai kaksi erillistä kirjastoa. Näiden kahden laitetyypin laitteisto on täysin vaihdettavissa. Jopa monet myytävistä moduuleista (esimerkiksi Ebayssa ja AliExpressissä) on merkitty BME/P280. Selvittääksesi, minkä tyyppinen se on, sinun on tarkasteltava itse anturin (pientä) kirjoitusta tai testattava laitteen ID -tavu. Päätin hankkia yhden kirjaston. Se näyttää toimineen OK.

Palautetta, erityisesti parannusehdotuksia, arvostetaan.

Kirjaston ominaisuudet ja ominaisuudet

Kirjasto on ohjelmisto, joka tarjoaa sovellusohjelmointirajapinnan (API), jonka avulla ohjelmoija voi käyttää laitteen ominaisuuksia tarvitsematta käsitellä kaikkia hienojakoisia yksityiskohtia. On toivottavaa, että sovellusliittymän pitäisi olla helppo aloittelijalle, jolla on yksinkertaiset vaatimukset päästä alkuun, ja samalla sen tulee tarjota kaikki laitteen ominaisuudet. Kirjaston tulisi mielellään noudattaa laitteen valmistajan erityisiä ohjeita sekä yleisiä ohjelmiston hyviä käytäntöjä. Olen pyrkinyt saavuttamaan nämä kaikki. Kun aloitin BMP280: n, löysin sille kolme eri kirjastoa: Adafruit_BMP280; Seeed_BMP280; ja yksi nimeltään BMP280 laitteen valmistajalta. Adafruit tai Seeed eivät tarjonneet laajennettuja ominaisuuksia, vaikka ne toimivat hyvin ja niitä oli helppo käyttää perussovelluksissa. En voinut ymmärtää, miten käytämme laitteen valmistajan (Bosch Sensortec) tuottamaa. Tämä voi olla minun puutteeni, ei heidän. Kuitenkin kirjasto oli paljon monimutkaisempi kuin kaksi muuta, en löytänyt ohjeita tai käyttöesimerkkejä (myöhemmin löysin esimerkkejä tiedostosta "bmp280_support.c", mutta ne eivät olleet erityisen hyödyllisiä minulle).

Näiden tekijöiden seurauksena päätin kirjoittaa oman kirjaston BMP280: lle.

Tarkasteltaessa BME280: n kirjasto-tilannetta löysin erilliset kirjastot Adafruit_BME280, Seed_BME280 ja toisen BME280_MOD-1022, jonka on kirjoittanut Embedded Adventures. Yksikään niistä ei yhdistänyt BMP280: n toimintoja kirjastossa, joka pystyy käyttämään BME280: ta. Yksikään niistä ei nimenomaisesti tukenut laitteiden kykyä tallentaa muutaman bitin dataa, kun laite ja sitä ohjaava mikroprosessori ovat lepotilassa (tämä ominaisuus ilmenee tietolomakkeesta ja sitä tuetaan tässä kirjoittamassani ja kuvaamassani kirjastossa).

Yhdistetyn kirjaston pitäisi tukea kaikkia BME280: n ominaisuuksia, mutta kun sitä käytetään BMP280: n kanssa, sen ei pitäisi aiheuttaa käyttämättömille toiminnoille ylimääräisiä kustannuksia. Yhdistetyn kirjaston etuja ovat vähemmän hallittavia kirjastotiedostoja, eri laitteiden helppo yhdistäminen samassa projektissa ja yksinkertaistetut muutokset ylläpitoon tai päivityksiin, jotka on tehtävä vain yhdessä paikassa kahden sijaan. Nämä ovat luultavasti melko pieniä, jopa merkityksettömiä, mutta…

Laitteen ominaisuudet

BMP280 ja BME280 ovat pinta-asennettavia laitteita, joiden neliö on noin 5 mm ja korkeus 1 mm. Käytettävissä on 8 käyttöliittymää, mukaan lukien 2 erillistä virtalähdetyynyä ja kaksi Ground -tyynyä. Ne ovat saatavilla eBayssa moduulina, jossa on joko 4 tai 6 nastaa. 4-nastaisella moduulilla on kiinteä I2C-osoite, eikä sitä voida määrittää käyttämään SPI-protokollaa.

6-nastaista moduulia tai laitetta voidaan käyttää joko I2C- tai SPI-protokollien kanssa. I2C -tilassa sillä voi olla kaksi eri osoitetta, jotka voidaan saavuttaa kytkemällä SDO -nasta joko maahan (perusosoite = 0x76) tai Vdd -liittimeen (perusosoite +1 = 0x77). SPI -tilassa siinä on tavallinen järjestely: 1 kello, 2 dataa (yksi kumpaankin suuntaan) ja laitteen valintatappi (CS).

Kirjasto, jonka kirjoitin ja kuvailin täällä, tukee vain I2C: tä. Adafruit_BMP280- ja BME_MOD-1022-kirjastot tukevat sekä i2C: tä että SPI: tä.

Kirjasto on ladattavissa täältä:

github.com/farmerkeith/BMP280-library

Vaihe 1: Laitteiston asentaminen

Laitteiston asentaminen
Laitteiston asentaminen

Ennen kuin kirjasto voi olla hyödyllinen, sinun on kytkettävä mikro -ohjain BMP280: een (tai kahteen niistä, jos haluat).

Käytin WeMos D1 mini pro -laitetta, joten näytän sen yhteydet. Muut mikro -ohjaimet ovat samanlaisia, sinun tarvitsee vain liittää SDA- ja SCL -nastat oikein.

WeMos D1 mini pro -laitteen liitännät ovat:

Toiminto WeMos -tappi BMP280 -nastainen Huomautuksia

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nimellinen 3.3V Ground GND Osoitteen ohjaus SDO Ground tai Vdd I2C select CSB Vdd (GND valitsee SPI)

Huomaa, että joidenkin MP280 -moduulien SDO -nasta on merkitty SDD: ksi ja Vdd -nasta voi olla merkitty VCC: ksi. Huomautus: SDA- ja SCL-linjoissa tulee olla vetovastusvastukset linjan ja Vin-nastan välissä. Tyypillisesti arvon 4,7K pitäisi olla OK. Joissakin BMP280- ja BME280-moduuleissa on 10K-vetovastusvastukset (mikä ei ole hyvä käytäntö, koska useiden laitteiden asettaminen I2C-väylälle saattaa kuormittaa sitä liikaa). Kuitenkin kahden BME/P280-moduulin käyttäminen kussakin 10K-vastuksella ei saisi olla käytännössä ongelma niin kauan kuin samassa väylässä ei ole liikaa muita laitteita, joissa on myös vetovastus.

Kun laitteisto on kytketty, voit helposti tarkistaa, onko laitteesi BMP280 tai BME280, suorittamalla luonnos I2CScan_ID, joka löytyy täältä:

Voit myös tarkistaa, onko sinulla BMP280 tai BME280, katsomalla itse laitetta. Pidin välttämättömänä käyttää digitaalista mikroskooppia tähän, mutta jos näkösi on erittäin hyvä, saatat pystyä tekemään sen ilman apuvälineitä. Laitteen kotelossa on kaksi tulostusriviä. Avain on toisen rivin ensimmäinen kirjain, joka BMP280 -laitteissa on "K" ja BME280 -laitteissa "U".

Vaihe 2: Kirjaston tarjoamat sovellusliittymät

Kirjaston tarjoamat sovellusliittymät
Kirjaston tarjoamat sovellusliittymät
Kirjaston tarjoamat sovellusliittymät
Kirjaston tarjoamat sovellusliittymät

Kirjaston sisällyttäminen luonnokseen

Kirjasto sisältyy luonnokseen vakiomuotoisesti lausetta käyttäen

#include "farmerkeith_BMP280.h"

Tämä lausunto on sisällytettävä luonnoksen alkuosaan ennen setup () -toiminnon aloittamista.

BME- tai BMP -ohjelmisto -objektin luominen

BMP280 -ohjelmisto -objektin luomiseen on kolme tasoa. Yksinkertaisin on vain

bme280 objectName; tai bmp280 objectName;

esimerkiksi BMP280 bmp0;

Tämä luo ohjelmisto -objektin, jonka oletusosoite on 0x76 (eli maadoitetulle SDO: lle).

Seuraavalla tasolla BME280- tai BMP280 -ohjelmisto -objektin luomisessa on parametri joko 0 tai 1 seuraavasti:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parametri (0 tai 1) lisätään I2C -perusosoitteeseen siten, että kahta BME280- tai BMP280 -laitetta voidaan käyttää samassa I2C -väylässä (mukaan lukien yksi kummastakin).

Kolmannella tasolla BME- tai BMP280 -ohjelmisto -objektin luomisessa on kaksi parametria. Ensimmäinen parametri, joka on joko 0 tai 1, on osoitetta varten, kuten edellisessä tapauksessa. Toinen parametri ohjaa virheenkorjausta. Jos se on asetettu arvoon 1, jokainen tapahtuma ohjelmisto -objektilla johtaa Serial.print -lähtöön, jonka avulla ohjelmoija voi nähdä tapahtuman tiedot. Esimerkiksi:

bmp280 objectNameB (1, 1);

Jos virheenkorjaustulostusparametriksi on asetettu 0, ohjelmisto -objekti palaa normaaliin toimintaan (ei tulostusta).

Tämä lausunto tai lausumat on sisällytettävä #include jälkeen ja ennen setup () -funktiota.

Alustetaan BME- tai BMP -ohjelmisto -objekti

Ennen käyttöä sinun on luettava kalibrointiparametrit laitteesta ja määritettävä se mihin tahansa mittaustilaan, ylinäytteenotto- ja suodatinasetuksiin.

Yksinkertainen, yleiskäyttöinen alustus, lause on:

objectName.begin ();

Tämä aloitusversio () lukee laitteen kalibrointiparametrit ja asettaa osrs_t = 7 (16 lämpötilamittausta), osrs_p = 7 (16 painemittausta), tila = 3 (jatkuva, normaali), t_sb = 0 (lepotila 0,5 ms mittausjoukot), suodatin = 0 (K = 1, ei suodatusta) ja spiw_en = 0 (SPI pois käytöstä, joten käytä I2C: tä). BME280: ssa on ylimääräinen parametri osrs_h = 7 16 kosteusmittaukseen.

On olemassa toinen versio alkamisesta (), joka sisältää kaikki kuusi (tai 7) parametria. Edellä olevan väitteen vastaava on

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

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

Täydellinen luettelo koodeista ja niiden merkityksistä on BME280- ja BMP280 -tietolomakkeessa sekä kirjaston.cpp -tiedoston kommenteissa.

Yksinkertainen lämpötilan ja paineen mittaus

Yksinkertaisin tapa on mitata lämpötila

kaksoislämpötila = objektiNimi.lukuTemperature (); // mittaa lämpötila

Yksinkertaisin tapa on mitata paine

kaksinkertainen paine = objectName.readPressure (); // mittaa paine

Yksinkertaisin tapa on mitata kosteus

kaksinkertainen kosteus = objectName.readHumidity (); // mittaa kosteutta (vain BME280)

Sekä lämpötilan että paineen saamiseksi yllä olevia kahta lauseketta voidaan käyttää peräkkäin, mutta on toinen vaihtoehto, joka on:

kaksinkertainen lämpötila;

kaksinkertainen paine = esineNimi.lukemapaine (lämpötila); // mittaa paine ja lämpötila

Tämä lausunto lukee BME280- tai BMP280 -laitteen tiedot vain kerran ja palauttaa sekä lämpötilan että paineen. Tämä on hieman tehokkaampi I2C -väylän käyttö ja varmistaa, että molemmat lukemat vastaavat samaa mittausjaksoa.

BME 280: lle yhdistetty lausunto, joka saa kaikki kolme arvoa (kosteus, lämpötila ja paine) on:

kaksinkertainen lämpötila, paine; kaksinkertainen kosteus = objectName.readHumidity (lämpötila, paine); // mittaa kosteus, paine ja lämpötila

Tämä lausunto lukee tiedot BMP280 -laitteesta vain kerran ja palauttaa kaikki kolme arvoa. Tämä on hieman tehokkaampi I2C -väylän käyttö ja varmistaa, että kolme lukemaa vastaavat samaa mittausjaksoa. Huomaa, että muuttujien nimet voidaan muuttaa mihin tahansa, mistä käyttäjä pitää, mutta niiden järjestys on kiinteä - lämpötila tulee ensin ja paine tulee toiseksi.

Näitä käyttötapauksia käsitellään kirjaston mukana toimitetuissa esimerkkiluonnoksissa, jotka ovat basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino ja basicHumidityAndTemperatureAndPressure.ino.

Kehittyneempiä lämpötilan ja paineen mittauksia

Vaikka yllä olevat lausuntosarjat toimivat ilman ongelmia, on olemassa pari ongelmaa:

  1. laite on jatkuvasti käynnissä ja kuluttaa siksi virtaa enimmäistasollaan. Jos energia tulee akusta, sitä on ehkä vähennettävä.
  2. kulutetun tehon vuoksi laite lämpenee, ja siksi mitattu lämpötila on korkeampi kuin ympäristön lämpötila. Käsittelen tätä myöhemmin myöhemmässä vaiheessa.

Tulos, joka käyttää vähemmän virtaa ja antaa lämpötilan, joka on lähempänä ympäristön lämpötilaa, voidaan saada käyttämällä aloitusta () parametreilla, jotka asettavat sen nukkumaan (esim. Tila = 0). Esimerkiksi:

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

Kun mittaus halutaan, herätä laite konfigurointikomennolla rekisteröimään F2 (tarvittaessa) ja F4, joka asettaa sopivat arvot osrs_h, osrs_t ja osrs_p, plus mode = 1 (yksittäiskuvaustila). Esimerkiksi:

[objectName.updateF2Control (1);] // osrs_h - ei koskaan tarvita BMP280: lle, // eikä tarvita BME280: lle, jos mittausten lukumäärää ei muuteta // alussa () annetusta arvosta. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Kun laite on herännyt, se aloittaa mittaamisen, mutta tulos ei ole käytettävissä muutaman millisekunnin ajan - vähintään 4 ms, ehkä jopa 70 ms tai enemmän, riippuen määritetyistä mittauksista. Jos lukukomento lähetetään välittömästi, laite palauttaa edellisen mittauksen arvot - mikä saattaa olla hyväksyttävää joissakin sovelluksissa, mutta useimmissa tapauksissa on todennäköisesti parempi viivyttää, kunnes uusi mittaus on saatavilla.

Tämä viive voidaan tehdä useilla tavoilla.

  1. odota kiinteä aika kattamaan pisimmän odotetun viiveen
  2. odota aikaa, joka lasketaan enimmäismittausajasta mittausta kohden (eli 2,3 ms) kertaa mittausten määrä, plus yleiskustannukset ja marginaali.
  3. odota lyhyempää aikaa, joka on laskettu kuten edellä, mutta käyttäen nimellistä mittausaikaa (eli 2 ms) plus yleiskustannukset, ja aloita sitten "Minä mittaan" -bitin tarkistaminen tilarekisteristä. Kun tilabitti lukee 0 (eli ei mittaa), hae lämpötilan ja paineen lukemat.
  4. aloita heti tilarekisterin tarkistus ja saat lämpötilan ja paineen lukemat, kun tilabitti lukee 0,

Näytän esimerkin yhdestä tavasta tehdä tämä hieman myöhemmin.

Määritysrekisteritoiminnot

Jotta tämä kaikki tapahtuisi, tarvitsemme useita työkaluja, joita en ole vielä esitellyt. He ovat:

tavu lukuRekisteröidy (reg)

void updateRegister (reg, value)

Jokaisella näistä on useita johdettuja komentoja kirjastossa, mikä tekee ohjelmistosta tiettyjä toimintoja hieman yksinkertaisempaa.

Esimerkki powerSaverPressureAndTemperature.ino käyttää menetelmää nro 3. Toistuvan tarkistuksen suorittava koodirivi on

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

Huomaa, että tämä luonnos on tarkoitettu ESP8266 -mikro -ohjaimelle. Käytin WeMos D1 mini pro: ta. Luonnos ei toimi Atmega -mikrokontrollereilla, joilla on erilaiset nukkumisohjeet. Tämä luonnos käyttää useita muita komentoja, joten esitän ne kaikki ennen kuin kuvailen tätä luonnosta yksityiskohtaisemmin.

Kun mikrokontrolleri nukkuu rinnakkain BMP280 -anturin kanssa, anturi voidaan konfiguroida tarvittavia mittauksia varten komennolla start () käyttämällä 6 parametria. Jos mikro -ohjain ei kuitenkaan nuku, mutta anturi on, mittaushetkellä anturi on herätettävä ja kerrottava mittauskonfiguraatiostaan. Tämä voidaan tehdä suoraan

updateRegister (reg, arvo)

mutta se on hieman helpompaa seuraavilla kolmella komennolla:

updateF2Control (osrs_h); // Vain BME280

updateF4Control (osrs_t, osrs_p, tila); updateF5Config (t_sb, filter, spi3W_en);

Jos mittauksen jälkeen on käytetty yksittäiskuvaa (pakotettu tila), laite siirtyy automaattisesti takaisin nukkumaan. Jos mittausjoukkoon kuuluu kuitenkin useita mittauksia jatkuvalla (normaali) -tilalla, BMP280 on asetettava takaisin nukkumaan. Tämä voidaan tehdä jollakin seuraavista komennoista:

updateF4Control16xSleep ();

updateF4ControlSleep (arvo);

Molemmat asettavat tilabitit arvoon 00 (eli lepotilaan). Kuitenkin ensimmäinen asettaa osrs_t ja osrs_p arvoon 111 (eli 16 mittausta), kun taas toinen tallentaa alimmat 6 bittiä "arvosta" 0xF4 -rekisterin bitteihin 7: 2.

Samoin seuraava lause tallentaa "kuuden" pienen kuuden bitin 0xF5 -rekisterin bitteihin 7: 2.

updateF5ConfigSleep (arvo);

Näiden jälkimmäisten komentojen käyttö mahdollistaa 12 bitin tiedon tallentamisen BMP280 -rekistereihin F4 ja F5. Ainakin ESP8266: n tapauksessa, kun mikro -ohjain herää unen jälkeen, se alkaa luonnoksen alussa tietämättä sen tilaa ennen nukkumiskäskyä. Tietojen tallentamiseksi sen tilasta ennen lepokomentoa tiedot voidaan tallentaa flash -muistiin käyttämällä joko EEPROM -toimintoja tai kirjoittamalla tiedosto SPIFFS -protokollaa käyttäen. Flash-muistilla on kuitenkin rajoitettu kirjoitusjaksojen määrä, joka on luokkaa 10 000-100 000. Tämä tarkoittaa, että jos mikro-ohjain käy läpi lepotilan ja herätyksen syklin muutaman sekunnin välein, se voi ylittää sallitun muistikirjoituksen raja muutamassa kuukaudessa. Muutaman bitin datan tallentamiseen BMP280 -laitteeseen ei ole tällaista rajoitusta.

Rekisteriin F4 ja F5 tallennetut tiedot voidaan palauttaa, kun mikro -ohjain herää komentojen avulla

readF4Sleep ();

readF5Sleep ();

Nämä toiminnot lukevat vastaavan rekisterin, siirtävät sisällön poistamaan 2 LSB: tä ja palauttavat loput 6 bittiä. Näitä toimintoja käytetään esimerkkiluonnoksessa powerSaverPressureAndTemperatureESP.ino seuraavasti:

// lue EventCounterin arvo takaisin bmp0: sta

tavu bmp0F4value = bmp0.readF4Sleep (); // 0-63 tavua bmp0F5value = bmp0.readF5Sleep (); // 0-63 eventCounter = bmp0F5value*64+bmp0F4value; // 0 - 4095

Nämä toiminnot lukevat vastaavan rekisterin, siirtävät sisällön poistamaan 2 LSB: tä ja palauttavat loput 6 bittiä. Näitä toimintoja käytetään esimerkissä luonnos powerSaverPressureAndTemperature.ino seuraavasti:

// lue EventCounterin arvo takaisin bmp1: stä

tavu bmp1F4value = bmp1.readF4Sleep (); // 0-63 tavua bmp1F5value = bmp1.readF5Sleep (); // 0-63 eventCounter = bmp1F5value*64+bmp1F4value; // 0 - 4095

Raaka lämpötilan ja paineen toiminnot

Perustoiminnot Lämpötila, lukupaine ja lukukosteus ovat kaksi osaa. Ensin raaka 20-bittiset lämpötila- ja painearvot saadaan BME/P280: sta tai raaka 16-bittinen kosteusarvo BME280: sta. Sitten kompensointialgoritmia käytetään tuottamaan lähtöarvot celsiusasteina, hPa tai %RH.

Kirjasto tarjoaa erilliset toiminnot näille komponenteille, jotta raakalämpötila-, paine- ja kosteustiedot voidaan saada ja mahdollisesti käsitellä jollakin tavalla. Tarjolla on myös algoritmi lämpötilan, paineen ja kosteuden johtamiseksi näistä raaka -arvoista. Kirjastossa nämä algoritmit toteutetaan käyttämällä kaksinkertaista liukulukuaritmetiikkaa. Se toimii hyvin ESP8266: ssa, joka on 32-bittinen prosessori ja käyttää 64-bittisiä "kaksinkertaisia" kelluvia muuttujia. Näiden toimintojen tekeminen saataville voi olla hyödyllistä muiden alustojen laskelmien arvioinnissa ja mahdollisesti muuttamisessa.

Nämä toiminnot ovat:

readRaw Pressure (raaka lämpötila); // lukee raakapaine- ja lämpötilatiedot BME/P280readRawHumidity (rawTemperature, rawPressure); // lukee raa'an kosteuden, lämpötilan ja paineen tiedot BME280: sta calcTemperature (rawTemperature, t_fine); calc Pressure (raakapaine, t_hieno); calcHumidity (rawHumidity, t_fine)

Näiden toimintojen "t-hieno" argumentti on hieman selityksen arvoinen. Sekä paineen että kosteuden kompensointialgoritmit sisältävät lämpötilasta riippuvan komponentin, joka saavutetaan muuttujan t_fine avulla. CalcTemperature -funktio kirjoittaa arvon t_fine lämpötilan kompensointialgoritmin logiikan perusteella, jota käytetään sitten syöttönä sekä calcPressure- että calcHumidity -arvoissa.

Esimerkki näiden toimintojen käytöstä löytyy esimerkistä luonnos rawPressureAndTemperature.ino ja myös kirjaston.cpp -tiedoston readHumidity () -toiminnon koodista.

Korkeus ja merenpinnan paine

Ilmanpaineen ja korkeuden välillä on tiedossa yhteys. Sää vaikuttaa myös paineeseen. Kun sääjärjestöt julkaisevat ilmanpainetietoja, ne yleensä säätävät niitä korkeuden mukaan, joten "synoptinen kaavio" näyttää isobaarit (vakiopaineviivat), jotka on standardoitu keskimääräiseen merenpintaan. Tässä suhteessa on siis todellakin kolme arvoa, ja kahden tietäminen mahdollistaa kolmannen arvon johtamisen. 3 arvoa ovat:

  • korkeus merenpinnan yläpuolella
  • todellinen ilmanpaine kyseisellä korkeudella
  • vastaava ilmanpaine merenpinnalla (tarkemmin sanottuna keskimääräinen merenpinta, koska hetkellinen merenpinta muuttuu jatkuvasti)

Tämä kirjasto tarjoaa kaksi toimintoa tälle suhteelle seuraavasti:

calcAltitude (paine, meritasoPa);

calcNormalised Pressure (paine, korkeus);

On myös yksinkertaistettu versio, joka olettaa 1013,15 hPa: n vakiopainepaineen.

calcAltitude (paine); // oletettu seaLevelPressure oletettu

Vaihe 3: BMP280 -laitteen tiedot

BMP280 -laitteen tiedot
BMP280 -laitteen tiedot

Laitteisto -ominaisuudet

BMP280: ssa on 2 tavua määritystietoja (rekisteriosoitteissa 0xF4 ja 0xF5), joita käytetään ohjaamaan useita mittaus- ja tiedonsiirtovaihtoehtoja. Se tarjoaa myös 2 bittiä tilatietoja ja 24 tavua kalibrointiparametreja, joita käytetään raakalämpötila- ja painearvojen muuntamiseen tavanomaisiksi lämpötila- ja paineyksiköiksi. BME280 sisältää lisätietoja seuraavasti:

  • 1 ylimääräinen tavu määritystietoja rekisteriosoitteessa 0xF2, jota käytetään useiden kosteusmittausten ohjaamiseen;
  • 8 ylimääräistä tavua kalibrointiparametreja, joita käytetään raakakosteusarvon muuntamiseen suhteelliseksi kosteusprosentiksi.

BME280: n lämpötila-, paine- ja tilarekisterit ovat samat kuin BMP280: n, pieniä poikkeuksia lukuun ottamatta seuraavasti:

  • BME280: n "ID" -bitit on asetettu arvoon 0x60, joten ne voidaan erottaa BMP280: sta, joka voi olla 0x56, 0x57 tai 0x58
  • uniajan säätö (t_sb) muutetaan siten, että BMP280: n kaksi pitkää aikaa (2000 ms ja 4000 ms) korvataan BME280: ssa lyhyillä 10 ms ja 20 ms aikaväleillä. Suurin uniaika BME280: ssa on 1000 ms.
  • BME280: ssa lämpötilan ja paineen raaka -arvot ovat aina 20 bittiä, jos käytetään suodatusta. 16–19 -bittisten arvojen käyttö on rajoitettu tapauksiin, joissa ei ole suodatusta (eli suodatin = 0).

Lämpötila ja paine ovat kukin 20 -bittisiä arvoja, jotka on muunnettava tavanomaiseksi lämpötilaksi ja paineeksi melko monimutkaisen algoritmin avulla käyttäen 3 16 -bittisiä lämpötilan kalibrointiparametreja ja 9 16 -bittisiä kalibrointiparametreja sekä paineen lämpötila. Lämpötilamittauksen rakeisuus on 0,0003 celsiusastetta vähiten merkittävälle bittimuutokselle (20 bitin lukema) ja nousee 0,0046 celsiusasteeseen, jos käytetään 16 bitin lukemaa.

Kosteus on 16 -bittinen arvo, joka on muutettava suhteelliseksi kosteudeksi toisen monimutkaisen algoritmin avulla käyttämällä 6 kalibrointiparametria, jotka ovat 8, 12 ja 16 bitin yhdistelmä.

Tietolomake näyttää lämpötilalukeman absoluuttisen tarkkuuden +-0,5 C 25 ° C: ssa ja +-1 C alueella 0-65 C.

Paineenmittauksen rakeisuus on 0,15 Pascalia (eli 0,0015 hectoPascalia) 20 -bittisellä resoluutiolla tai 2,5 Pascalia 16 -bittisellä resoluutiolla. Lämpötila vaikuttaa raakapainearvoon, joten noin 25 ° C: n lämpötilan nousu 1 ° C alentaa mitattua painetta 24 Pascalia. Lämpötilaherkkyys otetaan huomioon kalibrointialgoritmissa, joten annettujen painearvojen tulee olla tarkkoja eri lämpötiloissa.

Tietolomake näyttää paineen lukemisen absoluuttisen tarkkuuden +-1 hPa lämpötilassa 0 ° C-65 ° C.

Kosteuden tarkkuus on tuoteselosteessa +-3% RH ja +-1% hysterees.

Kuinka se toimii

Lämpötilan ja paineen kalibrointitietojen 24 tavua ja myös BME280: n tapauksessa 8 tavua kosteuden kalibrointitietoja on luettava laitteesta ja tallennettava muuttujiin. Nämä tiedot on ohjelmoitu laitteeseen yksilöllisesti tehtaalla, joten eri laitteilla on eri arvot - ainakin joidenkin parametrien osalta. BME/P280 voi olla yhdessä kahdesta tilasta. Yhdessä tilassa se mittaa. Toisessa tilassa se odottaa (nukkuu).

Missä tilassa se on, voidaan tarkistaa tarkastelemalla rekisterin 0xF3 bittiä 3.

Viimeisimmän mittauksen tulokset voidaan saada milloin tahansa lukemalla vastaava data -arvo riippumatta siitä, onko laite nukkumassa vai mittaamassa.

On myös kaksi tapaa käyttää BME/P280 -laitetta. Yksi on jatkuva tila (jota kutsutaan tietolomakkeessa normaalitilaksi), joka vaihtaa toistuvasti mittaus- ja lepotilan välillä. Tässä tilassa laite suorittaa joukon mittauksia, siirtyy sitten nukkumaan, herää sitten toiseen mittaukseen ja niin edelleen. Yksittäisten mittausten lukumäärää ja jakson lepotilan kestoa voidaan hallita kokoonpanorekisterien kautta.

Toinen tapa käyttää BME/P280 -laitetta on Single Shot -tila (jota kutsutaan pakotetuksi tilaksi tietolomakkeessa). Tässä tilassa laite herätetään lepotilasta mittauskomennolla, se suorittaa joukon mittauksia ja siirtyy sitten takaisin nukkumaan. Sarjan yksittäisten mittausten määrää ohjataan laitetta herättävällä konfigurointikomennolla.

Jos BMP280: ssa tehdään yksi mittaus, arvon 16 merkittävintä bittiä täytetään ja neljä vähiten merkitsevää bittiä arvon lukemassa ovat nollia. Mittausten lukumääräksi voidaan asettaa 1, 2, 4, 8 tai 16 ja kun mittausten määrää lisätään, datalla täytettyjen bittien määrä kasvaa niin, että 16 mittauksella kaikki 20 bittiä täytetään mittaustiedolla. Tietolomakkeessa viitataan tähän prosessiin ylinäytteistyksenä.

BME280: ssa sama järjestely koskee niin kauan kuin tulosta ei suodateta. Jos käytetään suodatusta, arvot ovat aina 20 bittiä riippumatta siitä, kuinka monta mittausta kussakin mittausjaksossa otetaan.

Jokainen yksittäinen mittaus kestää noin 2 millisekuntia (tyypillinen arvo; suurin arvo on 2,3 ms). Kun tähän lisätään kiinteä noin 2 ms: n (yleensä hieman vähemmän) yleiskustannus, mittausjakso, joka voi koostua 1 - 32 yksittäisestä mittauksesta, voi kestää 4 - 66 ms.

Tietolomake sisältää joukon suositeltavia lämpötilan ja paineen ylinäytteen yhdistelmiä eri sovelluksiin.

Kokoonpanon ohjausrekisterit

BMP280: n kaksi kokoonpanonohjausrekisteriä ovat rekisteriosoitteissa 0xF4 ja 0xF5, ja ne on yhdistetty kuuteen yksittäiseen konfiguroinnin ohjausarvoon. 0xF4 koostuu:

  • 3 bittiä osrs_t (mittaa lämpötila 0, 1, 2, 4, 8 tai 16 kertaa);
  • 3 bittiä osrs_p (mittaa paine 0, 1, 2, 4, 8 tai 16 kertaa); ja
  • 2 -bittinen tila (lepotila, pakotettu (eli yksi kuva), normaali (eli jatkuva)).

0xF5 koostuu:

  • 3 bittiä t_sb (valmiusaika, 0,5 ms - 4000 ms);
  • 3 -bittinen suodatin (katso alla); ja
  • 1 -bittinen spiw_en, joka valitsee SPI: n tai I2C: n.

Suodatinparametri ohjaa eksponentiaalisen hajoamisalgoritmin tyyppiä tai Infinite Impulse Response (IIR) -suodatinta, jota käytetään raakapaineen ja lämpötilan mittausarvoihin (mutta ei kosteusarvoihin). Yhtälö on esitetty tietolomakkeessa. Toinen esitys on:

Arvo (n) = Arvo (n-1) * (K-1) / K + mittaus (n) / K

jossa (n) ilmaisee viimeisimmän mittaus- ja lähtöarvon; ja K on suodatinparametri. Suodatinparametri K ja voidaan asettaa arvoon 1, 2, 4, 8 tai 16. Jos K asetetaan arvoon 1, yhtälöstä tulee vain arvo (n) = mittaus (n). Suodatinparametrin koodaus on:

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

BME 280 lisää uuden kokoonpanonhallintarekisterin osoitteeseen 0xF2, "ctrl_hum" yhdellä 3-bittisellä parametrilla osrs_h (mittaa kosteutta 0, 1, 2, 4, 8 tai 16 kertaa).

Vaihe 4: Mittaus- ja lukuajoitus

Aion lisätä tämän myöhemmin, näyttäen komentojen ja mittausvasteiden ajoituksen.

Iddt - virta lämpötilan mittauksessa. Tyypillinen arvo 325 uA

Iddp - virta paineen mittauksessa. Tyypillinen arvo 720 uA, enintään 1120 uA

Iddsb - nykyinen valmiustilassa. Tyypillinen arvo 0,2 uA, enintään 0,5 uA

Iddsl - nykyinen lepotilassa. Tyypillinen arvo 0,1 uA, enintään 0,3 uA

Vaihe 5: Ohjelmisto -ohjeet

Ohjelmisto -ohjeet
Ohjelmisto -ohjeet
Ohjelmisto -ohjeet
Ohjelmisto -ohjeet

I2C Burst -tila

BMP280 -tietolomake sisältää ohjeita tietojen lukemisesta (osa 3.9). Siinä sanotaan: "On erittäin suositeltavaa käyttää sarjakuvausta eikä käsitellä jokaista rekisteriä erikseen. Tämä estää eri mittauksiin kuuluvien tavujen mahdollisen sekoittumisen ja vähentää käyttöliittymän liikennettä." Kompensointi-/kalibrointiparametrien lukemiseen ei anneta ohjeita. Oletettavasti nämä eivät ole ongelma, koska ne ovat staattisia eivätkä muutu.

Tämä kirjasto lukee kaikki vierekkäiset arvot yhdellä lukutoiminnolla - 24 tavua lämpötilan ja paineen kompensointiparametrien tapauksessa, 6 tavua lämpötilan ja paineen yhdistelmänä ja 8 tavua kosteuden, lämpötilan ja paineen yhdistelmänä. Kun pelkkä lämpötila tarkistetaan, luetaan vain 3 tavua.

Makrojen käyttö (#define jne.)

Tässä kirjastossa ei ole muita makroja kuin tavallinen kirjasto "include guard" -makro, joka estää päällekkäisyyden.

Kaikki vakiot määritellään konstin avainsanalla, ja virheenkorjausta tulostetaan C -vakiotoiminnoilla.

Se on aiheuttanut minulle jonkin verran epävarmuutta, mutta neuvoja, joita saan lukiessani monia tämän aiheen viestejä, on se, että #define -arvon käyttö vakioiden (ainakin) ja (luultavasti) virheenkorjauksen tulostuksen hallintaan on tarpeetonta ja ei -toivottua.

Esimerkki const: n käyttämisestä #define: n sijasta on melko selvä - const käyttää samoja resursseja kuin #define (eli nolla) ja tuloksena olevat arvot noudattavat laajuussääntöjä, mikä vähentää virheiden mahdollisuutta.

Virheenkirjoituksen tulostuksen hallinnan tapaus on hieman epäselvä, koska tapa, jolla olen tehnyt sen, tarkoittaa, että lopullinen koodi sisältää virheenkorjauspainatusten logiikan, vaikka niitä ei koskaan käytetä. Jos kirjastoa aiotaan käyttää suuressa projektissa mikrokontrollerilla, jonka muisti on rajallinen, tästä voi tulla ongelma. Koska kehitykseni tapahtui ESP8266: lla, jossa oli suuri flash -muisti, tämä ei näyttänyt olevan ongelma minulle.

Vaihe 6: Lämpötilan suorituskyky

Aion lisätä tämän myöhemmin.

Vaihe 7: Painesuorituskyky

Aion lisätä tämän myöhemmin.

Suositeltava: