Obsah:

Knihovna pro BMP280 a BME280: 7 kroků
Knihovna pro BMP280 a BME280: 7 kroků

Video: Knihovna pro BMP280 a BME280: 7 kroků

Video: Knihovna pro BMP280 a BME280: 7 kroků
Video: Lesson 30: BMP280 Temperature Sensor with LCD1602 | Arduino Step By Step Course 2024, Červenec
Anonim
Knihovna pro BMP280 a BME280
Knihovna pro BMP280 a BME280
Knihovna pro BMP280 a BME280
Knihovna pro BMP280 a BME280
Knihovna pro BMP280 a BME280
Knihovna pro BMP280 a BME280

Úvod

Nechtěl jsem napsat tuto knihovnu. „Stalo se to“jako vedlejší účinek projektu, který jsem zahájil a který používá BMP280. Tento projekt ještě není dokončen, ale myslím si, že knihovna je připravena sdílet je s ostatními. Následně jsem měl potřebu použít BME280, který přidává měření vlhkosti k tlakovým a teplotním schopnostem BMP280. BME280 je „zpětně kompatibilní“s BMP280 - to znamená, že všechny registry a kroky potřebné ke čtení tlaku a teploty z BME280 jsou stejné jako ty, které jsou použity pro BMP280. Ke čtení vlhkosti jsou nutné další registry a kroky, které platí pouze pro BME280. To vyvolává otázku, jedna knihovna pro obě nebo dvě samostatné knihovny. Hardware pro oba typy zařízení je plně zaměnitelný. Dokonce i mnoho prodávaných modulů (například na Ebay a AliExpress) je označeno BME/P280. Chcete -li zjistit, o jaký typ se jedná, musíte se podívat na (miniaturní) nápis na samotném senzoru nebo otestovat byte ID zařízení. Rozhodl jsem se jít do jediné knihovny. Zdá se, že to fungovalo dobře.

Oceníme zpětnou vazbu, zejména jakékoli návrhy na vylepšení.

Funkce a možnosti knihovny

Knihovna je kus softwaru, který poskytuje aplikačnímu programovacímu rozhraní (API) pro programátora využití schopností zařízení, aniž by se nutně musel zabývat všemi drobnými detaily. Je žádoucí, aby API bylo pro začátečníka snadné, aby mohl začít s jednoduchými požadavky, a zároveň by mělo zajistit plné využití možností zařízení. Je žádoucí, aby se knihovna řídila jakýmikoli konkrétními pokyny od výrobce zařízení, jakož i obecnými osvědčenými postupy pro software. Snažil jsem se toho všeho dosáhnout. Když jsem začínal s BMP280, našel jsem pro něj 3 různé knihovny: Adafruit_BMP280; Seeed_BMP280; a jeden s názvem BMP280 od výrobce zařízení. Adafruit ani Seeed neposkytovaly rozšířené možnosti, přestože fungovaly dobře a snadno se používaly pro základní aplikace. Nemohl jsem přijít na to, jak používat ten, který vyrobil výrobce zařízení (Bosch Sensortec). To může být spíše můj nedostatek než jejich. Knihovna však byla mnohem komplikovanější než ostatní dvě, nenašel jsem žádné pokyny ani příklady použití (příklady jsem následně našel v souboru „bmp280_support.c“, ale tyto mi nijak zvlášť nepomohly).

V důsledku těchto faktorů jsem se rozhodl napsat vlastní knihovnu pro BMP280.

Při pohledu na situaci v knihovně pro BME280 jsem našel samostatné knihovny Adafruit_BME280, Seed_BME280 a další BME280_MOD-1022 od Embedded Adventures. Žádný z nich nekombinoval funkce pro BMP280 v knihovně schopné používat BME280. Žádný z nich výslovně nepodporoval schopnost zařízení ukládat několik bitů dat, zatímco zařízení a jeho řídící mikroprocesor spí (tato schopnost je evidentní v datovém listu a podporována v knihovně, kterou jsem zde napsal a popsal).

Kombinovaná knihovna by měla mít podporu pro všechny možnosti BME280, ale při použití s BMP280 by neměla znamenat žádnou režii z nepoužívaných funkcí. Výhody kombinované knihovny zahrnují méně knihovních souborů pro správu, snadné kombinování různých zařízení ve stejném projektu a zjednodušené změny pro údržbu nebo upgrady, které je třeba provádět pouze na jednom místě, nikoli na dvou. To jsou pravděpodobně všechny docela malé, dokonce bezvýznamné, ale…

Možnosti zařízení

BMP280 a BME280 jsou zařízení pro povrchovou montáž asi 5 mm čtverečních a 1 mm na výšku. K dispozici je 8 padů rozhraní, včetně 2 samostatných vstupních padů a dvou Ground padů. Jsou k dispozici na eBay jako modul s vyvedenými 4 nebo 6 piny. 4pinový modul má pevnou adresu I2C a nelze jej nakonfigurovat tak, aby používal protokol SPI.

6pinový modul nebo holé zařízení lze použít s protokoly I2C nebo SPI. V režimu I2C může mít dvě různé adresy, dosažené připojením pinu SDO buď k Ground (pro základní adresu = 0x76) nebo k Vdd (pro základní adresu +1 = 0x77). V režimu SPI má obvyklé uspořádání 1 hodin, 2 dat (jeden pro každý směr) a pin pro výběr zařízení (CS).

Knihovna, kterou jsem zde napsal a popsal, podporuje pouze I2C. Knihovny Adafruit_BMP280 a BME_MOD-1022 podporují i2C i SPI.

Knihovnu je možné stáhnout zde:

github.com/farmerkeith/BMP280-library

Krok 1: Nastavení hardwaru

Nastavení hardwaru
Nastavení hardwaru

Než může být knihovna užitečná, je nutné k BMP280 (nebo ke dvěma z nich, chcete -li) připojit mikrokontrolér.

Použil jsem WeMos D1 mini pro, takže ukážu jeho spojení. Ostatní mikrokontroléry budou podobné, stačí správně připojit piny SDA a SCL.

V případě WeMos D1 mini pro jsou připojení následující:

Funkce Pin WeMos Pin BMP280 Poznámky

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin nominální 3,3 V uzemnění GND řízení adresy SDO zem nebo Vdd I2C vybrat CSB Vdd (GND volí SPI)

Všimněte si, že pin SDO na některých modulech MP280 je označen SDD a pin Vdd může být označen VCC. Poznámka: Vedení SDA a SCL by měly mít mezi vedením a kolíkem Vin stahovací odpory. Obvykle by měla být hodnota 4,7 kB v pořádku. Některé moduly BMP280 a BME280 mají v modulu zahrnuty 10K stahovací odpory (což není správná praxe, protože umístění více zařízení na sběrnici I2C ji může nadměrně zatěžovat). Nicméně použití 2 modulů BME/P280 s 10K odporem by v praxi nemělo být problémem, pokud na stejné sběrnici není příliš mnoho dalších zařízení také s výsuvnými odpory.

Jakmile máte připojený hardware, můžete snadno zkontrolovat, zda je vaše zařízení BMP280 nebo BME280, spuštěním skici I2CScan_ID, kterou najdete zde:

Můžete také zkontrolovat, zda máte BMP280 nebo BME280, tím, že se podíváte na samotné zařízení. Zjistil jsem, že je k tomu nutné použít digitální mikroskop, ale pokud je váš zrak velmi dobrý, možná to zvládnete bez jakýchkoli pomůcek. Na plášti zařízení jsou dva řádky tisku. Klíčem je první písmeno na druhém řádku, které je v případě zařízení BMP280 „K“a v případě zařízení BME280 „U“.

Krok 2: API poskytovaná knihovnou

API poskytovaná knihovnou
API poskytovaná knihovnou
API poskytovaná knihovnou
API poskytovaná knihovnou

Včetně knihovny v náčrtu

Knihovna je součástí skici standardním způsobem pomocí příkazu

#include "farmerkeith_BMP280.h"

Toto prohlášení musí být zahrnuto v rané části náčrtu před spuštěním funkce setup ().

Vytvoření softwarového objektu BME nebo BMP

K vytvoření softwarového objektu BMP280 existují 3 úrovně. Nejjednodušší je prostě

bme280 objectName; nebo bmp280 objectName;

například BMP280 bmp0;

Tím se vytvoří softwarový objekt s výchozí adresou 0x76 (tj. Pro SDO připojený k zemi).

Další úroveň pro vytvoření softwarového objektu BME280 nebo BMP280 má parametr 0 nebo 1, a to následovně:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parametr (0 nebo 1) je přidán k základní adrese I2C, takže na stejné sběrnici I2C (včetně jednoho z každého) lze použít dvě zařízení BME280 nebo BMP280.

Třetí úroveň pro vytvoření softwarového objektu BME nebo BMP280 má dva parametry. První parametr, který je buď 0 nebo 1, je pro adresu, jako v předchozím případě. Druhý parametr řídí tisk ladění. Pokud je nastavena na 1, každá transakce se softwarovým objektem má za následek výstupy Serial.print, které umožňují programátorovi zobrazit podrobnosti transakce. Například:

bmp280 objectNameB (1, 1);

Pokud je parametr tisku ladění nastaven na 0, softwarový objekt se vrátí k normálnímu chování (žádný tisk).

Tento příkaz nebo příkazy je třeba zahrnout za funkci #include a před funkci setup ().

Inicializace softwarového objektu BME nebo BMP

Před použitím je nutné přečíst kalibrační parametry ze zařízení a nakonfigurovat je pro jakýkoli režim měření, převzorkování a nastavení filtru.

Pro jednoduchou obecnou inicializaci je prohlášení následující:

objectName.begin ();

Tato verze begin () čte kalibrační parametry ze zařízení a nastavuje osrs_t = 7 (16 měření teploty), osrs_p = 7 (16 měření tlaku), režim = 3 (kontinuální, normální), t_sb = 0 (0,5 ms spánek mezi sady měření), filtr = 0 (K = 1, takže žádné filtrování) a spiw_en = 0 (SPI zakázáno, použijte tedy I2C). V případě BME280 existuje další parametr osrs_h = 7 pro 16 měření vlhkosti.

Existuje další verze begin (), která přebírá všech šest (nebo 7) parametrů. Ekvivalent výše uvedeného tvrzení je

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

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

Úplný seznam kódů a jejich významů je v datovém listu BME280 a BMP280 a také v komentářích v souboru.cpp v knihovně.

Jednoduché měření teploty a tlaku

Měření teploty získáte nejjednodušším způsobem

dvojnásobná teplota = objectName.readTemperature (); // měření teploty

Nejjednodušší způsob, jak získat měření tlaku, je

dvojitý tlak = název objektu.readPressure (); // změřit tlak

Měření vlhkosti je nejjednodušší

dvojitá vlhkost = objectName.readHumidity (); // měření vlhkosti (pouze BME280)

Chcete -li získat teplotu i tlak, lze výše uvedené dva výroky použít jeden po druhém, ale existuje ještě jedna možnost, kterou je:

dvojnásobná teplota;

dvojitý tlak = název objektu.čtení tlaku (teplota); // měření tlaku a teploty

Toto prohlášení čte data ze zařízení BME280 nebo BMP280 pouze jednou a vrací teplotu i tlak. Toto je o něco efektivnější využití sběrnice I2C a zajišťuje, že obě hodnoty odpovídají stejnému cyklu měření.

Pro BME 280 je kombinovaný příkaz, který získá všechny tři hodnoty (vlhkost, teplota a tlak):

dvojnásobná teplota, tlak; dvojitá vlhkost = název_objektu.readHumidity (teplota, tlak); // měření vlhkosti, tlaku a teploty

Tento příkaz přečte data ze zařízení BMP280 pouze jednou a vrátí všechny tři hodnoty. Toto je o něco efektivnější využití sběrnice I2C a zajišťuje, že tři naměřené hodnoty odpovídají stejnému cyklu měření. Názvy proměnných lze změnit na cokoli, co se uživateli líbí, ale jejich pořadí je pevné - teplota je na prvním místě a tlak na druhém místě.

Tyto případy použití jsou zahrnuty v příkladech skic dodávaných s knihovnou, jako basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino a basicHumidityAndTemperatureAndPressure.ino.

Sofistikovanější měření teploty a tlaku

Ačkoli výše uvedená řada příkazů bude fungovat bez problémů, existuje několik problémů:

  1. zařízení běží nepřetržitě, a proto spotřebovává energii na maximální úrovni. Pokud energie pochází z baterie, může být nutné toto snížit.
  2. kvůli spotřebované energii se zařízení zahřeje, a proto bude naměřená teplota vyšší než teplota okolí. Více se tomu budu věnovat v pozdějším kroku.

Výsledek, který spotřebovává méně energie a poskytuje teplotu, která je blíže okolnímu prostředí, lze získat pomocí parametru begin () s parametry, které jej uvedou do režimu spánku (např. Režim = 0). Například:

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

Poté, když je požadováno měření, probuďte zařízení pomocí konfiguračního příkazu pro registraci F2 (je -li vyžadováno) a F4, který nastaví příslušné hodnoty osrs_h, osrs_t a osrs_p, plus mode = 1 (režim jednoho snímku). Například:

[objectName.updateF2Control (1);] // osrs_h - pro BMP280 nikdy není potřeba, // a není potřeba pro BME280, pokud se nemění počet měření // z hodnoty uvedené v begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, režim

Po probuzení zařízení začne měřit, ale výsledek nebude k dispozici po několik milisekund - nejméně 4 ms, možná až 70 ms nebo více, v závislosti na počtu zadaných měření. Pokud je příkaz pro čtení odeslán okamžitě, zařízení vrátí hodnoty z předchozího měření - což může být v některých aplikacích přijatelné, ale ve většině případů je pravděpodobně lepší odložit, dokud nebude k dispozici nové měření.

Toto zpoždění lze provést několika způsoby.

  1. počkejte pevně stanovenou dobu, abyste pokryli nejdelší očekávané zpoždění
  2. počkejte dobu vypočítanou z maximální doby měření na měření (tj. 2,3 ms) krát počet měření plus režie plus marže.
  3. počkejte kratší dobu vypočítanou výše, ale s použitím nominálního času měření (tj. 2 ms) plus režie, a poté začněte kontrolovat bit „měřím“ve stavovém registru. Když stavový bit ukazuje 0 (tj. Neměřeno), získejte hodnoty teploty a tlaku.
  4. okamžitě začněte kontrolovat stavový registr a získejte hodnoty teploty a tlaku, když stavový bit ukazuje 0,

Trochu později ukážu příklad jednoho ze způsobů, jak toho dosáhnout.

Operace konfiguračního registru

Aby se to všechno stalo, potřebujeme několik nástrojů, které jsem dosud nezavedl. Oni jsou:

byte readRegister (reg)

void updateRegister (reg, hodnota)

Každý z nich má v knihovně několik odvozených příkazů, díky nimž je software pro konkrétní akce o něco jednodušší.

Příklad powerSaverPressureAndTemperature.ino používá metodu č. 3. Řádek kódu, který provádí opakovanou kontrolu, je

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

Tato skica je pro mikrokontrolér ESP8266. Použil jsem WeMos D1 mini pro. Skica nebude fungovat s mikrokontroléry Atmega, které mají různé pokyny ke spánku. Tento náčrt procvičuje několik dalších příkazů, takže je všechny představím před podrobnějším popisem této skici.

Když mikrokontrolér spí paralelně se snímačem BMP280, konfiguraci senzoru pro požadovaná měření lze provést pomocí příkazu begin () pomocí 6 parametrů. Pokud však mikrokontrolér nespí, ale senzor je, pak v době měření musí být senzor probuzen a sdělen jeho konfiguraci měření. To lze provést přímo pomocí

updateRegister (reg, hodnota)

ale je o něco jednodušší s následujícími třemi příkazy:

updateF2Control (osrs_h); // Pouze BME280

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

Pokud je po provedení měření použit režim Single Shot (vynucený režim), zařízení se automaticky vrátí do režimu spánku. Pokud však sada měření zahrnuje více měření v kontinuálním (normálním) režimu, bude nutné BMP280 znovu uspat. To lze provést jedním z následujících dvou příkazů:

updateF4Control16xSleep ();

updateF4ControlSleep (hodnota);

Oba tyto nastavily bity režimu na 00 (tj. Režim spánku). První však nastavuje osrs_t a osrs_p na 111 (tj. 16 měření), zatímco druhý ukládá nízkých 6 bitů z „hodnoty“do bitů 7: 2 registru 0xF4.

Podobně následující příkaz ukládá nízkých šest bitů „hodnoty“do bitů 7: 2 registru 0xF5.

updateF5ConfigSleep (hodnota);

Použití těchto posledních příkazů umožňuje uložení 12 bitů informací do registrů F4 a F5 BMP280. Přinejmenším v případě ESP8266, když se mikrokontrolér probudí po určité době spánku, začíná na začátku náčrtu bez znalosti jeho stavu před příkazem spánku. Chcete -li uložit informace o jeho stavu před příkazem spánku, lze data ukládat do paměti flash pomocí funkcí EEPROM nebo zápisem souboru pomocí SPIFFS. Flash paměť má však omezení počtu cyklů zápisu, řádově 10 000 až 100 000. To znamená, že pokud mikrokontrolér prochází cyklem spánku a bdění každých několik sekund, může překročit povolený zápis do paměti. limit za několik měsíců. Uložení několika bitů dat do BMP280 nemá takové omezení.

Data uložená v registrech F4 a F5 lze obnovit, když se mikrokontrolér probudí pomocí příkazů

readF4Sleep ();

readF5Sleep ();

Tyto funkce načtou odpovídající registr, posunou obsah tak, aby odstranil 2 LSB a vrátil zbývajících 6 bitů. Tyto funkce jsou v příkladu skici powerSaverPressureAndTemperatureESP.ino použity následovně:

// načtení hodnoty EventCounter zpět z bmp0

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

Tyto funkce načtou odpovídající registr, posunou obsah tak, aby odstranil 2 LSB a vrátil zbývajících 6 bitů. Tyto funkce jsou v příkladu skici powerSaverPressureAndTemperature.ino použity následujícím způsobem:

// načtení hodnoty EventCounter zpět z bmp1

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

Funkce surové teploty a tlaku

Základní funkce readTemperature, readPressure a readHumidity mají dvě složky. Nejprve jsou z BME/P280 získány surové 20bitové hodnoty teploty a tlaku, nebo jsou z BME280 získány surové 16bitové hodnoty vlhkosti. Poté se pomocí kompenzačního algoritmu generují výstupní hodnoty ve stupních Celsia, hPa nebo %RH.

Knihovna poskytuje samostatné funkce pro tyto komponenty, takže lze získat a případně nějakým způsobem manipulovat data o surové teplotě, tlaku a vlhkosti. K dispozici je také algoritmus pro odvození teploty, tlaku a vlhkosti z těchto hrubých hodnot. V knihovně jsou tyto algoritmy implementovány pomocí dvojité aritmetiky s pohyblivou řádovou čárkou. Funguje dobře na ESP8266, což je 32bitový procesor, a používá 64 bitů pro proměnné „double“float. Zpřístupnění těchto funkcí může být užitečné pro posouzení a případně změnu výpočtu pro jiné platformy.

Tyto funkce jsou:

readRawPressure (rawTemperature); // čte surová data o tlaku a teplotě z BME/P280readRawHumidity (rawTemperature, rawPressure); // čte surová data o vlhkosti, teplotě a tlaku z BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Argument „t-fine“těchto funkcí stojí za trochu vysvětlení. Algoritmy kompenzace tlaku a vlhkosti obsahují teplotně závislou složku, které je dosaženo pomocí proměnné t_fine. Funkce calcTemperature zapisuje hodnotu v t_fine na základě logiky algoritmu teplotní kompenzace, která se poté použije jako vstup v calcPressure i calcHumidity.

Příklad použití těchto funkcí lze nalézt v příkladu skici rawPressureAndTemperature.ino a také v kódu pro funkci readHumidity () v souboru.cpp knihovny.

Tlak nadmořské výšky a hladiny moře

Existuje známý vztah mezi atmosférickým tlakem a nadmořskou výškou. Počasí také ovlivňuje tlak. Když meteorologické organizace zveřejňují informace o atmosférickém tlaku, obvykle je upravují podle nadmořské výšky, a tak „synoptický graf“ukazuje izobary (linie konstantního tlaku) standardizované na průměrnou hladinu moře. V tomto vztahu tedy skutečně existují 3 hodnoty a znalost dvou z nich umožňuje odvození třetí. Tyto 3 hodnoty jsou:

  • nadmořská výška
  • skutečný tlak vzduchu v dané výšce
  • ekvivalentní tlak vzduchu na hladině moře (přísněji střední hladina moře, protože okamžitá hladina moře se neustále mění)

Tato knihovna poskytuje pro tento vztah dvě funkce následujícím způsobem:

calcAltitude (tlak, mořeLevelhPa);

Calc Normalizovaný tlak (tlak, nadmořská výška);

Existuje také zjednodušená verze, která předpokládá standardní tlak hladiny moře 1013,15 hPa.

calcAltitude (tlak); // standardní seaLevelPressure předpokládán

Krok 3: Podrobnosti o zařízení BMP280

Podrobnosti o zařízení BMP280
Podrobnosti o zařízení BMP280

Možnosti hardwaru

BMP280 má 2 bajty konfiguračních dat (na registračních adresách 0xF4 a 0xF5), které se používají k ovládání více možností měření a výstupu dat. Poskytuje také 2 bity stavových informací a 24 bajtů kalibračních parametrů, které se používají při převodu hodnot surové teploty a tlaku na konvenční jednotky teploty a tlaku. BME280 má další data následovně:

  • 1 další bajt konfiguračních dat na registrační adrese 0xF2 slouží k řízení více měření vlhkosti;
  • 8 dalších bajtů kalibračních parametrů použitých při převodu hodnoty hrubé vlhkosti na procento relativní vlhkosti.

Regulátory teploty, tlaku a stavu pro BME280 jsou stejné jako pro BMP280 s menšími výjimkami následujícím způsobem:

  • bity „ID“BME280 jsou nastaveny na 0x60, takže je lze odlišit od BMP280, které mohou být 0x56, 0x57 nebo 0x58
  • řízení doby spánku (t_sb) je změněno tak, že dva dlouhé časy v BMP280 (2000 ms a 4000 ms) jsou nahrazeny v BME280 s krátkými časy 10 ms a 20 ms. Maximální doba spánku v BME280 je 1000 ms.
  • V BME280 jsou surové hodnoty teploty a tlaku vždy 20 bitů, pokud je použito filtrování. Použití 16 až 19 bitových hodnot je omezeno na případy bez filtrování (tj. Filtr = 0).

Teplota a tlak jsou vždy 20 bitové hodnoty, které je třeba převést na konvenční teplotu a tlak pomocí poměrně složitého algoritmu využívajícího 3 16bitové kalibrační parametry pro teplotu a 9 16bitové kalibrační parametry plus teplotu pro tlak. Granularita měření teploty je 0,0003 stupně Celsia pro nejméně významnou změnu bitů (20bitový odečet), přičemž se zvyšuje na 0,0046 stupňů Celsia, pokud se použije 16bitový odečet.

Vlhkost je 16bitová hodnota, kterou je třeba převést na relativní vlhkost pomocí jiného komplexního algoritmu pomocí 6 kalibračních parametrů, které jsou kombinací 8, 12 a 16 bitů.

Datový list ukazuje absolutní přesnost odečtu teploty jako +-0,5 C při 25 C a +-1 C v rozsahu 0 až 65 C.

Granularita měření tlaku je 0,15 Pascalů (tj. 0,0015 hectoPascalů) při 20bitovém rozlišení, nebo 2,5 Pascalech při 16bitovém rozlišení. Hodnota surového tlaku je ovlivněna teplotou, takže kolem 25 ° C zvýšení teploty o 1 stupeň C sníží naměřený tlak o 24 Pascalů. Citlivost teploty je zohledněna v kalibračním algoritmu, takže dodané hodnoty tlaku by měly být přesné při různých teplotách.

Datový list ukazuje absolutní přesnost odečtu tlaku +-1 hPa pro teploty mezi 0 C a 65 C.

Přesnost vlhkosti je v datovém listu uvedena jako +-3% RV a +-1% hystereze.

Jak to funguje

24 bajtů údajů o kalibraci teploty a tlaku a také v případě BME280 8 bajtů údajů o kalibraci vlhkosti musí být načteno ze zařízení a uloženo do proměnných. Tato data jsou jednotlivě naprogramována do zařízení v továrně, takže různá zařízení mají různé hodnoty - alespoň pro některé parametry. BME/P280 může být v jednom ze dvou stavů. V jednom stavu měří. Ve druhém stavu čeká (spí).

Ve kterém stavu se nachází, lze zkontrolovat pohledem na bit 3 registru 0xF3.

Výsledky nejnovějšího měření lze kdykoli získat načtením odpovídající datové hodnoty, bez ohledu na to, zda zařízení spí nebo měří.

Existují také dva způsoby ovládání BME/P280. Jedním z nich je kontinuální režim (v datovém listu nazývaný normální režim), který opakovaně cykluje mezi stavy měření a spánku. V tomto režimu zařízení provede sadu měření, poté přejde do režimu spánku, poté se probudí pro další sadu měření atd. Počet jednotlivých měření a trvání spánkové části cyklu lze ovládat pomocí konfiguračních registrů.

Dalším způsobem ovládání BME/P280 je režim Single Shot (v datovém listu nazývaný vynucený režim). V tomto režimu je zařízení probuzeno ze spánku příkazem k měření, provede sadu měření a poté se vrátí do režimu spánku. Počet jednotlivých měření v sadě je řízen konfiguračním příkazem, který zařízení probouzí.

V BMP280, pokud je provedeno jediné měření, je 16 nejvýznamnějších bitů v hodnotě vyplněno a čtyři nejméně významné bity v hodnotě jsou všechny nuly. Počet měření lze nastavit na 1, 2, 4, 8 nebo 16 a se zvyšováním počtu měření se zvyšuje počet bitů naplněných daty, takže při 16 měřeních je všech 20 bitů naplněno naměřenými daty. Datový list označuje tento proces jako převzorkování.

V BME280 platí stejné uspořádání, pokud není výsledek filtrován. Pokud je použito filtrování, hodnoty jsou vždy 20 bitů, bez ohledu na to, kolik měření je provedeno v každém cyklu měření.

Každé jednotlivé měření trvá přibližně 2 milisekundy (typická hodnota; maximální hodnota je 2,3 ms). Když k tomu přidáme fixní režii asi 2 ms (obvykle o něco méně), znamená to, že sled měření, který může sestávat z 1 až 32 jednotlivých měření, může trvat od 4 ms do 66 ms.

Datový list poskytuje sadu doporučených kombinací převzorkování teploty a tlaku pro různé aplikace.

Registry řízení konfigurace

Dva konfigurační řídicí registry v BMP280 jsou na registračních adresách 0xF4 a 0xF5 a jsou mapovány na 6 jednotlivých hodnot pro řízení konfigurace. 0xF4 se skládá z:

  • 3 bity osrs_t (měření teploty 0, 1, 2, 4, 8 nebo 16krát);
  • 3 bity osrs_p (změřte tlak 0, 1, 2, 4, 8 nebo 16krát); a
  • 2bitový režim (spánek, vynucený (tj. Jeden snímek), normální (tj. Nepřetržitý).

0xF5 se skládá z:

  • 3 bity t_sb (pohotovostní doba, 0,5 ms až 4000 ms);
  • 3bitový filtr (viz níže); a
  • 1 bit spiw_en, který vybírá SPI nebo I2C.

Parametr filtru řídí typ algoritmu exponenciálního rozpadu nebo filtru Infinite Impulse Response (IIR), který se aplikuje na hodnoty měření surového tlaku a teploty (nikoli však na hodnoty vlhkosti). Rovnice je uvedena v datovém listu. Další prezentace je:

Hodnota (n) = hodnota (n-1) * (K-1) / K + měření (n) / K.

kde (n) označuje nejnovější naměřené a výstupní hodnoty; a K je parametr filtru. Parametr filtru K a lze nastavit na 1, 2, 4, 8 nebo 16. Pokud je K nastaveno na 1, rovnice se stane hodnotou (n) = měření (n). Kódování parametru filtru je:

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

BME 280 přidává další konfigurační řídicí registr na adrese 0xF2, „ctrl_hum“s jediným 3bitovým parametrem osrs_h (měření vlhkosti 0, 1, 2, 4, 8 nebo 16krát).

Krok 4: Měření a načasování čtení

Plánuji to přidat později a ukázat načasování příkazů a odezvy měření.

Iddt - měření proudu při teplotě. Typická hodnota 325 uA

Iddp - proud při měření tlaku. Typická hodnota 720 uA, max. 1120 uA

Iddsb - aktuální v pohotovostním režimu. Typická hodnota 0,2 uA, max. 0,5 uA

Iddsl - aktuální v režimu spánku. Typická hodnota 0,1 uA, max. 0,3 uA

Krok 5: Softwarové pokyny

Softwarové pokyny
Softwarové pokyny
Softwarové pokyny
Softwarové pokyny

Režim I2C Burst

Datový list BMP280 poskytuje pokyny k odečtu dat (část 3.9). Říká se, že "je důrazně doporučeno používat sekvenční čtení a ne adresovat každý registr jednotlivě. Tím se zabrání možnému záměně bajtů patřících různým měřením a sníží se provoz rozhraní." Pokud jde o čtení parametrů kompenzace/kalibrace, není poskytnuto žádné vodítko. Pravděpodobně to není problém, protože jsou statické a nemění se.

Tato knihovna čte všechny souvislé hodnoty v jedné operaci čtení - 24 bajtů v případě parametrů kompenzace teploty a tlaku, 6 bajtů pro kombinaci teploty a tlaku a 8 bajtů pro kombinaci vlhkosti, teploty a tlaku. Při kontrole samotné teploty se načtou pouze 3 bajty.

Použití maker (#define atd.)

V této knihovně nejsou žádná makra kromě běžného makra „include guard“knihovny, které zabraňuje duplikaci.

Všechny konstanty jsou definovány pomocí klíčového slova const a tisk ladění je řízen standardními funkcemi C.

Byl to pro mě zdroj jisté nejistoty, ale rada, kterou jsem četl v mnoha příspěvcích na toto téma, je, že použití #define pro deklaraci konstant (přinejmenším) a (pravděpodobně) ladění kontroly tisku je zbytečné a nežádoucí.

Případ použití const spíše než #define je docela jasný - const používá stejné zdroje jako #define (tj. Nula) a výsledné hodnoty se řídí pravidly určování rozsahu, čímž se snižuje šance na chyby.

Případ pro ovládání tisku ladění je o něco méně jasný, protože způsob, jakým jsem to udělal, znamená, že konečný kód obsahuje logiku příkazů pro ladění tisku, přestože se nikdy nevykonávají. Pokud má být knihovna použita ve velkém projektu na mikrokontroléru s velmi omezenou pamětí, může to být problém. Protože můj vývoj byl na ESP8266 s velkou flash pamětí, nezdálo se, že by to pro mě byl problém.

Krok 6: Teplotní výkon

Plánuji to přidat později.

Krok 7: Tlakový výkon

Plánuji to přidat později.

Doporučuje: