Satura rādītājs:

Bibliotēka BMP280 un BME280: 7 soļi
Bibliotēka BMP280 un BME280: 7 soļi

Video: Bibliotēka BMP280 un BME280: 7 soļi

Video: Bibliotēka BMP280 un BME280: 7 soļi
Video: Lesson 30: BMP280 Temperature Sensor with LCD1602 | Arduino Step By Step Course 2024, Novembris
Anonim
Bibliotēka BMP280 un BME280
Bibliotēka BMP280 un BME280
Bibliotēka BMP280 un BME280
Bibliotēka BMP280 un BME280
Bibliotēka BMP280 un BME280
Bibliotēka BMP280 un BME280

Ievads

Es nedomāju rakstīt šo bibliotēku. Tas "notika" kā blakus efekts manam uzsāktajam projektam, kurā tiek izmantots BMP280. Šis projekts vēl nav pabeigts, bet es domāju, ka bibliotēka ir gatava dalīties ar citiem. Pēc tam man bija jāizmanto BME280, kas BMP280 spiediena un temperatūras iespējām pievieno mitruma mērījumus. BME280 ir "savietojams" ar BMP280 - tas ir, visi reģistri un darbības, kas nepieciešamas, lai nolasītu spiedienu un temperatūru no BME280, ir tādas pašas kā BMP280. Lai nolasītu mitrumu, ir nepieciešami papildu reģistri un darbības, kas attiecas tikai uz BME280. Tas rada jautājumu - viena bibliotēka abām vai divas atsevišķas bibliotēkas. Divu ierīču tipu aparatūra ir pilnībā savstarpēji aizvietojama. Pat daudzi pārdotie moduļi (piemēram, Ebay un AliExpress) ir apzīmēti ar BME/P280. Lai uzzinātu, kāda veida tas ir, jums jāaplūko (neliels) uzraksts uz sensora vai jāpārbauda ierīces ID baits. Es nolēmu meklēt vienu bibliotēku. Šķiet, ka tas ir izdevies OK.

Atsauksmes, jo īpaši visi uzlabojumu ieteikumi, tiks novērtēti.

Bibliotēkas iespējas un iespējas

Bibliotēka ir programmatūras daļa, kas programmētājam nodrošina lietojumprogrammu saskarni (API), lai tā varētu izmantot ierīces iespējas, un tai nav obligāti jārisina visas sīkās detaļas. Vēlams, lai API būtu viegli iesācējam ar vienkāršām prasībām, vienlaikus nodrošinot pilnīgu ierīces iespēju izmantošanu. Vēlams, lai bibliotēka ievērotu visas ierīces ražotāja īpašās vadlīnijas, kā arī vispārējo programmatūras labo praksi. Es esmu centies to visu sasniegt. Sākot darbu ar BMP280, es tam atradu 3 dažādas bibliotēkas: Adafruit_BMP280; Redzēts_BMP280; un vienu no ierīces ražotāja sauc par BMP280. Ne Adafruit, ne Seeed nesniedza paplašinātas iespējas, lai gan tās strādāja labi un bija viegli lietojamas pamata lietojumprogrammām. Es nevarēju saprast, kā izmantot ierīces ražotāja (Bosch Sensortec) ražoto. Tas var būt mans trūkums, nevis viņu. Tomēr bibliotēka bija daudz sarežģītāka nekā pārējās divas, es nevarēju atrast nekādus norādījumus vai lietošanas piemērus (es vēlāk atradu piemērus failā "bmp280_support.c", tomēr tie man nebija īpaši noderīgi).

Šo faktoru rezultātā es nolēmu uzrakstīt savu bibliotēku BMP280.

Aplūkojot BME280 bibliotēkas situāciju, es atradu atsevišķas bibliotēkas Adafruit_BME280, Seed_BME280 un vēl vienu BME280_MOD-1022, ko uzrakstījis Embedded Adventures. Neviens no tiem neapvienoja BMP280 funkcijas bibliotēkā, kas spēj izmantot BME280. Neviens no tiem nepārprotami neatbalstīja ierīču spēju saglabāt dažus datu bitus, kamēr ierīce un tās kontrolējošais mikroprocesors guļ (šī iespēja ir redzama datu lapā un tiek atbalstīta šeit uzrakstītajā un aprakstītajā bibliotēkā).

Kombinētajai bibliotēkai ir jāatbalsta visas BME280 iespējas, taču, ja to izmanto kopā ar BMP280, tai nevajadzētu radīt nekādas izmaksas par neizmantotajām funkcijām. Kombinētās bibliotēkas priekšrocības ietver mazāk pārvaldāmu bibliotēkas failu, vienkāršu dažādu ierīču sajaukšanu vienā projektā un vienkāršotas izmaiņas uzturēšanā vai jauninājumos, kas jāveic tikai vienā vietā, nevis divās. Tie, iespējams, ir pavisam nelieli, pat nenozīmīgi, bet…

Ierīces iespējas

BMP280 un BME280 ir uz virsmas montējamas ierīces, kuru laukums ir aptuveni 5 mm un 1 mm augsts. Ir 8 saskarnes spilventiņi, ieskaitot 2 atsevišķus barošanas ievades paliktņus un divus zemes spilventiņus. Tie ir pieejami eBay kā modulis ar 4 vai 6 tapām. Četru kontaktu modulim ir fiksēta I2C adrese, un to nevar konfigurēt izmantot SPI protokolu.

6 kontaktu moduli vai tukšo ierīci var izmantot ar I2C vai SPI protokoliem. I2C režīmā tam var būt divas dažādas adreses, kuras var sasniegt, savienojot SDO tapu vai nu ar zemi (bāzes adresei = 0x76), vai ar Vdd (bāzes adresei +1 = 0x77). SPI režīmā tam parasti ir 1 pulkstenis, 2 dati (viens katrā virzienā) un ierīces atlases tapa (CS).

Bibliotēka, kuru šeit rakstīju un aprakstīju, atbalsta tikai I2C. Bibliotēkās Adafruit_BMP280 un BME_MOD-1022 tiek atbalstīts gan i2C, gan SPI.

Bibliotēku var lejupielādēt šeit:

github.com/farmerkeith/BMP280-library

1. darbība. Aparatūras iestatīšana

Aparatūras uzstādīšana
Aparatūras uzstādīšana

Pirms bibliotēka var būt noderīga, ir jāpievieno mikrokontrolleris BMP280 (vai diviem no tiem, ja vēlaties).

Es izmantoju WeMos D1 mini pro, tāpēc es parādīšu tā savienojumus. Citi mikrokontrolleri būs līdzīgi, jums vienkārši nepieciešams pareizi savienot SDA un SCL tapas.

WeMos D1 mini pro gadījumā savienojumi ir šādi:

Funkcija WeMos pin BMP280 pin Piezīmes

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominālā 3.3V Ground GND Adreses vadība SDO Ground vai Vdd I2C select CSB Vdd (GND izvēlas SPI)

Ņemiet vērā, ka dažu MP280 moduļu SDO tapa ir apzīmēta kā SDD, un Vdd tapa var būt apzīmēta kā VCC. Piezīme: SDA un SCL līnijām starp līniju un VIN tapu jābūt pievelkamiem rezistoriem. Parasti vērtībai 4,7K jābūt OK. Dažiem BMP280 un BME280 moduļiem ir 10K pievilkšanas rezistori, kas ir iekļauti modulī (kas nav laba prakse, jo, ievietojot vairākas ierīces I2C kopnē, tā var tikt pārmērīgi noslogota). Tomēr 2 BME/P280 moduļu izmantošana ar 10K rezistoru nedrīkst būt problēma praksē, ja vien tajā pašā kopnē nav pārāk daudz citu ierīču, arī ar pievilkšanas rezistoriem.

Kad esat pievienojis aparatūru, varat viegli pārbaudīt, vai jūsu ierīce ir BMP280 vai BME280, palaižot skici I2CScan_ID, kuru varat atrast šeit:

Varat arī pārbaudīt, vai jums ir BMP280 vai BME280, apskatot pašu ierīci. Es atklāju, ka tam ir nepieciešams izmantot digitālo mikroskopu, bet, ja jūsu redze ir ļoti laba, iespējams, varēsit to izdarīt bez jebkādiem palīglīdzekļiem. Uz ierīces korpusa ir divas drukas rindas. Atslēga ir otrās rindas pirmais burts, kas BMP280 ierīču gadījumā ir "K", bet BME280 ierīču gadījumā - "U".

2. darbība. Bibliotēkas nodrošinātās API

Bibliotēkas nodrošinātās API
Bibliotēkas nodrošinātās API
Bibliotēkas nodrošinātās API
Bibliotēkas nodrošinātās API

Bibliotēkas iekļaušana skicē

Bibliotēka ir iekļauta skicē standarta veidā, izmantojot paziņojumu

#include "farmerkeith_BMP280.h"

Šis paziņojums ir jāiekļauj skices agrīnajā daļā pirms iestatīšanas () funkcijas sākuma.

BME vai BMP programmatūras objekta izveide

Programmatūras objekta BMP280 izveidei ir 3 līmeņi. Vienkāršākais ir tikai

bme280 objectName; vai bmp280 objectName;

piemēram, BMP280 bmp0;

Tādējādi tiek izveidots programmatūras objekts ar noklusējuma adresi 0x76 (ti, zemei pieslēgtam SDO).

Nākamajam programmatūras objekta BME280 vai BMP280 izveides līmenim ir parametrs 0 vai 1, kā norādīts tālāk.

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parametrs (0 vai 1) tiek pievienots I2C bāzes adresei, lai vienā un tajā pašā I2C kopnē (ieskaitot vienu no tām) varētu izmantot divas BME280 vai BMP280 ierīces.

Trešajam BME vai BMP280 programmatūras objekta izveides līmenim ir divi parametri. Pirmais parametrs, kas ir 0 vai 1, ir adrese, tāpat kā iepriekšējā gadījumā. Otrais parametrs kontrolē atkļūdošanas drukāšanu. Ja tas ir iestatīts uz 1, katrs darījums ar programmatūras objektu rada Serial.print izvadi, kas ļauj programmētājam redzēt darījuma detaļas. Piemēram:

bmp280 objectNameB (1, 1);

Ja atkļūdošanas drukāšanas parametrs ir iestatīts uz 0, programmatūras objekts atgriežas normālā darbībā (bez drukāšanas).

Šis paziņojums vai apgalvojumi ir jāiekļauj aiz funkcijas #include un pirms setup ().

BME vai BMP programmatūras objekta inicializēšana

Pirms lietošanas ir jānolasa ierīces kalibrēšanas parametri un jākonfigurē tas jebkuram mērīšanas režīmam, pārmērīga paraugu ņemšana un filtra iestatījumi.

Vienkāršai vispārēja inicializēšanai paziņojums ir šāds:

objectName.begin ();

Šī sākuma () versija no ierīces nolasa kalibrēšanas parametrus un nosaka osrs_t = 7 (16 temperatūras mērījumi), osrs_p = 7 (16 spiediena mērījumi), režīms = 3 (nepārtraukts, normāls), t_sb = 0 (miega režīms starp 0,5 ms mērījumu kopas), filtrs = 0 (K = 1, tāpēc nav filtrēšanas) un spiw_en = 0 (SPI atspējots, tāpēc izmantojiet I2C). Attiecībā uz BME280 16 mitruma mērījumiem ir papildu parametrs osrs_h = 7.

Ir vēl viena sākuma () versija, kas ietver visus sešus (vai 7) parametrus. Iepriekš minētā apgalvojuma ekvivalents ir

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

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

Pilns kodu un to nozīmju saraksts ir datu lapā BME280 un BMP280, kā arī bibliotēkas.cpp faila komentāros.

Vienkārša temperatūras un spiediena mērīšana

Vienkāršākais veids, kā izmērīt temperatūru

dubultā temperatūra = objectName.readTemperature (); // mērīt temperatūru

Vienkāršākais veids, kā izmērīt spiedienu

dubultspiediens = objectName.readPressure (); // izmērīt spiedienu

Vienkāršākais veids ir mitruma mērīšana

dubults mitrums = objectName.readHumidity (); // mitruma mērīšana (tikai BME280)

Lai iegūtu gan temperatūru, gan spiedienu, iepriekš minētos divus apgalvojumus var izmantot viens pēc otra, taču ir vēl viena iespēja:

dubultā temperatūra;

dubultspiediens = objektaNosaukums.lastspiediens (temperatūra); // izmērīt spiedienu un temperatūru

Šis paziņojums no BME280 vai BMP280 ierīces datus nolasa tikai vienu reizi un atgriež gan temperatūru, gan spiedienu. Tas ir nedaudz efektīvāk izmantot I2C kopni un nodrošina, ka abi rādījumi atbilst vienam mērījumu ciklam.

Attiecībā uz BME 280 kombinētais paziņojums, kas iegūst visas trīs vērtības (mitrums, temperatūra un spiediens), ir šāds:

dubultā temperatūra, spiediens; divkāršs mitrums = objectName.readHumidity (temperatūra, spiediens); // mēra mitrumu, spiedienu un temperatūru

Šis paziņojums no BMP280 ierīces datus nolasa tikai vienu reizi un atgriež visas trīs vērtības. Tas ir nedaudz efektīvāk izmantot I2C kopni un nodrošina, ka trīs rādījumi atbilst vienam mērījumu ciklam. Ņemiet vērā, ka mainīgo nosaukumus var mainīt uz visu, kas lietotājam patīk, taču to secība ir fiksēta - vispirms ir temperatūra, bet otrajā - spiediens.

Šie lietošanas gadījumi ir apskatīti bibliotēkas komplektā iekļautajās skicēs, kas ir basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino un basicHumidityAndTemperatureAndPressure.ino.

Sarežģītāka temperatūras un spiediena mērīšana

Lai gan iepriekš minētā paziņojumu sērija darbosies bez problēmām, ir dažas problēmas:

  1. ierīce darbojas nepārtraukti, tāpēc patērē maksimālo jaudu. Ja enerģija nāk no akumulatora, var būt nepieciešams to samazināt.
  2. patērētās jaudas dēļ ierīce piedzīvos sasilšanu, un tāpēc izmērītā temperatūra būs augstāka par apkārtējās vides temperatūru. Es to sīkāk aprakstīšu vēlāk.

Rezultātu, kas patērē mazāk enerģijas un nodrošina temperatūru, kas ir tuvāka apkārtējai videi, var iegūt, izmantojot start () ar parametriem, kas to iemidzina (piemēram, režīms = 0). Piemēram:

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

Tad, kad vēlaties veikt mērījumu, pamodiniet ierīci ar konfigurācijas komandu, lai reģistrētu F2 (ja nepieciešams) un F4, kas nosaka atbilstošās osrs_h, osrs_t un osrs_p vērtības, plus režīms = 1 (viena kadra režīms). Piemēram:

[objectName.updateF2Control (1);] // osrs_h - nekad nav nepieciešams BMP280, // un nav nepieciešams BME280, ja mērījumu skaits netiek mainīts // no sākuma () norādītās vērtības. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Pēc ierīces pamodināšanas tā sāks mērīšanu, bet rezultāts nebūs pieejams dažām milisekundēm - vismaz 4 ms, varbūt līdz 70 ms vai vairāk, atkarībā no norādīto mērījumu skaita. Ja lasīšanas komanda tiek nosūtīta nekavējoties, ierīce atgriezīs iepriekšējā mērījuma vērtības - kas dažās lietojumprogrammās var būt pieņemamas, taču vairumā gadījumu, iespējams, labāk ir atlikt, līdz būs pieejams jaunais mērījums.

Šo kavēšanos var veikt vairākos veidos.

  1. pagaidiet noteiktu laiku, lai segtu visilgāko paredzamo kavēšanos
  2. pagaidiet laiku, kas aprēķināts no maksimālā mērīšanas laika vienam mērījumam (ti, 2,3 ms), kas reizināts ar mērījumu skaitu, pieskaitot pieskaitāmās izmaksas, kā arī rezervi.
  3. pagaidiet īsāku laiku, kas aprēķināts, kā aprakstīts iepriekš, bet izmantojot nominālo mērīšanas laiku (ti, 2 ms) plus pieskaitāmās izmaksas, un tad sāciet pārbaudīt statusa reģistra bitu "Es mēra". Kad statusa bits rāda 0 (ti, nemēra), iegūstiet temperatūras un spiediena rādījumus.
  4. nekavējoties sāciet pārbaudīt statusa reģistru un iegūstiet temperatūras un spiediena rādījumus, kad statusa bits nolasa 0,

Nedaudz vēlāk parādīšu piemēru, kā to izdarīt.

Konfigurācijas reģistra darbības

Lai tas viss notiktu, mums ir vajadzīgi vairāki rīki, kurus es vēl neesmu iepazīstinājis. Viņi ir:

baitu lasīšana Reģistrēties (reg)

void updateRegister (reģ, vērtība)

Katram no tiem bibliotēkā ir vairākas atvasinātas komandas, kas padara programmatūru noteiktām darbībām nedaudz vienkāršāku.

PowerSaverPressureAndTemperature.ino piemērā tiek izmantota metode Nr. 3. Koda rinda, kas veic atkārtotu pārbaudi, ir

kamēr (bmp0.readRegister (0xF3) >> 3); // cilpa untl F3bit 3 == 0

Ņemiet vērā, ka šī skice ir paredzēta ESP8266 mikrokontrolleram. Es izmantoju WeMos D1 mini pro. Skice nedarbosies ar Atmega mikrokontrolleriem, kuriem ir dažādi norādījumi par gulēšanu. Šī skice izpilda vairākas citas komandas, tāpēc es iepazīstināšu ar tām visām, pirms sīkāk aprakstīšu šo skici.

Kad mikrokontrolleris guļ paralēli BMP280 sensoram, sensora konfigurāciju nepieciešamajiem mērījumiem var veikt komandā start (), izmantojot 6 parametrus. Tomēr, ja mikrokontrolleris neguļ, bet sensors ir, tad mērīšanas laikā sensors ir jāatmodina un jāpasaka tā mērījumu konfigurācija. To var izdarīt tieši ar

updateRegister (reģ, vērtība)

bet ir nedaudz vieglāk, izmantojot šādas trīs komandas:

updateF2Control (osrs_h); // tikai BME280

updateF4Control (osrs_t, osrs_p, režīms); updateF5Config (t_sb, filtrs, spi3W_en);

Ja pēc mērījuma veikšanas tiek izmantots viens kadrs (piespiedu režīms), ierīce automātiski atgriežas miega režīmā. Tomēr, ja mērījumu kopa ietver vairākus mērījumus, izmantojot nepārtrauktu (normālu) režīmu, tad BMP280 būs jāatliek gulēt. To var izdarīt ar vienu no divām komandām:

updateF4Control16xSleep ();

updateF4ControlSleep (vērtība);

Abi šie iestatīja režīma bitus uz 00 (ti, miega režīmu). Tomēr pirmais nosaka osrs_t un osrs_p uz 111 (ti, 16 mērījumi), bet otrais saglabā zemos 6 bitus no "vērtības" 0xF4 reģistra bitos 7: 2.

Līdzīgi šāds paziņojums saglabā zemos sešus "vērtības" bitus 0xF5 reģistra bitos 7: 2.

updateF5ConfigSleep (vērtība);

Šo pēdējo komandu izmantošana ļauj uzglabāt 12 bitus informācijas BMP280 reģistros F4 un F5. Vismaz ESP8266 gadījumā, kad mikrokontrolleris pamostas pēc miega perioda, tas sākas skices sākumā, nezinot tās stāvokli pirms miega komandas. Lai saglabātu zināšanas par tā stāvokli pirms miega režīma, datus var saglabāt zibatmiņā, izmantojot vai nu EEPROM funkcijas, vai rakstot failu, izmantojot SPIFFS. Tomēr zibatmiņas ierakstīšanas ciklu skaits ir ierobežots, aptuveni 10 000 līdz 100 000. Tas nozīmē, ka, ja mikrokontrolleris ik pēc dažām sekundēm iziet miega un pamošanās ciklā, tas var pārsniegt pieļaujamo atmiņas rakstīšanu. ierobežot dažu mēnešu laikā. Dažu datu bitu saglabāšanai BMP280 nav šādu ierobežojumu.

F4 un F5 reģistros saglabātos datus var atgūt, kad mikrokontrolleris pamostas, izmantojot komandas

readF4Sleep ();

readF5Sleep ();

Šīs funkcijas nolasa atbilstošo reģistru, pārvieto saturu, lai noņemtu 2 LSB un atdotu atlikušos 6 bitus. Šīs funkcijas tiek izmantotas parauga skices powerSaverPressureAndTemperatureESP.ino šādā veidā:

// nolasīt EventCounter vērtību no bmp0

baits bmp0F4value = bmp0.readF4Sleep (); // no 0 līdz 63 baitiem bmp0F5value = bmp0.readF5Sleep (); // no 0 līdz 63 eventCounter = bmp0F5value*64+bmp0F4value; // no 0 līdz 4095

Šīs funkcijas nolasa atbilstošo reģistru, pārvieto saturu, lai noņemtu 2 LSB un atdotu atlikušos 6 bitus. Šīs funkcijas tiek izmantotas parauga skices powerSaverPressureAndTemperature.ino šādā veidā:

// nolasīt EventCounter vērtību no bmp1

baits bmp1F4value = bmp1.readF4Sleep (); // no 0 līdz 63 baitiem bmp1F5value = bmp1.readF5Sleep (); // no 0 līdz 63 eventCounter = bmp1F5value*64+bmp1F4value; // no 0 līdz 4095

Neapstrādātas temperatūras un spiediena funkcijas

Pamata lasīšanas temperatūras, nolasīšanas spiediena un nolasīšanas mitruma funkcijām ir divas sastāvdaļas. Vispirms neapstrādātas 20 bitu temperatūras un spiediena vērtības tiek iegūtas no BME/P280 vai neapstrādātas 16 bitu mitruma vērtības tiek iegūtas no BME280. Pēc tam tiek izmantots kompensācijas algoritms, lai ģenerētu izejas vērtības grādos pēc Celsija, hPa vai %RH.

Bibliotēka šīm sastāvdaļām nodrošina atsevišķas funkcijas, lai varētu iegūt neapstrādātus temperatūras, spiediena un mitruma datus un, iespējams, kaut kādā veidā tos manipulēt. Tiek sniegts arī algoritms temperatūras, spiediena un mitruma noteikšanai no šīm neapstrādātajām vērtībām. Bibliotēkā šie algoritmi tiek ieviesti, izmantojot dubultā garuma peldošā komata aritmētiku. Tas labi darbojas ar ESP8266, kas ir 32 bitu procesors un izmanto 64 bitus "dubultiem" pludiņa mainīgajiem. Šo funkciju pieejamība var būt noderīga, lai novērtētu un, iespējams, mainītu citu platformu aprēķinus.

Šīs funkcijas ir:

readRawPressure (neapstrādāta temperatūra); // nolasa neapstrādātus spiediena un temperatūras datus no BME/P280readRawHumidity (rawTemperature, rawPressure); // nolasa neapstrādāta mitruma, temperatūras un spiediena datus no BME280 calcTemperature (rawTemperature, t_fine); calcPressure (neapstrādātspiediens, t_smalks); calcHumidity (rawHumidity, t_fine)

Arguments "t-fine" šīm funkcijām ir mazliet paskaidrojuma vērts. Gan spiediena, gan mitruma kompensācijas algoritmi ietver no temperatūras atkarīgu komponentu, kas tiek panākts, izmantojot mainīgo t_fine. Funkcija calcTemperature raksta vērtību t_fine, pamatojoties uz temperatūras kompensācijas algoritma loģiku, kuru pēc tam izmanto kā ievadi gan calcPressure, gan calcHumidity.

Šo funkciju izmantošanas piemērs ir atrodams skices rawPressureAndTemperature.ino skices piemērā, kā arī bibliotēkas.cpp faila funkcijas readHumidity () kodā.

Augstums un jūras līmeņa spiediens

Ir zināma saistība starp atmosfēras spiedienu un augstumu. Spiedienu ietekmē arī laika apstākļi. Kad laika apstākļu organizācijas publicē informāciju par atmosfēras spiedienu, tās parasti pielāgo to augstumam, tāpēc "sinoptiskā diagramma" parāda izobarus (pastāvīga spiediena līnijas), kas standartizētas vidējam jūras līmenim. Tātad patiesībā šajās attiecībās ir 3 vērtības, un, zinot divas no tām, var iegūt trešo. 3 vērtības ir šādas:

  • augstums virs jūras līmeņa
  • faktiskais gaisa spiediens šajā augstumā
  • līdzvērtīgs gaisa spiediens jūras līmenī (stingrāk - vidējais jūras līmenis, jo tūlītējais jūras līmenis pastāvīgi mainās)

Šī bibliotēka šīm attiecībām nodrošina divas funkcijas:

calcAltitude (spiediens, jūras līmenis);

calcNormalized Pressure (spiediens, augstums);

Ir arī vienkāršota versija, kas pieņem standarta jūras līmeņa spiedienu 1013,15 hPa.

calcAltitude (spiediens); // standarta seaLevelPieņemts spiediens

3. darbība. Informācija par ierīci BMP280

Informācija par ierīci BMP280
Informācija par ierīci BMP280

Aparatūras iespējas

BMP280 ir 2 baiti konfigurācijas datu (reģistra adresēs 0xF4 un 0xF5), ko izmanto, lai kontrolētu vairākas mērīšanas un datu izvades iespējas. Tas arī nodrošina 2 bitu statusa informāciju un 24 baitus kalibrēšanas parametrus, kas tiek izmantoti neapstrādātas temperatūras un spiediena vērtību pārvēršanai parastajās temperatūras un spiediena vienībās. BME280 ir šādi papildu dati:

  • 1 papildu baits konfigurācijas datu reģistra adresē 0xF2, ko izmanto, lai kontrolētu vairākus mitruma mērījumus;
  • 8 papildu baiti kalibrēšanas parametru, ko izmanto, lai neapstrādāto mitruma vērtību pārvērstu relatīvā mitruma procentos.

Temperatūras, spiediena un statusa reģistri BME280 ir tādi paši kā BMP280 ar nelieliem izņēmumiem:

  • BME280 "ID" biti ir iestatīti uz 0x60, tāpēc tos var atšķirt no BMP280, kas var būt 0x56, 0x57 vai 0x58
  • miega laika kontrole (t_sb) tiek mainīta tā, ka BMP280 divi garie laiki (2000 ms un 4000 ms) tiek aizstāti ar BME280 ar īsu laiku 10 ms un 20 ms. Maksimālais miega laiks BME280 ir 1000 ms.
  • BME280 temperatūrā un spiedienā neapstrādātas vērtības vienmēr ir 20 biti, ja tiek izmantota filtrēšana. 16 līdz 19 bitu vērtību izmantošana ir ierobežota gadījumos, kad nav filtrēšanas (ti, filtrs = 0).

Temperatūra un spiediens ir 20 bitu vērtības, kuras jāpārvērš parastajā temperatūrā un spiedienā, izmantojot diezgan sarežģītu algoritmu, izmantojot 3 16 bitu kalibrēšanas parametrus temperatūrai un 9 16 bitu kalibrēšanas parametrus plus spiediena temperatūru. Temperatūras mērījuma granularitāte ir 0,0003 grādi pēc Celsija vismazāk nozīmīgām bitu izmaiņām (20 bitu nolasījums), palielinoties līdz 0,0046 grādiem pēc Celsija, ja tiek izmantots 16 bitu rādījums.

Mitrums ir 16 bitu vērtība, kas jāpārvērš relatīvajā mitrumā, izmantojot citu sarežģītu algoritmu, izmantojot 6 kalibrēšanas parametrus, kas sastāv no 8, 12 un 16 bitiem.

Datu lapa parāda absolūtu temperatūras nolasījuma precizitāti kā +-0,5 C pie 25 C un +-1 C diapazonā no 0 līdz 65 C.

Spiediena mērījumu precizitāte ir 0,15 Pascals (ti, 0,0015 hectoPascals) pie 20 bitu izšķirtspējas vai 2,5 Pascals ar 16 bitu izšķirtspēju. Neapstrādāta spiediena vērtību ietekmē temperatūra, tāpēc ap 25 ° C, temperatūras paaugstināšanās par 1 ° C samazina izmērīto spiedienu par 24 Paskaliem. Temperatūras jutība tiek ņemta vērā kalibrēšanas algoritmā, tāpēc norādītajām spiediena vērtībām jābūt precīzām dažādās temperatūrās.

Datu lapa parāda absolūtu spiediena rādījuma precizitāti kā +-1 hPa temperatūrai no 0 C līdz 65 C.

Mitruma precizitāte datu lapā ir norādīta kā +-3% RH un +-1% histerēze.

Kā tas strādā

24 baiti temperatūras un spiediena kalibrēšanas datiem, kā arī BME280 gadījumā 8 baiti mitruma kalibrēšanas dati ir jānolasa no ierīces un jāsaglabā mainīgajos. Šie dati ir individuāli ieprogrammēti ierīcē rūpnīcā, tāpēc dažādām ierīcēm ir atšķirīgas vērtības - vismaz dažiem parametriem. BME/P280 var būt vienā no diviem stāvokļiem. Vienā stāvoklī tas tiek mērīts. Citā stāvoklī tas gaida (guļ).

Kādā stāvoklī tas ir, var pārbaudīt, apskatot reģistra 0xF3 3. bitu.

Jaunākā mērījuma rezultātus var iegūt jebkurā laikā, nolasot atbilstošo datu vērtību neatkarīgi no tā, vai ierīce guļ vai veic mērījumus.

Ir arī divi BME/P280 darbības veidi. Viens no tiem ir nepārtraukts režīms (datu lapā to sauc par parasto režīmu), kas atkārtoti pārslēdzas starp mērīšanas un miega stāvokli. Šajā režīmā ierīce veic mērījumu kopumu, pēc tam iet gulēt, pēc tam pamostas citam mērījumu kopumam utt. Individuālo mērījumu skaitu un cikla miega daļas ilgumu var kontrolēt, izmantojot konfigurācijas reģistrus.

Otrs BME/P280 darbības veids ir viena kadra režīms (datu lapā to sauc par piespiedu režīmu). Šajā režīmā ierīce tiek pamodināta no miega ar komandu mērīt, tā veic mērījumu kopumu un pēc tam atkal atgriežas miega režīmā. Atsevišķu mērījumu skaits komplektā tiek kontrolēts konfigurācijas komandā, kas pamodina ierīci.

Ja BMP280 tiek veikts viens mērījums, tiek aizpildīti 16 nozīmīgākie vērtības biti, un četri vismazāk nozīmīgie biti vērtības nolasījumā ir nulles. Mērījumu skaitu var iestatīt uz 1, 2, 4, 8 vai 16, un, palielinoties mērījumu skaitam, palielinās ar datiem aizpildīto bitu skaits, lai ar 16 mērījumiem visi 20 biti tiktu aizpildīti ar mērījumu datiem. Datu lapa šo procesu apzīmē kā pārmērīgu paraugu ņemšanu.

BME280 tiek izmantota tāda pati kārtība, kamēr rezultāts netiek filtrēts. Ja tiek izmantota filtrēšana, vērtības vienmēr ir 20 biti neatkarīgi no tā, cik mērījumu tiek veikti katrā mērījumu ciklā.

Katrs atsevišķs mērījums ilgst aptuveni 2 milisekundes (tipiska vērtība; maksimālā vērtība ir 2,3 ms). Pievienojot tam fiksētu pieskaitāmo summu aptuveni 2 ms (parasti nedaudz mazāk), tas nozīmē, ka mērījumu secība, kas var sastāvēt no 1 līdz 32 atsevišķiem mērījumiem, var ilgt no 4 ms līdz 66 ms.

Datu lapa piedāvā ieteicamo temperatūras un spiediena pārsniegšanas paraugu kombināciju kopumu dažādiem lietojumiem.

Konfigurācijas kontroles reģistri

Abi konfigurācijas vadības reģistri BMP280 atrodas reģistra adresēs 0xF4 un 0xF5, un tie ir kartēti uz 6 atsevišķām konfigurācijas vadības vērtībām. 0xF4 sastāv no:

  • 3 biti osrs_t (mēra temperatūru 0, 1, 2, 4, 8 vai 16 reizes);
  • 3 biti osrs_p (mēra spiedienu 0, 1, 2, 4, 8 vai 16 reizes); un
  • 2 bitu režīms (miega režīms, piespiedu (ti, viens kadrs), normāls (ti, nepārtraukts)).

0xF5 sastāv no:

  • 3 biti t_sb (gaidīšanas laiks, no 0,5 ms līdz 4000 ms);
  • 3 bitu filtrs (skatīt zemāk); un
  • 1 bits spiw_en, kas izvēlas SPI vai I2C.

Filtra parametrs kontrolē eksponenciālas samazināšanās algoritma veidu vai bezgalīgas impulsa reakcijas (IIR) filtru, kas tiek lietots neapstrādātā spiediena un temperatūras mērījumu vērtībām (bet ne mitruma vērtībām). Vienādojums ir norādīts datu lapā. Vēl viena prezentācija ir šāda:

Vērtība (n) = Vērtība (n-1) * (K-1) / K + mērījums (n) / K

kur (n) norāda jaunāko mērījumu un izvades vērtību; un K ir filtra parametrs. Filtra parametrs K un to var iestatīt uz 1, 2, 4, 8 vai 16. Ja K ir iestatīts uz 1, vienādojums vienkārši kļūst par vērtību (n) = mērījumu (n). Filtra parametra kodējums ir šāds:

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

BME 280 pievieno papildu konfigurācijas kontroles reģistru adresē 0xF2 "ctrl_hum" ar vienu 3 bitu parametru osrs_h (mitruma mērīšana 0, 1, 2, 4, 8 vai 16 reizes).

4. solis: mērīšanas un nolasīšanas laiks

Es plānoju to pievienot vēlāk, parādot komandu un mērījumu atbilžu laiku.

Iddt - strāva temperatūras mērījumos. Tipiskā vērtība 325 uA

Iddp - strāva pie spiediena mērīšanas. Tipiskā vērtība 720 uA, maks. 1120 uA

Iddsb - pašreizējais gaidīšanas režīmā. Tipiskā vērtība 0,2 uA, maks. 0,5 uA

Iddsl - pašreizējais miega režīmā. Tipiskā vērtība 0,1 uA, maks. 0,3 uA

5. darbība. Programmatūras vadlīnijas

Programmatūras vadlīnijas
Programmatūras vadlīnijas
Programmatūras vadlīnijas
Programmatūras vadlīnijas

I2C sērijveida sērijas režīms

BMP280 datu lapa sniedz norādījumus par datu nolasīšanu (3.9. Sadaļa). Tajā teikts: "ir ļoti ieteicams izmantot sērijveida lasīšanu, nevis adresēt katru reģistru atsevišķi. Tas novērsīs iespējamu dažādu mērījumu baitu sajaukšanos un samazinās saskarnes trafiku." Nav sniegti norādījumi par kompensācijas/kalibrēšanas parametru nolasīšanu. Jādomā, ka tie nav problēma, jo tie ir statiski un nemainās.

Šī bibliotēka nolasa visas blakus esošās vērtības vienā lasīšanas operācijā - 24 baiti temperatūras un spiediena kompensācijas parametru gadījumā, 6 baiti temperatūras un spiediena kombinācijai kopā un 8 baiti mitrumam, temperatūrai un spiedienam kopā. Pārbaudot tikai temperatūru, tiek nolasīti tikai 3 baiti.

Makro izmantošana (#define utt.)

Šajā bibliotēkā nav neviena makro, izņemot parasto bibliotēku "include guard", kas novērš dublēšanos.

Visas konstantes tiek definētas, izmantojot atslēgvārdu const, un atkļūdošanas drukāšanu kontrolē ar standarta C funkcijām.

Tas man ir radījis zināmu neskaidrību, taču padoms, ko saņemu, lasot daudzus ziņojumus par šo tēmu, ir tāds, ka #define izmantošana konstantu deklarēšanai (vismaz) un (iespējams) atkļūdošanas drukas kontrolei ir nevajadzīga un nevēlama.

Konstitu, nevis #define izmantošanas gadījums ir diezgan skaidrs - const izmanto tādus pašus resursus kā #define (ti, nulle), un iegūtās vērtības atbilst tvēruma noteikšanas noteikumiem, tādējādi samazinot kļūdu iespējamību.

Atkļūdošanas drukāšanas kontroles gadījums ir nedaudz mazāk skaidrs, jo tas, kā es to darīju, nozīmē, ka gala kods satur atkļūdošanas drukāšanas paziņojumu loģiku, lai gan tie nekad netiek izmantoti. Ja bibliotēka tiks izmantota lielā projektā ar mikrokontrolleri ar ļoti ierobežotu atmiņu, tas var kļūt par problēmu. Tā kā mana izstrāde notika ar ESP8266 ar lielu zibatmiņu, tas man nešķita problēma.

6. solis: Temperatūras veiktspēja

Šo es plānoju pievienot vēlāk.

7. solis: spiediena veiktspēja

Šo es plānoju pievienot vēlāk.

Ieteicams: