Obsah:

Knižnica pre BMP280 a BME280: 7 krokov
Knižnica pre BMP280 a BME280: 7 krokov

Video: Knižnica pre BMP280 a BME280: 7 krokov

Video: Knižnica pre BMP280 a BME280: 7 krokov
Video: Урок 96: Датчик атмосферного давления, температуры, приблизительной высоты BMP390 с ЖК-дисплеем 2024, Júl
Anonim
Knižnica pre BMP280 a BME280
Knižnica pre BMP280 a BME280
Knižnica pre BMP280 a BME280
Knižnica pre BMP280 a BME280
Knižnica pre BMP280 a BME280
Knižnica pre BMP280 a BME280

Úvod

Neplánoval som sa napísať túto knižnicu. „Stalo sa to“ako vedľajší účinok projektu, ktorý som zahájil a ktorý používa BMP280. Tento projekt ešte nie je dokončený, ale myslím si, že knižnica je pripravená podeliť sa s ostatnými. Následne som mal potrebu použiť BME280, ktorý pridáva meranie vlhkosti k tlaku a teplotným schopnostiam BMP280. BME280 je „spätne kompatibilný“s BMP280 - to znamená, že všetky registre a kroky potrebné na čítanie tlaku a teploty z BME280 sú rovnaké ako tie, ktoré sa používajú pre BMP280. Na čítanie vlhkosti sú potrebné ďalšie registre a kroky, ktoré sa vzťahujú iba na BME280. Tu vyvstáva otázka, jedna knižnica pre obe alebo dve samostatné knižnice. Hardvér pre tieto dva typy zariadení je plne zameniteľný. Dokonca aj mnohé predávané moduly (napríklad na serveroch Ebay a AliExpress) sú označené BME/P280. Ak chcete zistiť, o aký typ sa jedná, musíte sa pozrieť na (miniatúrny) nápis na samotnom snímači alebo otestovať bajt zariadenia. Rozhodol som sa ísť do jednej knižnice. Zdá sa, že to fungovalo dobre.

Oceníme spätnú väzbu, najmä akékoľvek návrhy na vylepšenia.

Vlastnosti a možnosti knižnice

Knižnica je softvér, ktorý poskytuje programovaciemu rozhraniu (Application Programming Interface) (API) programátorovi využitie schopností zariadenia bez toho, aby sa nutne musel zaoberať všetkými jemnými detailmi. Je žiaduce, aby API bolo pre začiatočníka jednoduché, aby mohli začať s jednoduchými požiadavkami, a zároveň by malo poskytovať úplné využitie možností zariadenia. Je žiaduce, aby knižnica dodržiavala akékoľvek konkrétne pokyny od výrobcu zariadenia a všeobecné osvedčené postupy pre softvér. Toto všetko som sa snažil dosiahnuť. Keď som začínal s BMP280, našiel som preň 3 rôzne knižnice: Adafruit_BMP280; Seeed_BMP280; a jeden s názvom BMP280 od výrobcu zariadenia. Adafruit ani Seeed neposkytovali rozšírené možnosti, aj keď fungovali dobre a ľahko sa používali v základných aplikáciách. Nechápal som, ako používať ten, ktorý vyrobil výrobca zariadenia (Bosch Sensortec). Toto môže byť môj nedostatok, nie ich. Knižnica však bola oveľa komplikovanejšia ako ostatné dve, nenašiel som žiadne pokyny ani príklady použitia (príklady som neskôr našiel v súbore „bmp280_support.c“, tieto však pre mňa neboli nijako zvlášť nápomocné).

V dôsledku týchto faktorov som sa rozhodol napísať vlastnú knižnicu pre BMP280.

Pri pohľade na situáciu v knižnici pre BME280 som našiel samostatné knižnice Adafruit_BME280, Seed_BME280 a ďalšiu BME280_MOD-1022 od spoločnosti Embedded Adventures. Žiadny z nich nekombinoval funkcie pre BMP280 v knižnici, ktorá dokáže používať BME280. Žiadny z nich výslovne nepodporoval schopnosť zariadení uložiť niekoľko bitov údajov, keď zariadenie a jeho riadiaci mikroprocesor spia (táto schopnosť je evidentná v technickom liste a podporovaná v knižnici, ktorú som tu napísal a popísal).

Kombinovaná knižnica by mala mať podporu pre všetky možnosti BME280, ale pri použití s BMP280 by nemala znamenať žiadne režijné náklady na nepoužívané funkcie. Medzi výhody kombinovanej knižnice patrí menej súborov knižnice, ktoré je možné spravovať, ľahké kombinovanie rôznych zariadení v jednom projekte a zjednodušené zmeny údržby alebo aktualizácií, ktoré je potrebné vykonať iba na jednom mieste a nie na dvoch. Všetky sú pravdepodobne dosť malé, dokonca bezvýznamné, ale …

Možnosti zariadenia

BMP280 a BME280 sú zariadenia na povrchovú montáž asi 5 mm štvorcových a 1 mm vysoké. K dispozícii je 8 podložiek rozhrania, z toho 2 samostatné vstupy napájania a dve podložky Ground. Sú k dispozícii na eBay ako modul so 4 alebo 6 vyvedenými pinmi. 4-pinový modul má pevnú adresu I2C a nemožno ho nakonfigurovať na používanie protokolu SPI.

6-kolíkový modul alebo holé zariadenie je možné použiť s protokolmi I2C alebo SPI. V režime I2C môže mať dve rôzne adresy, dosiahnuté pripojením kolíka SDO buď k zemi (pre základnú adresu = 0x76) alebo k Vdd (pre základnú adresu +1 = 0x77). V režime SPI má obvyklé usporiadanie 1 hodín, 2 dát (jeden pre každý smer) a pin na výber zariadenia (CS).

Knižnica, ktorú som tu napísal a popísal, podporuje iba I2C. Knižnice Adafruit_BMP280 a BME_MOD-1022 majú podporu i2C aj SPI.

Knižnicu je možné stiahnuť tu:

github.com/farmerkeith/BMP280-library

Krok 1: Nastavenie hardvéru

Nastavenie hardvéru
Nastavenie hardvéru

Aby mohla byť knižnica užitočná, je potrebné k BMP280 (alebo ak chcete, dvom z nich) pripojiť mikrokontrolér.

Použil som WeMos D1 mini pro, takže ukážem jeho súvislosti. Ostatné mikrokontroléry budú podobné, stačí správne pripojiť piny SDA a SCL.

V prípade WeMos D1 mini pro sú tieto pripojenia:

Funkcia Kolík WeMos Kolík BMP280 Poznámky

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin nominálna 3,3 V uzemnenie GND Adresovanie SDO uzemnenie alebo Vdd I2C vyberte CSB Vdd (GND vyberie SPI)

Všimnite si toho, že pin SDO na niektorých moduloch MP280 je označený SDD a pin Vdd môže byť označený ako VCC. Poznámka: Vedenia SDA a SCL by mali mať medzi vedením a kolíkom Vin zdvíhacie odpory. Obvykle by mala byť hodnota 4,7 kB v poriadku. Niektoré moduly BMP280 a BME280 majú v module zabudované odpory 10K (čo nie je správna prax, pretože umiestnenie viacerých zariadení na zbernicu I2C ju môže nadmerne zaťažovať). Použitie 2 modulov BME/P280 s 10K odporom by však v praxi nemal byť problém, pokiaľ na tej istej zbernici nie je príliš veľa ďalších zariadení, ktoré majú tiež výsuvné odpory.

Keď máte pripojený hardvér, môžete jednoducho skontrolovať, či je vaše zariadenie BMP280 alebo BME280, spustením náčrtu I2CScan_ID, ktorý nájdete tu:

Môžete tiež skontrolovať, či máte BMP280 alebo BME280, a to tak, že sa pozriete na samotné zariadenie. Považoval som za nevyhnutné použiť na to digitálny mikroskop, ale ak máte veľmi dobrý zrak, možno to zvládnete aj bez pomôcok. Na puzdre zariadenia sú dva riadky tlače. Kľúčové je prvé písmeno na druhom riadku, ktoré je v prípade zariadení BMP280 „K“a v prípade zariadení BME280 „U“.

Krok 2: Rozhrania API poskytované knižnicou

API poskytované knižnicou
API poskytované knižnicou
API poskytované knižnicou
API poskytované knižnicou

Vrátane knižnice v náčrte

Knižnica je zahrnutá do náčrtu štandardným spôsobom pomocou príkazu

#include "farmerkeith_BMP280.h"

Toto tvrdenie musí byť zahrnuté v ranej časti náčrtu pred spustením funkcie setup ().

Vytvorenie softvérového objektu BME alebo BMP

Na vytvorenie softvérového objektu BMP280 existujú 3 úrovne. Najjednoduchšie je práve

bme280 objectName; alebo bmp280 objectName;

napríklad BMP280 bmp0;

Tým sa vytvorí softvérový objekt s predvolenou adresou 0x76 (tj. Pre SDO pripojené k zemi).

Ďalšia úroveň na vytvorenie softvérového objektu BME280 alebo BMP280 má parameter 0 alebo 1, a to nasledovne:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parameter (0 alebo 1) sa pridá k základnej adrese I2C, aby bolo možné použiť dve zariadenia BME280 alebo BMP280 na tej istej zbernici I2C (vrátane jedného z nich).

Tretia úroveň na vytvorenie softvérového objektu BME alebo BMP280 má dva parametre. Prvý parameter, ktorý je buď 0 alebo 1, je pre adresu, ako v predchádzajúcom prípade. Druhý parameter riadi tlač ladenia. Ak je nastavená na 1, každá transakcia so softvérovým objektom bude mať za následok výstupy Serial.print, ktoré umožnia programátorovi vidieť podrobnosti transakcie. Napríklad:

bmp280 objectNameB (1, 1);

Ak je parameter tlače ladenia nastavený na 0, softvérový objekt sa vráti k normálnemu správaniu (žiadna tlač).

Tento príkaz alebo vyhlásenia je potrebné zahrnúť za funkciu #include a pred funkciu setup ().

Inicializácia softvérového objektu BME alebo BMP

Pred použitím je potrebné prečítať kalibračné parametre zo zariadenia a nakonfigurovať ich pre akýkoľvek vhodný režim merania, prevzorkovanie a nastavenia filtra.

Pre jednoduchú, všeobecnú inicializáciu uvádzame:

objectName.begin ();

Táto verzia systému begin () číta kalibračné parametre zo zariadenia a nastavuje osrs_t = 7 (16 meraní teploty), osrs_p = 7 (16 meraní tlaku), režim = 3 (nepretržitý, normálny), t_sb = 0 (0,5 ms spánok medzi sady meraní), filter = 0 (K = 1, takže žiadne filtrovanie) a spiw_en = 0 (SPI vypnuté, preto použite I2C). V prípade BME280 existuje ďalší parameter osrs_h = 7 pre 16 meraní vlhkosti.

Existuje ďalšia verzia begin (), ktorá má všetkých šesť (alebo 7) parametrov. Ekvivalent vyššie uvedeného tvrdenia je

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

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

Úplný zoznam kódov a ich významov je v dátovom liste BME280 a BMP280 a tiež v komentároch v súbore.cpp v knižnici.

Jednoduché meranie teploty a tlaku

Meranie teploty získate najjednoduchším spôsobom

dvojnásobná teplota = objectName.readTemperature (); // meranie teploty

Meranie tlaku získate najjednoduchším spôsobom

dvojitý tlak = objectName.readPressure (); // meranie tlaku

Najjednoduchším spôsobom je meranie vlhkosti

dvojnásobná vlhkosť = objectName.readHumidity (); // meranie vlhkosti (iba BME280)

Na získanie teploty a tlaku je možné použiť vyššie uvedené dva výroky jeden po druhom, existuje však aj iná možnosť, ktorou je:

dvojnásobná teplota;

dvojitý tlak = názov objektu.predtlak (teplota); // meranie tlaku a teploty

Toto vyhlásenie prečíta údaje zo zariadenia BME280 alebo BMP280 iba raz a vráti teplotu aj tlak. Toto je o niečo efektívnejšie využitie zbernice I2C a zaisťuje, že tieto dve hodnoty zodpovedajú rovnakému cyklu merania.

Pre BME 280 je kombinovaný údaj, ktorý získava všetky tri hodnoty (vlhkosť, teplota a tlak):

dvojnásobná teplota, tlak; dvojnásobná vlhkosť = názov objektu.readHumidity (teplota, tlak); // meranie vlhkosti, tlaku a teploty

Tento príkaz prečíta údaje zo zariadenia BMP280 iba raz a vráti všetky tri hodnoty. Toto je o niečo efektívnejšie využitie zbernice I2C a zaisťuje, že tri namerané hodnoty zodpovedajú rovnakému cyklu merania. Názvy premenných je možné zmeniť na čokoľvek, čo sa používateľovi páči, ale ich poradie je pevné - teplota je na prvom mieste a tlak je na druhom mieste.

Tieto prípady použitia sú uvedené v príkladoch náčrtov dodaných s knižnicou, ako sú basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino a basicHumidityAndTemperatureAndPressure.ino.

Sofistikovanejšie meranie teploty a tlaku

Aj keď vyššie uvedená séria vyhlásení bude fungovať bez problémov, existuje niekoľko problémov:

  1. zariadenie beží nepretržite, a preto spotrebúva energiu na maximálnej úrovni. Ak energia pochádza z batérie, môže byť potrebné ju znížiť.
  2. v dôsledku spotrebovanej energie sa zariadenie zahreje, a preto bude nameraná teplota vyššia ako teplota okolia. Podrobnejšie sa tomu budem venovať v neskoršom kroku.

Výsledok, ktorý spotrebuje menej energie a poskytuje teplotu, ktorá je bližšia teplote okolia, je možné získať použitím parametra begin () s parametrami, ktoré ho prepnú do režimu spánku (napr. Režim = 0). Napríklad:

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

Potom, keď je potrebné meranie, prebuďte zariadenie pomocou konfiguračného príkazu na registre F2 (ak je to potrebné) a F4, ktorý nastaví príslušné hodnoty osrs_h, osrs_t a osrs_p, plus režim = 1 (režim jedného záberu). Napríklad:

[objectName.updateF2Control (1);] // osrs_h - nikdy nie je potrebný pre BMP280, // a nie je potrebné pre BME280, ak sa nemení počet meraní // z hodnoty uvedenej v begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, režim

Keď zariadenie prebudíte, začne merať, ale výsledok nebude k dispozícii niekoľko milisekúnd - najmenej 4 ms, možno až 70 ms alebo viac, v závislosti od počtu špecifikovaných meraní. Ak je príkaz na čítanie odoslaný okamžite, zariadenie vráti hodnoty z predchádzajúceho merania - čo môže byť v niektorých aplikáciách prijateľné, ale vo väčšine prípadov je pravdepodobne lepšie oddialiť, kým nebude k dispozícii nové meranie.

Toto oneskorenie je možné vykonať niekoľkými spôsobmi.

  1. počkajte fixný čas na pokrytie najdlhšieho očakávaného zdržania
  2. počkajte určitý čas vypočítaný z maximálneho času merania na jedno meranie (tj. 2,3 ms) vynásobený počtom meraní plus réžia plus marža.
  3. počkajte kratší čas vypočítaný vyššie, ale s použitím nominálneho času merania (tj. 2 ms) plus réžia, a potom začnite kontrolovať bit "meriam" v stavovom registri. Keď stavový bit ukazuje 0 (tj nemeria), získajte hodnoty teploty a tlaku.
  4. ihneď začnite kontrolovať stavový register a získajte hodnoty teploty a tlaku, keď stavový bit zobrazí 0,

Trochu neskôr ukážem príklad jedného zo spôsobov, ako to urobiť.

Operácie konfiguračného registra

Aby sa to všetko stalo, potrebujeme niekoľko nástrojov, ktoré som ešte nezaviedol. Oni sú:

byte readRegister (reg)

void updateRegister (reg, hodnota)

Každý z nich má v knižnici niekoľko odvodených príkazov, vďaka ktorým je softvér pre konkrétne akcie o niečo jednoduchší.

Príklad powerSaverPressureAndTemperature.ino používa metódu č. 3. Riadok kódu, ktorý vykonáva opakovanú kontrolu, je

while (bmp0.readRegister (0xF3) >> 3); // slučka do F3bit 3 == 0

Tento náčrt je pre mikrokontrolér ESP8266. Použil som WeMos D1 mini pro. Náčrt nebude fungovať s mikrokontrolérmi Atmega, ktoré majú rôzne pokyny na spánok. Táto skica precvičuje niekoľko ďalších príkazov, takže ich uvediem pred podrobnejším popisom tejto skice.

Keď mikrokontrolér spí paralelne so snímačom BMP280, konfiguráciu senzora pre požadované merania je možné vykonať pomocou príkazu begin () pomocou 6 parametrov. Ak však mikrokontrolér nespí, ale senzor je, potom v čase merania musí byť snímač prebudený a oznámený jeho konfigurácia merania. To sa dá urobiť priamo pomocou

updateRegister (reg, hodnota)

ale je to o niečo jednoduchšie pomocou nasledujúcich troch príkazov:

updateF2Control (osrs_h); // iba BME280

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

Po dokončení merania, ak je použitým režimom jeden záber (nútený režim), zariadenie sa automaticky vráti do režimu spánku. Ak však sada meraní zahŕňa viacnásobné meranie v kontinuálnom (normálnom) režime, bude potrebné BMP280 znova uviesť do režimu spánku. To je možné vykonať pomocou jedného z dvoch nasledujúcich príkazov:

updateF4Control16xSleep ();

updateF4ControlSleep (hodnota);

Oba tieto nastavili bity režimu na 00 (tj. Režim spánku). Prvý však nastavuje osrs_t a osrs_p na 111 (tj. 16 meraní), zatiaľ čo druhý ukladá nízkych 6 bitov z „hodnoty“do bitov 7: 2 registra 0xF4.

Podobne nasledujúci príkaz ukladá nízkych šesť bitov „hodnoty“do bitov 7: 2 registra 0xF5.

updateF5ConfigSleep (hodnota);

Použitie týchto posledných príkazov umožňuje uložiť 12 bitov informácií do registrov F4 a F5 BMP280. Minimálne v prípade ESP8266, keď sa mikrokontrolér prebudí po určitom spánku, začne na začiatku náčrtu bez znalosti jeho stavu pred príkazom spánku. Aby sa uložili znalosti o jeho stave pred príkazom spánku, údaje je možné uložiť do pamäte flash pomocou funkcií EEPROM alebo zapísaním súboru pomocou SPIFFS. Flash pamäť má však obmedzenie počtu cyklov zápisu, rádovo 10 000 až 100 000. To znamená, že ak mikrokontrolér prechádza cyklom spánku a bdenia každých niekoľko sekúnd, môže prekročiť povolený zápis do pamäte. limit za niekoľko mesiacov. Ukladanie niekoľkých bitov údajov v BMP280 nemá také obmedzenie.

Údaje uložené v registroch F4 a F5 je možné obnoviť, keď sa mikrokontrolér prebudí pomocou príkazov

readF4Sleep ();

readF5Sleep ();

Tieto funkcie načítajú príslušný register, posúvajú obsah, aby odstránili 2 LSB a vrátili zvyšných 6 bitov. Tieto funkcie sa v príklade náčrtu powerSaverPressureAndTemperatureESP.ino používajú nasledovne:

// načítanie hodnoty EventCounter späť z bmp0

byte bmp0F4value = bmp0.readF4Sleep (); // 0 až 63 bajtov bmp0F5value = bmp0.readF5Sleep (); // 0 až 63 eventCounter = bmp0F5value*64+bmp0F4value; // 0 až 4095

Tieto funkcie načítajú príslušný register, posúvajú obsah, aby odstránili 2 LSB a vrátili zvyšných 6 bitov. Tieto funkcie sú v príklade náčrtu powerSaverPressureAndTemperature.ino použité nasledovne:

// načítanie hodnoty EventCounter späť z bmp1

byte bmp1F4value = bmp1.readF4Sleep (); // 0 až 63 bajtov bmp1F5value = bmp1.readF5Sleep (); // 0 až 63 eventCounter = bmp1F5value*64+bmp1F4value; // 0 až 4095

Funkcie surovej teploty a tlaku

Základné funkcie readTemperature, readPressure a readHumidity majú dve zložky. Najprv sa z BME/P280 získajú surové 20-bitové hodnoty teploty a tlaku, alebo sa z BME280 získa surové 16-bitové hodnoty vlhkosti. Potom sa kompenzačný algoritmus použije na generovanie výstupných hodnôt v stupňoch Celzia, hPa alebo %RH.

Knižnica poskytuje pre tieto súčasti oddelené funkcie, takže je možné získavať a prípadne nejakým spôsobom manipulovať surové údaje o teplote, tlaku a vlhkosti. Poskytuje sa aj algoritmus na odvodenie teploty, tlaku a vlhkosti z týchto surových hodnôt. V knižnici sú tieto algoritmy implementované pomocou dvojitej aritmetiky s pohyblivou rádovou čiarkou. Funguje dobre na ESP8266, ktorý je 32-bitovým procesorom, a používa 64 bitov na „dvojité“pohyblivé premenné. Sprístupnenie týchto funkcií môže byť užitočné pri hodnotení a prípadnej zmene výpočtu pre iné platformy.

Tieto funkcie sú:

readRawPressure (rawTemperature); // číta surové údaje o tlaku a teplote z BME/P280readRawHumidity (rawTemperature, rawPressure); // číta surové údaje o vlhkosti, teplote a tlaku z BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Argument „t-fine“týchto funkcií stojí za trochu vysvetlenia. Algoritmy kompenzácie tlaku a vlhkosti obsahujú teplotne závislú zložku, ktorá sa dosahuje pomocou premennej t_fine. Funkcia calcTemperature zapíše hodnotu v t_fine na základe logiky algoritmu teplotnej kompenzácie, ktorá sa potom použije ako vstup v calcPressure a calcHumidity.

Príklad použitia týchto funkcií nájdete v ukážke náčrtu rawPressureAndTemperature.ino a tiež v kóde pre funkciu readHumidity () v súbore.cpp knižnice.

Tlak nadmorskej výšky a hladiny mora

Existuje známy vzťah medzi atmosférickým tlakom a nadmorskou výškou. Na tlak má vplyv aj počasie. Keď meteorologické organizácie zverejňujú informácie o atmosférickom tlaku, zvyčajne ich upravia podľa nadmorskej výšky, a tak „synoptický graf“zobrazuje izobary (čiary konštantného tlaku) štandardizované tak, aby znamenali hladinu mora. V tomto vzťahu teda skutočne existujú 3 hodnoty a poznanie dvoch z nich umožňuje odvodenie tretej. Tieto 3 hodnoty sú:

  • nadmorská výška
  • skutočný tlak vzduchu v danej výške
  • ekvivalentný tlak vzduchu na hladine mora (presnejšie priemerná hladina mora, pretože okamžitá hladina mora sa neustále mení)

Táto knižnica poskytuje pre tento vzťah dve funkcie nasledovne:

calcAltitude (tlak, moreLevelhPa);

Calc Normalizovaný tlak (tlak, nadmorská výška);

Existuje aj zjednodušená verzia, ktorá predpokladá štandardný tlak morskej hladiny 1013,15 hPa.

calcAltitude (tlak); // štandardný seaLevelPressure Predpokladaný

Krok 3: Podrobnosti o zariadení BMP280

Podrobnosti o zariadení BMP280
Podrobnosti o zariadení BMP280

Možnosti hardvéru

BMP280 má 2 bajty konfiguračných údajov (na registračných adresách 0xF4 a 0xF5), ktoré sa používajú na ovládanie viacerých možností merania a výstupu údajov. Poskytuje tiež 2 bity stavových informácií a 24 bajtov kalibračných parametrov, ktoré sa používajú na prevod hodnôt surovej teploty a tlaku na konvenčné jednotky teploty a tlaku. BME280 má ďalšie údaje nasledovne:

  • 1 ďalší bajt konfiguračných údajov na adrese registra 0xF2 slúžiaci na riadenie viacerých meraní vlhkosti;
  • 8 ďalších bajtov kalibračných parametrov použitých na prevod hodnoty surovej vlhkosti na percento relatívnej vlhkosti.

Registre teploty, tlaku a stavu pre BME280 sú rovnaké ako pre BMP280 s menšími výnimkami nasledovne:

  • bity „ID“BME280 sú nastavené na 0x60, takže ich možno odlíšiť od BMP280, ktoré môžu byť 0x56, 0x57 alebo 0x58
  • riadenie času spánku (t_sb) sa zmení tak, že dva dlhé časy v BMP280 (2000 ms a 4000 ms) sa nahradia v BME280 s krátkymi časmi 10 ms a 20 ms. Maximálna doba spánku v BME280 je 1 000 ms.
  • V BME280 sú surové hodnoty teploty a tlaku vždy 20 bitov, ak je použité filtrovanie. Použitie 16 až 19 bitových hodnôt je obmedzené na prípady bez filtrovania (tj. Filter = 0).

Teplota a tlak sú vždy 20 bitové hodnoty, ktoré je potrebné previesť na konvenčnú teplotu a tlak pomocou pomerne komplexného algoritmu s použitím 3 16 bitových kalibračných parametrov teploty a 9 16 bitových kalibračných parametrov plus teploty tlaku. Granularita merania teploty je 0,0003 stupňa Celzia pre najmenej významnú bitovú zmenu (20 -bitový údaj), pričom sa zvyšuje na 0,0046 stupňa Celzia, ak sa použije 16 -bitový údaj.

Vlhkosť je 16 bitová hodnota, ktorú je potrebné previesť na relatívnu vlhkosť pomocou iného komplexného algoritmu pomocou 6 kalibračných parametrov, ktoré sú kombináciou 8, 12 a 16 bitov.

Dátový list ukazuje absolútnu presnosť odpočtu teploty ako -0,5 ° C pri 25 ° C a +-1 ° C v rozsahu 0 až 65 ° C.

Granularita merania tlaku je 0,15 Pascalov (tj. 0,0015 hektopascalov) pri 20 -bitovom rozlíšení alebo 2,5 Pascalov pri 16 -bitovom rozlíšení. Hodnota surového tlaku je ovplyvnená teplotou, takže okolo 25 ° C zvýšenie teploty o 1 stupeň C zníži nameraný tlak o 24 Pascalov. Citlivosť na teplotu je zahrnutá v kalibračnom algoritme, takže dodané hodnoty tlaku by mali byť presné pri rôznych teplotách.

Dátový list ukazuje absolútnu presnosť odčítania tlaku +-1 hPa pri teplotách medzi 0 ° C a 65 ° C.

Presnosť vlhkosti je v dátovom liste uvedená ako +-3% RV a +-1% hysteréza.

Ako to funguje

24 bajtov kalibračných údajov o teplote a tlaku a tiež v prípade BME280 8 bajtov kalibračných údajov o vlhkosti je potrebné načítať zo zariadenia a uložiť do premenných. Tieto údaje sú do zariadenia individuálne naprogramované vo výrobnom závode, takže rôzne zariadenia majú rôzne hodnoty - aspoň pre niektoré parametre. BME/P280 môže byť v jednom z dvoch stavov. V jednom štáte je to meranie. V druhom stave to čaká (spí).

V akom stave sa nachádza, je možné skontrolovať pohľadom na bit 3 registra 0xF3.

Výsledky najnovšieho merania je možné kedykoľvek získať odčítaním zodpovedajúcej hodnoty údajov bez ohľadu na to, či zariadenie spí alebo meria.

Existujú tiež dva spôsoby obsluhy BME/P280. Jedným z nich je nepretržitý režim (v technickom liste sa nazýva normálny režim), ktorý opakovane cykluje medzi režimami merania a spánku. V tomto režime zariadenie vykoná sériu meraní, potom prejde do režimu spánku, potom sa prebudí na ďalšiu sadu meraní atď. Počet jednotlivých meraní a trvanie spánkovej časti cyklu je možné ovládať pomocou konfiguračných registrov.

Ďalším spôsobom ovládania BME/P280 je režim jedného záberu (v dátovom liste sa nazýva nútený režim). V tomto režime je zariadenie prebudené zo spánku príkazom na meranie, vykoná sériu meraní a potom sa vráti do režimu spánku. Počet jednotlivých meraní v sade je riadený v konfiguračnom príkaze, ktorý zariadenie prebúdza.

V BMP280, ak sa vykoná jediné meranie, 16 najvýznamnejších bitov hodnoty sa vyplní a štyri najmenej významné bity v odčítaní hodnôt sú všetky nuly. Počet meraní je možné nastaviť na 1, 2, 4, 8 alebo 16 a so zvyšujúcim sa počtom meraní sa zvyšuje počet bitov osadených údajmi, takže pri 16 meraniach je všetkých 20 bitov osadených údajmi o meraní. V dátovom liste sa tento proces označuje ako prevzorkovanie.

V BME280 platí rovnaké usporiadanie, pokiaľ nie je výsledok filtrovaný. Ak sa používa filtrovanie, hodnoty sú vždy 20 bitov, bez ohľadu na to, koľko meraní sa vykoná v každom meracom cykle.

Každé jednotlivé meranie trvá asi 2 milisekundy (typická hodnota; maximálna hodnota je 2,3 ms). Keď k tomu prirátame fixnú réžiu asi 2 ms (zvyčajne o niečo menej), znamená to, že sekvencia merania, ktorá môže pozostávať z 1 až 32 jednotlivých meraní, môže trvať od 4 ms do 66 ms.

Dátový list poskytuje súbor odporúčaných kombinácií prevzorkovania teploty a tlaku pre rôzne aplikácie.

Registre riadenia konfigurácie

Dva registre riadenia konfigurácie v BMP280 sú na adresách registrov 0xF4 a 0xF5 a sú mapované na 6 individuálnych hodnôt riadenia konfigurácie. 0xF4 pozostáva z:

  • 3 bity osrs_t (meranie teploty 0, 1, 2, 4, 8 alebo 16 krát);
  • 3 bity osrs_p (zmerajte tlak 0, 1, 2, 4, 8 alebo 16 -krát); a
  • 2 -bitový režim (spánok, nútený (tj. Jeden záber), normálny (tj nepretržitý).

0xF5 pozostáva z:

  • 3 bity t_sb (pohotovostný čas, 0,5 ms až 4000 ms);
  • 3 -bitový filter (pozri nižšie); a
  • 1 bit spiw_en, ktorý vyberá SPI alebo I2C.

Parameter filtra riadi typ algoritmu exponenciálneho rozpadu alebo filtra Infinite Impulse Response (IIR), ktorý sa používa na hodnoty surového tlaku a teploty (nie však na hodnoty vlhkosti). Rovnica je uvedená v údajovom liste. Ďalšou prezentáciou je:

Hodnota (n) = hodnota (n-1) * (K-1) / K + meranie (n) / K.

kde (n) označuje najnovšie namerané a výstupné hodnoty; a K je parameter filtra. Parameter filtra K a je možné ho nastaviť na 1, 2, 4, 8 alebo 16. Ak je K nastavený na 1, rovnica sa stane hodnotou (n) = mierka (n). Kódovanie parametra filtra je:

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

BME 280 pridáva ďalší register riadenia konfigurácie na adrese 0xF2, „ctrl_hum“s jediným 3-bitovým parametrom osrs_h (merajte vlhkosť 0, 1, 2, 4, 8 alebo 16 krát).

Krok 4: Meranie a načasovanie načítania

Plánujem to pridať neskôr, pričom ukážem načasovanie príkazov a reakcie merania.

Iddt - prúd pri meraní teploty. Typická hodnota 325 uA

Iddp - prúd pri meraní tlaku. Typická hodnota 720 uA, max. 1120 uA

Iddsb - aktuálne v pohotovostnom režime. Typická hodnota 0,2 uA, max. 0,5 uA

Iddsl - aktuálne v režime spánku. Typická hodnota 0,1 uA, max. 0,3 uA

Krok 5: Pokyny k softvéru

Pokyny k softvéru
Pokyny k softvéru
Pokyny k softvéru
Pokyny k softvéru

Režim sériového snímania I2C

Údajový list BMP280 poskytuje návod na čítanie údajov (časť 3.9). Hovorí sa, že "sa dôrazne odporúča používať sekvenčné čítanie a neriešiť každý register jednotlivo. Tým sa zabráni možnému zamieňaniu bajtov patriacich rôznym meraniam a zníži sa prevádzka rozhrania." Pokiaľ ide o čítanie parametrov kompenzácie/kalibrácie, nie je poskytnutý žiadny návod. Pravdepodobne to nie je problém, pretože sú statické a nemenia sa.

Táto knižnica číta všetky súvislé hodnoty v rámci jednej operácie čítania - 24 bajtov v prípade parametrov kompenzácie teploty a tlaku, 6 bajtov pre kombináciu teploty a tlaku a 8 bajtov pre kombináciu vlhkosti, teploty a tlaku. Keď je kontrolovaná samotná teplota, načítajú sa iba 3 bajty.

Použitie makier (#define atď.)

V tejto knižnici nie sú žiadne makrá okrem bežného makra „include guard“knižnice, ktoré zabraňuje duplikácii.

Všetky konštanty sú definované pomocou kľúčového slova const a tlač ladenia je riadená štandardnými funkciami C.

Bol to pre mňa zdroj určitej neistoty, ale rada, ktorú čítam z mnohých článkov na túto tému, je, že použitie #define na deklaráciu konštánt (prinajmenšom) a (pravdepodobne) ladenie kontroly tlače je zbytočné a nežiaduce.

Prípad použitia const skôr ako #define je celkom jasný - const používa rovnaké zdroje ako #define (tj. Nula) a výsledné hodnoty sa riadia pravidlami určovania rozsahu, čím sa znižuje pravdepodobnosť chýb.

Prípad kontroly ladenia tlače je o niečo menej jasný, pretože spôsob, akým som to urobil, znamená, že konečný kód obsahuje logiku príkazov na ladenie tlače, aj keď sa nikdy nevykonávajú. Ak sa má knižnica používať vo veľkom projekte na mikrokontroléri s veľmi obmedzenou pamäťou, môže to byť problém. Keďže môj vývoj bol na ESP8266 s veľkou flash pamäťou, nezdalo sa mi, že by to bol problém.

Krok 6: Teplotný výkon

Plánujem to pridať neskôr.

Krok 7: Tlakový výkon

Plánujem to pridať neskôr.

Odporúča: