Tartalomjegyzék:

Könyvtár a BMP280 és a BME280 számára: 7 lépés
Könyvtár a BMP280 és a BME280 számára: 7 lépés

Videó: Könyvtár a BMP280 és a BME280 számára: 7 lépés

Videó: Könyvtár a BMP280 és a BME280 számára: 7 lépés
Videó: Lesson 02 Arduino IDE Software | Robojax Arduino Step By Step Course 2024, Július
Anonim
Könyvtár a BMP280 és a BME280 számára
Könyvtár a BMP280 és a BME280 számára
Könyvtár a BMP280 és a BME280 számára
Könyvtár a BMP280 és a BME280 számára
Könyvtár a BMP280 és a BME280 számára
Könyvtár a BMP280 és a BME280 számára

Bevezetés

Nem állt szándékomban megírni ezt a könyvtárat. Ez egy BMP280-at használó projekt mellékhatásaként "történt". Ez a projekt még nem fejeződött be, de úgy gondolom, hogy a könyvtár kész megosztani másokkal. Ezt követően szükség volt egy BME280 használatára, amely hozzáadja a páratartalom mérését a BMP280 nyomás- és hőmérséklet -képességéhez. A BME280 "visszafelé kompatibilis" a BMP280 készülékkel - vagyis a BME280 -ról a nyomás és a hőmérséklet leolvasásához szükséges összes regiszter és lépés ugyanaz, mint a BMP280 -nál. További regiszterek és lépések szükségesek a páratartalom leolvasásához, amelyek csak a BME280 típusra vonatkoznak. Ez felveti a kérdést: egy könyvtár mindkettőhöz, vagy két külön könyvtár. A két eszköztípus hardvere teljesen felcserélhető. Még az eladott modulok közül is sok (például az Ebay -en és az AliExpress -en) BME/P280 jelzéssel van ellátva. Ahhoz, hogy megtudja, melyik típusról van szó, meg kell néznie a szenzoron található (apró) írást, vagy tesztelnie kell az eszköz azonosító bájtját. Úgy döntöttem, hogy egyetlen könyvtárba megyek. Úgy tűnik, hogy jól sikerült.

A visszajelzéseket, különösen a fejlesztési javaslatokat nagyra értékeljük.

A könyvtár funkciói és képességei

A könyvtár olyan szoftver, amely Alkalmazásprogramozási felületet (API) biztosít a programozó számára az eszköz képességeinek gyakorlásához, anélkül, hogy szükségszerűen minden apró részlettel kellene foglalkoznia. Kívánatos, hogy az API egyszerű legyen a kezdők számára, egyszerű követelményekkel az induláshoz, miközben biztosítja az eszköz képességeinek teljes kihasználását. Kívánatos, hogy a könyvtár kövesse az eszköz gyártójának minden konkrét iránymutatását, valamint az általános szoftver helyes gyakorlatot. Mindezeket igyekeztem elérni. Amikor elkezdtem a BMP280 -at, 3 különböző könyvtárat találtam hozzá: Adafruit_BMP280; Seeed_BMP280; és az egyik a BMP280 nevű készülékgyártó. Sem az Adafruit, sem a Seeed nem nyújtott kibővített képességeket, bár jól működtek és könnyen használhatók az alapvető alkalmazásokhoz. Nem tudtam elképzelni, hogyan használjuk a készülékgyártó (Bosch Sensortec) által gyártott terméket. Ez lehet az én hiányosságom, nem az övék. Bár a könyvtár sokkal bonyolultabb volt, mint a másik kettő, nem találtam utasításokat vagy használati példákat (később találtam példákat a "bmp280_support.c" fájlban, ezek azonban nem voltak különösebben hasznosak számomra).

Ezen tényezők hatására úgy döntöttem, hogy saját könyvtárat írok a BMP280 számára.

A BME280 könyvtári helyzetét vizsgálva külön könyvtárakat találtam: Adafruit_BME280, Seed_BME280 és egy másik BME280_MOD-1022 könyvtárat, amelyet Embedded Adventures írt. Egyikük sem kombinálta a BMP280 funkcióit egy olyan könyvtárban, amely képes a BME280 használatára. Egyikük sem támogatta kifejezetten az eszközök azon képességét, hogy néhány bit adatot tároljanak, miközben az eszköz és a vezérlő mikroprocesszor alszik (ez a képesség nyilvánvaló az adatlapon, és támogatott az itt írt és leírt könyvtárban).

A kombinált könyvtárnak támogatnia kell a BME280 összes képességét, de ha BMP280 -mal használja, akkor nem róhat semmilyen költséget a fel nem használt funkciókból. A kombinált könyvtár előnyei közé tartozik a kevesebb kezelendő könyvtári fájl, a különböző eszközök egyszerű keverése ugyanazon projektben, valamint a karbantartási vagy frissítési egyszerűsített módosítások, amelyeket csak egy helyen kell elvégezni. Ezek valószínűleg egészen kicsik, sőt jelentéktelenek, de…

A készülék képességei

A BMP280 és a BME280 körülbelül 5 mm-es négyzet alakú és 1 mm magas felületre szerelhető eszközök. 8 interfész párna található, köztük 2 külön tápegység és két földelő párna. Az eBay -en modulként kaphatók, 4 vagy 6 tűvel. A 4 tűs modul fix I2C címmel rendelkezik, és nem konfigurálható az SPI protokoll használatára.

A 6 tűs modul vagy a csupasz eszköz akár I2C, akár SPI protokollokkal használható. I2C módban két különböző címmel rendelkezhet, amelyeket úgy érhet el, hogy az SDO tűt a földhöz (alapcím = 0x76) vagy a Vdd -hez (+1 = 0x77 alapcímhez) csatlakoztatja. SPI módban a szokásos elrendezése 1 óra, 2 adat (egy -egy irány) és egy eszközválasztó csap (CS).

Az itt írt és leírt könyvtár csak az I2C -t támogatja. Az Adafruit_BMP280 és a BME_MOD-1022 könyvtárak támogatják mind az i2C, mind az SPI szolgáltatást.

A könyvtár letölthető innen:

github.com/farmerkeith/BMP280-library

1. lépés: A hardver beállítása

A hardver beállítása
A hardver beállítása

Mielőtt a könyvtár hasznos lehet, szükség van egy mikrokontroller csatlakoztatására a BMP280 -hoz (vagy kettőhöz, ha szeretné).

WeMos D1 mini pro -t használtam, ezért megmutatom az összefüggéseit. A többi mikrokontroller hasonló lesz, csak az SDA és az SCL csapokat kell megfelelően csatlakoztatni.

A WeMos D1 mini pro esetében a csatlakozók a következők:

Funkció WeMos csap BMP280 tű Megjegyzések

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Névleges 3.3V Ground GND Címvezérlés SDO Ground vagy Vdd I2C select CSB Vdd (GND kiválasztja az SPI -t)

Ne feledje, hogy az MP280 modulok egyes SDO csapjai SDD, a Vdd csapok pedig VCC feliratúak. Megjegyzés: Az SDA és SCL vonalaknak felhúzó ellenállásokkal kell rendelkezniük a vonal és a Vin csap között. Általában a 4.7K értéknek rendben kell lennie. Néhány BMP280 és BME280 modul 10K felhúzó ellenállást tartalmaz a modulban (ez nem jó gyakorlat, mivel több eszköz elhelyezése az I2C buszon túlzottan terhelheti). Mindazonáltal 2 BME/P280 modul használata 10K ellenállással nem okozhat problémát a gyakorlatban, amíg nincs túl sok más eszköz ugyanazon a buszon, szintén felhúzó ellenállásokkal.

Miután csatlakoztatta a hardvert, könnyen ellenőrizheti, hogy készüléke BMP280 vagy BME280 típusú, az I2CScan_ID vázlat futtatásával, amelyet itt talál:

Azt is ellenőrizheti, hogy rendelkezik -e BMP280 vagy BME280 készülékkel, ha megnézi magát a készüléket. Szükségesnek tartottam, hogy ehhez digitális mikroszkópot használjak, de ha nagyon jó a látásod, akkor ezt minden segédeszköz nélkül megteheted. A készülék burkolatán két sor nyomtatás látható. A kulcs a második sor első betűje, amely BMP280 készülékek esetén "K", BME280 készülékek esetén "U" betű.

2. lépés: A könyvtár által biztosított API -k

A könyvtár által biztosított API -k
A könyvtár által biztosított API -k
A könyvtár által biztosított API -k
A könyvtár által biztosított API -k

Beleértve a könyvtárat egy vázlatba

A könyvtárat a vázlat tartalmazza szabványos módon az utasítás használatával

#include "farmerkeith_BMP280.h"

Ezt az állítást be kell illeszteni a vázlat korai részébe a setup () függvény elindítása előtt.

BME vagy BMP szoftver objektum létrehozása

A BMP280 szoftverobjektum létrehozásához 3 szint áll rendelkezésre. A legegyszerűbb csak

bme280 objectName; vagy bmp280 objectName;

például BMP280 bmp0;

Ez létrehoz egy szoftverobjektumot, amelynek alapértelmezett címe 0x76 (azaz a földhöz csatlakoztatott SDO esetén).

A BME280 vagy BMP280 szoftverobjektum létrehozásának következő szintje 0 vagy 1 paraméterrel rendelkezik, az alábbiak szerint:

bme280 objectNameA (0);

bmp280 objectNameB (1);

A paramétert (0 vagy 1) hozzáadjuk az I2C alapcímhez, így két BME280 vagy BMP280 eszköz használható ugyanazon az I2C buszon (beleértve egyet -egyet).

A BME vagy BMP280 szoftverobjektumok létrehozásának harmadik szintje két paraméterrel rendelkezik. Az első paraméter, amely 0 vagy 1, a címre vonatkozik, mint az előző esetben. A második paraméter a hibakeresési nyomtatást vezérli. Ha 1 -re van állítva, a szoftverobjektummal végrehajtott minden tranzakció Serial.print kimenetet eredményez, amely lehetővé teszi a programozó számára, hogy lássa a tranzakció részleteit. Például:

bmp280 objectNameB (1, 1);

Ha a hibakeresési nyomtatási paraméter 0 -ra van állítva, a szoftverobjektum visszatér a normál viselkedéshez (nincs nyomtatás).

Ezt az állítást vagy állításokat a #include után és a setup () függvény előtt kell feltüntetni.

A BME vagy BMP szoftverobjektum inicializálása

Használat előtt ki kell olvasni a készülék kalibrálási paramétereit, és konfigurálni kell azokat bármilyen mérési módhoz, túlmintavételhez és szűrőbeállításhoz.

Egyszerű, általános célú inicializáláshoz a következő állítás:

objectName.begin ();

A begin () ezen verziója beolvassa a készülék kalibrálási paramétereit, és beállítja az osrs_t = 7 (16 hőmérséklet -mérés), az osrs_p = 7 (16 nyomásmérés), a mode = 3 (folyamatos, normál), t_sb = 0 értéket (0,5 ms alvás között mérőkészletek), szűrő = 0 (K = 1, tehát nincs szűrés) és spiw_en = 0 (SPI le van tiltva, ezért használja az I2C -t). A BME280 esetében van egy extra paraméter, az osrs_h = 7 a 16 páratartalom méréshez.

A start () egy másik változata is tartalmazza mind a hat (vagy 7) paramétert. A fenti állítás megfelelője

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

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

A kódok és jelentésük teljes listája megtalálható a BME280 és BMP280 adatlapon, valamint a könyvtár.cpp fájljában található megjegyzésekben.

Egyszerű hőmérséklet- és nyomásmérés

A hőmérséklet mérésének legegyszerűbb módja

dupla hőmérséklet = objectName.readTemperature (); // hőmérséklet mérése

A nyomásmérés legegyszerűbb módja

kettős nyomás = objectName.readPressure (); // nyomás mérése

A páratartalom mérésének legegyszerűbb módja

dupla páratartalom = objectName.readHumidity (); // páratartalom mérése (csak BME280)

A hőmérséklet és a nyomás meghatározásához a fenti két állítás egymás után használható, de van egy másik lehetőség is:

dupla hőmérséklet;

kettős nyomás = objectName.readPressure (hőmérséklet); // nyomás és hőmérséklet mérése

Ez az állítás csak egyszer olvassa be a BME280 vagy BMP280 eszköz adatait, és visszaadja a hőmérsékletet és a nyomást. Ez valamivel hatékonyabb az I2C busz használata, és biztosítja, hogy a két leolvasás ugyanazon mérési ciklusnak feleljen meg.

A BME 280 esetében mindhárom érték (páratartalom, hőmérséklet és nyomás) kombinált állítása:

dupla hőmérséklet, nyomás; kettős páratartalom = objectName.readHumidity (hőmérséklet, nyomás); // páratartalom, nyomás és hőmérséklet mérése

Ez az utasítás csak egyszer olvassa be a BMP280 eszköz adatait, és mindhárom értéket adja vissza. Ez valamivel hatékonyabb az I2C busz használata, és biztosítja, hogy a három leolvasás ugyanazon mérési ciklusnak feleljen meg. Ne feledje, hogy a változók neve bármire megváltoztatható, ami a felhasználónak tetszik, de a sorrendjük rögzített - a hőmérséklet az első, a nyomás a második.

Ezeket a használati eseteket a könyvtárhoz mellékelt példavázlatok tartalmazzák, amelyek a következők: basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino és basicHumidityAndTemperatureAndPressure.ino.

Kifinomultabb hőmérséklet- és nyomásmérés

Bár a fenti állítássorozat problémamentesen fog működni, van néhány probléma:

  1. a készülék folyamatosan működik, ezért a maximális szinten fogyaszt energiát. Ha az energia akkumulátorból származik, akkor ezt csökkenteni kell.
  2. a fogyasztott energia miatt a készülék felmelegedést tapasztal, ezért a mért hőmérséklet magasabb lesz, mint a környezeti hőmérséklet. Erről bővebben kitérek egy későbbi lépésben.

A kevesebb energiát fogyasztó és a környezethez közelebbi hőmérsékletet adó eredményt a start () paraméterrel lehet elérni, amely alvó állapotba hozza (pl. Mód = 0). Például:

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

Ezután, amikor mérést kíván végezni, ébressze fel a készüléket egy konfigurációs paranccsal az F2 (ha szükséges) és az F4 regisztrálására, amely beállítja az osrs_h, osrs_t és osrs_p megfelelő értékeket, plusz mód = 1 (egyszeri felvételi mód). Például:

[objectName.updateF2Control (1);] // osrs_h - soha nem szükséges a BMP280 -hoz, // és nem szükséges a BME280 esetében, ha a mérések száma nem változik // a start () értékből. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mód

Miután felébresztette a készüléket, elkezdi a mérést, de az eredmény néhány milliszekundumig nem lesz elérhető - legalább 4 ms, esetleg 70 ms vagy tovább, a megadott mérések számától függően. Ha az olvasási parancs azonnal elküldésre kerül, az eszköz visszaadja az előző mérés értékeit - ami bizonyos alkalmazásokban elfogadható lehet, de a legtöbb esetben valószínűleg jobb késleltetni az új mérés elérhetőségét.

Ezt a késleltetést többféleképpen is meg lehet tenni.

  1. várjon egy meghatározott ideig, hogy fedezze a leghosszabb várható késést
  2. várjon egy időt, amelyet a maximális mérési idő mérésenként (azaz 2,3 ms) és a mérések számának, valamint a rezsiköltségnek és a margónak a számításával kell kiszámítani.
  3. várjon egy rövidebb időt a fentiek szerint számítva, de a névleges mérési idő (azaz 2 ms) és a rezsi felhasználásával, majd kezdje el ellenőrizni a "mérés" bitet az állapotregiszterben. Ha az állapotbit 0 -t mutat (azaz nem mér), akkor kapja meg a hőmérséklet és a nyomás leolvasását.
  4. azonnal kezdje el ellenőrizni az állapotregisztert, és kapja meg a hőmérséklet- és nyomásértékeket, amikor az állapotbit 0 -t mutat,

Kicsit később mutatok erre egy példát.

Konfigurációs nyilvántartási műveletek

Mindezek megvalósításához több olyan eszközre van szükségünk, amelyeket még nem mutattam be. Ők:

bájt olvasás Regisztráció (reg)

void updateRegister (reg, érték)

Mindegyiknek több származtatott parancsa van a könyvtárban, amelyek kissé egyszerűbbé teszik az adott műveletekhez szükséges szoftvert.

A powerSaverPressureAndTemperature.ino példa a 3. módszert használja. Az ismételt ellenőrzést végző kódsor

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

Vegye figyelembe, hogy ez a vázlat egy ESP8266 mikrokontrollerhez készült. WeMos D1 mini pro -t használtam. A vázlat nem fog működni az Atmega mikrovezérlőkkel, amelyek eltérő utasításokkal rendelkeznek az alváshoz. Ez a vázlat számos más parancsot is gyakorol, ezért mindegyiket bemutatom, mielőtt részletesebben leírnám ezt a vázlatot.

Ha a mikrokontroll párhuzamosan alszik a BMP280 érzékelővel, az érzékelő konfigurálása a szükséges mérésekhez a start () parancsban elvégezhető, a 6 paraméter használatával. Ha azonban a mikrokontroller nem alszik, de az érzékelő igen, akkor a méréskor az érzékelőt fel kell ébreszteni, és meg kell mondani a mérési konfigurációt. Ezt közvetlenül meg lehet tenni

updateRegister (reg, érték)

de egy kicsit könnyebb a következő három paranccsal:

updateF2Control (osrs_h); // csak BME280

updateF4Control (osrs_t, osrs_p, mód); updateF5Config (t_sb, filter, spi3W_en);

Ha a mérés elvégzése után az egyszeri felvétel módot (kényszerített módot) használja, akkor a készülék automatikusan visszatér alvó állapotba. Ha azonban a mérési készlet több, folyamatos (normál) üzemmódú mérést tartalmaz, akkor a BMP280 -at vissza kell kapcsolni alvó állapotba. Ezt a következő két parancs egyikével teheti meg:

updateF4Control16xSleep ();

updateF4ControlSleep (érték);

Mindkettő az üzemmód bitjeit 00 -ra állítja (azaz alvó üzemmódba). Az első azonban az osrs_t és osrs_p értékeket 111 -re állítja (azaz 16 mérést), míg a második tárolja az alacsony 6 bitet az "értékből" a 0xF4 regiszter 7: 2 bitjébe.

Hasonlóképpen a következő állítás az "érték" alacsony hat bitjét tárolja a 0xF5 regiszter 7: 2 bitjeiben.

updateF5ConfigSleep (érték);

Ez utóbbi parancsok használata lehetővé teszi 12 bit információ tárolását az F4 és F5 BMP280 regiszterekben. Legalábbis az ESP8266 esetében, amikor a mikrokontroller alvás után felébred, a vázlat elején indul, és nem ismeri az alvásparancs előtti állapotát. Az alvásparancs előtti állapotának ismereteinek megőrzése érdekében az adatok tárolhatók a flash memóriában az EEPROM funkciók használatával vagy egy fájl SPIFFS használatával történő írásával. A flash memória azonban korlátozza az írási ciklusok számát, 10 000 és 100 000 között. Ez azt jelenti, hogy ha a mikrokontroller néhány másodpercenként alvó-ébresztő cikluson megy keresztül, akkor meghaladhatja a megengedett memóriaírást limit néhány hónap alatt. Néhány bit adat tárolása a BMP280 -ban nincs ilyen korlátozás.

Az F4 és F5 regiszterekben tárolt adatok helyreállíthatók, amikor a mikrokontroller felébred a parancsok használatával

readF4Sleep ();

readF5Sleep ();

Ezek a funkciók beolvassák a megfelelő regisztert, eltolják a tartalmat a 2 LSB eltávolításához, és visszaadják a fennmaradó 6 bitet. Ezeket a funkciókat a powerSaverPressureAndTemperatureESP.ino vázlatpéldában a következőképpen használjuk:

// olvassa vissza az EventCounter értékét a bmp0 -ból

bájt bmp0F4érték = bmp0.readF4Sleep (); // 0-63 bájt bmp0F5value = bmp0.readF5Sleep (); // 0-63 eventCounter = bmp0F5value*64+bmp0F4value; 0 és 4095 között

Ezek a funkciók beolvassák a megfelelő regisztert, eltolják a tartalmat a 2 LSB eltávolításához, és visszaadják a fennmaradó 6 bitet. Ezeket a funkciókat a powerSaverPressureAndTemperature.ino vázlatpéldában a következőképpen használjuk:

// olvassa vissza az EventCounter értékét a bmp1 -ből

bájt bmp1F4érték = bmp1.readF4Sleep (); // 0-63 bájt bmp1F5value = bmp1.readF5Sleep (); // 0-63 eventCounter = bmp1F5value*64+bmp1F4value; 0 és 4095 között

Nyers hőmérséklet és nyomás funkciók

Az alapvető olvasási hőmérséklet, olvasási nyomás és olvasási páratartalom funkciók két összetevőből állnak. Először a nyers 20 bites hőmérséklet- és nyomásértékeket kapjuk meg a BME/P280-ból, vagy a nyers 16 bites páratartalom értékeket a BME280-ból. Ezután a kompenzációs algoritmust használva a kimeneti értékeket Celsius fokban, hPa -ban vagy %RH -ban állítjuk elő.

A könyvtár külön funkciókat biztosít ezeknek az összetevőknek, így a nyers hőmérséklet-, nyomás- és páratartalom -adatok beszerezhetők, és esetleg valamilyen módon manipulálhatók. Az algoritmus a hőmérséklet, a nyomás és a páratartalom levezetésére ezekből a nyers értékekből szintén rendelkezésre áll. A könyvtárban ezeket az algoritmusokat kettős hosszúságú lebegőpontos aritmetikával valósítják meg. Jól működik az ESP8266-on, amely 32 bites processzor, és 64 bitet használ a „kettős” lebegő változókhoz. Ezen funkciók hozzáférhetővé tétele hasznos lehet más platformok számításának értékeléséhez és esetleges megváltoztatásához.

Ezek a funkciók:

readRawPressure (rawTemperature); // beolvassa a nyers nyomás és hőmérséklet adatokat a BME/P280readRawHumidity (rawTemperature, rawPressure); // a nyers páratartalom, hőmérséklet és nyomás adatokat olvassa be a BME280 calcTemperature (rawTemperature, t_fine) értékéből; calcPressure (nyersnyomás, t_finom); calcHumidity (rawHumidity, t_fine)

Ezen funkciók "t-fine" érve egy kis magyarázatot érdemel. Mind a nyomás-, mind a páratartalom -kompenzációs algoritmusok hőmérsékletfüggő komponenst tartalmaznak, amelyet a t_fine változón keresztül érnek el. A calcTemperature függvény t_finom értéket ír a hőmérséklet -kompenzációs algoritmus logikája alapján, amelyet ezután bemenetként használ a calcPressure és a calcHumidity egyaránt.

E funkciók használatára példa található a rawPressureAndTemperature.ino vázlat példájában, valamint a könyvtár.cpp fájljában található readHumidity () függvény kódjában is.

Magasság és tengerszint nyomás

Ismert összefüggés van a légköri nyomás és a tengerszint feletti magasság között. Az időjárás is befolyásolja a nyomást. Amikor az időjárási szervezetek közzéteszik a légköri nyomással kapcsolatos információkat, általában a tengerszint feletti magassághoz igazítják őket, így a "szinoptikus diagram" az átlagos tengerszintre szabványosított izobárokat (állandó nyomásvonalak) mutatja. Tehát valóban 3 érték van ebben a kapcsolatban, és kettő ismerete lehetővé teszi a harmadik levezetését. A 3 érték a következő:

  • tengerszint feletti magasság
  • tényleges légnyomás ezen a magasságon
  • egyenértékű légnyomás a tengerszinten (szigorúbban az átlagos tengerszint, mert a pillanatnyi tengerszint folyamatosan változik)

Ez a könyvtár két funkciót biztosít a kapcsolathoz, az alábbiak szerint:

calcAltitude (nyomás, tengerLevelhPa);

calcNormalized Pressure (nyomás, magasság);

Van egy egyszerűsített változat is, amely a szabványos 1013,15 hPa tengerszintű nyomást feltételezi.

calcAltitude (nyomás); // standard seaLevelPressure feltételezve

3. lépés: A BMP280 eszköz adatai

BMP280 eszköz adatai
BMP280 eszköz adatai

Hardver képességek

A BMP280 2 bájt konfigurációs adatokkal rendelkezik (0xF4 és 0xF5 regisztercímeken), amelyek több mérési és adatkimeneti beállítás vezérlésére szolgálnak. Ezenkívül 2 bit állapotinformációt és 24 bájt kalibrációs paramétert is tartalmaz, amelyeket a nyers hőmérséklet- és nyomásértékek hagyományos hőmérsékleti és nyomásegységekké történő átalakítására használnak. A BME280 további adatokat tartalmaz a következők szerint:

  • 1 extra bájt konfigurációs adat a 0xF2 regisztercímen több páratartalom mérésére;
  • 8 extra bájt kalibrációs paraméter, amelyet a nyers páratartalom értékének relatív páratartalom százalékra való átalakításához használnak.

A BME280 hőmérséklet-, nyomás- és állapotregiszterei ugyanazok, mint a BMP280 -nál, kisebb kivételekkel, az alábbiak szerint:

  • a BME280 "ID" bitjei 0x60 -ra vannak állítva, így meg lehet különböztetni a BMP280 -tól, amely lehet 0x56, 0x57 vagy 0x58
  • az alvásidő -vezérlőt (t_sb) úgy módosítják, hogy a BMP280 két hosszú ideje (2000 ms és 4000 ms) a BME280 -ban 10 ms és 20 ms rövid idővel helyettesül. A BME280 maximális alvási ideje 1000 ms.
  • A BME280 -ban a hőmérséklet és a nyomás nyers értéke mindig 20 bit, ha szűrést alkalmaznak. A 16–19 bites értékek használata csak szűrés nélküli esetekre korlátozódik (azaz szűrő = 0).

A hőmérséklet és a nyomás mindegyike 20 bites érték, amelyet egy hagyományos hőmérsékletre és nyomásra kell átalakítani egy meglehetősen bonyolult algoritmus segítségével, 3 16 bites kalibrációs paraméterekkel a hőmérséklethez és 9 16 bites kalibrációs paraméterekkel, valamint a nyomás hőmérsékletével. A hőmérsékletmérés szemcséssége 0,0003 Celsius fok a legkevésbé szignifikáns bitváltozás esetén (20 bites leolvasás), és 0,0046 Celsius fokra nő, ha a 16 bites leolvasást használja.

A páratartalom egy 16 bites érték, amelyet relatív páratartalommá kell alakítani egy másik komplex algoritmus segítségével, 6 kalibrációs paramétert használva, amelyek 8, 12 és 16 bit keverékéből állnak.

Az adatlap a hőmérséklet-leolvasás abszolút pontosságát mutatja +-0,5 C-nál 25 C-on és +-1 C-on a 0 és 65 C közötti tartományban.

A nyomásmérés szemcséssége 0,15 Pascals (azaz 0,0015 hectoPascals) 20 bites felbontásnál, vagy 2,5 Pascals 16 bites felbontásnál. A nyersnyomás értékét befolyásolja a hőmérséklet, így 25 ° C körül, 1 ° C -os hőmérséklet -emelkedés 24 Pascal -kal csökkenti a mért nyomást. A hőmérsékletérzékenységet a kalibrációs algoritmus veszi figyelembe, így a leadott nyomásértékeknek pontosnak kell lenniük különböző hőmérsékleten.

Az adatlap a nyomásleolvasás abszolút pontosságát mutatja +-1 hPa értéken 0 C és 65 C közötti hőmérsékleten.

A páratartalom pontosságát az adatlapon +-3% relatív páratartalom és +-1% hiszterézis adja meg.

Hogyan működik

A 24 bájt hőmérséklet- és nyomáskalibrációs adatokat, valamint a BME280 esetében a 8 bájtos páratartalom -kalibrálási adatokat ki kell olvasni a készülékről, és változókban kell tárolni. Ezeket az adatokat a gyárban egyedileg programozzák a készülékbe, ezért a különböző eszközök eltérő értékekkel rendelkeznek - legalábbis néhány paraméter esetében. A BME/P280 két állapot egyikében lehet. Az egyik állapotban mér. A másik állapotban várakozik (alszik).

Hogy melyik állapotban van, a 0xF3 regiszter 3. bitjével ellenőrizheti.

A legutóbbi mérés eredményei bármikor elérhetők a megfelelő adatérték leolvasásával, függetlenül attól, hogy az eszköz alszik vagy mér.

A BME/P280 működtetésének két módja is van. Az egyik a Folyamatos mód (az adatlapon Normál módnak nevezik), amely ismételten vált a mérési és az alvó állapot között. Ebben az üzemmódban a készülék mérési sorozatot hajt végre, majd alszik, majd újabb mérési sorozatra ébred, és így tovább. Az egyedi mérések száma és a ciklus alvó részének időtartama a konfigurációs regisztereken keresztül szabályozható.

A BME/P280 működésének másik módja az egyszeri felvétel mód (az adatlapon kényszerített módnak nevezik). Ebben az üzemmódban a készülék felébreszti az alvó állapotot egy mérési paranccsal, elvégzi a mérések sorozatát, majd visszatér alvó állapotba. A készlet egyedi méréseinek számát a konfigurációs parancs vezérli, amely felébreszti az eszközt.

Ha a BMP280 -ban egyetlen mérést végeznek, akkor az érték 16 legjelentősebb bitje kerül feltöltésre, és az értékkiolvasás négy legkevésbé jelentős bitje mind nulla. A mérések száma 1, 2, 4, 8 vagy 16 értékre állítható, és a mérések számának növekedésével nő az adatokkal feltöltött bitek száma, így 16 méréssel mind a 20 bit mérési adatokkal lesz feltöltve. Az adatlap ezt a folyamatot mintavételnek nevezi.

A BME280 -ban ugyanez az elrendezés érvényes mindaddig, amíg az eredmény nincs szűrve. Szűrés használata esetén az értékek mindig 20 bitesek, függetlenül attól, hogy hány mérést végeznek az egyes mérési ciklusokban.

Minden egyes mérés körülbelül 2 ezredmásodpercet vesz igénybe (tipikus érték; a maximális érték 2,3 ms). Ha ehhez hozzávesszük a körülbelül 2 ms -os rögzített általános költséget (általában valamivel kevesebbet), az azt jelenti, hogy egy mérési sorozat, amely 1–32 egyedi mérésből állhat, 4–66 ms -ig tarthat.

Az adatlap a hőmérséklet és a nyomás túlmintavételének javasolt kombinációit tartalmazza a különböző alkalmazásokhoz.

Konfiguráció -vezérlő regiszterek

A BMP280 két konfigurációs vezérlő regisztere a 0xF4 és 0xF5 regisztercímeken található, és 6 egyedi konfigurációs vezérlőértékre van leképezve. A 0xF4 a következőkből áll:

  • 3 bit osrs_t (mérje a hőmérsékletet 0, 1, 2, 4, 8 vagy 16 -szor);
  • 3 bit osrs_p (mérje a nyomást 0, 1, 2, 4, 8 vagy 16 alkalommal); és
  • 2 bites mód (alvó, kényszerített (azaz egyszeri felvétel), normál (azaz folyamatos)).

A 0xF5 a következőkből áll:

  • 3 bit t_sb (készenléti idő, 0,5 ms - 4000 ms);
  • 3 bites szűrő (lásd alább); és
  • 1 bites spiw_en, amely kiválasztja az SPI -t vagy az I2C -t.

A szűrőparaméter egyfajta exponenciális bomlási algoritmust vagy Infinite Impulse Response (IIR) szűrőt vezérel, amelyet a nyers nyomás és hőmérséklet mérési értékeire alkalmaznak (de nem a páratartalom értékekre). Az egyenletet az adatlap tartalmazza. Egy másik bemutató:

Érték (n) = Érték (n-1) * (K-1) / K + mérés (n) / K

ahol (n) a legutóbbi mérési és kimeneti értéket jelzi; és K a szűrő paramétere. A K szűrőparaméter és beállítható 1, 2, 4, 8 vagy 16 értékre. Ha K értékét 1 -re állítja, akkor az egyenlet csak Érték (n) = mérés (n) lesz. A szűrőparaméter kódolása a következő:

  • szűrő = 000, K = 1
  • szűrő = 001, K = 2
  • szűrő = 010, K = 4
  • szűrő = 011, K = 8
  • szűrő = 1xx, K = 16

A BME 280 további konfiguráció-vezérlő regisztert ad hozzá a 0xF2, "ctrl_hum" címhez, egyetlen 3 bites osrs_h paraméterrel (páratartalom mérése 0, 1, 2, 4, 8 vagy 16-szor).

4. lépés: Mérés és leolvasási időzítés

Ezt később hozzá kívánom adni, bemutatva a parancsok és a mérési válaszok időzítését.

Iddt - áram a hőmérséklet mérésénél. Tipikus értéke 325 uA

Iddp - áram nyomásméréskor. Tipikus érték 720 uA, max 1120 uA

Iddsb - aktuális készenléti állapotban. Tipikus érték 0,2 uA, max 0,5 uA

Iddsl - aktuális alvó üzemmódban. Tipikus érték 0,1 uA, max 0,3 uA

5. lépés: Szoftverre vonatkozó irányelvek

Szoftver irányelvek
Szoftver irányelvek
Szoftver irányelvek
Szoftver irányelvek

I2C sorozatfelvételi mód

A BMP280 adatlap útmutatást nyújt az adatok kiolvasásához (3.9. Szakasz). Azt írja, hogy "erősen ajánlott a sorozatolvasás használata, és nem minden címtár külön címzése. Ez megakadályozza a különböző mérésekhez tartozó bájtok esetleges keveredését és csökkenti az interfész forgalmát." Nincs útmutatás a kompenzációs/kalibrálási paraméterek leolvasására vonatkozóan. Feltehetően ezek nem jelentenek problémát, mert statikusak és nem változnak.

Ez a könyvtár egyetlen olvasási művelet során leolvassa az összes szomszédos értéket - 24 bájt a hőmérséklet- és nyomáskompenzációs paraméterek esetén, 6 bájt a hőmérséklet és a nyomás együtt, valamint 8 bájt a páratartalom, a hőmérséklet és a nyomás együtt. Ha csak a hőmérsékletet ellenőrzi, csak 3 bájt olvasható ki.

Makrók használata (#define stb.)

Ebben a könyvtárban nincsenek makrók, kivéve a szokásos "include guard" könyvtárat, amely megakadályozza a többszörözést.

Minden konstans a const kulcsszó segítségével van definiálva, és a hibakeresési nyomtatást a szabványos C funkciók vezérlik.

Számomra ez bizonytalanság forrása volt, de a sok hozzászólás olvasása közben kapott tanácsom az, hogy a #define használata az állandók deklarálásához (legalábbis) és (valószínűleg) a hibakeresési nyomtatásvezérlés szükségtelen és nem kívánatos.

A const használata a #define helyett elég világos - a const ugyanazokat az erőforrásokat használja, mint a #define (azaz nulla), és a kapott értékek követik a hatókör szabályait, ezáltal csökkentve a hibák esélyét.

A hibakeresési nyomtatás vezérlésének esete egy kicsit kevésbé világos, mert az általam elvégzett módszer azt jelenti, hogy a végső kód tartalmazza a hibakeresési nyomtatási utasítások logikáját, annak ellenére, hogy azokat soha nem gyakorolják. Ha a könyvtárat egy nagy projektben kívánják használni egy nagyon korlátozott memóriájú mikrokontrolleren, ez problémát okozhat. Mivel a fejlesztésem egy ESP8266 -on történt, nagy flash memóriával, ez nem tűnt számomra problémának.

6. lépés: Hőmérsékleti teljesítmény

Ezt tervezem később hozzáadni.

7. lépés: Nyomás teljesítménye

Ezt tervezem később hozzáadni.

Ajánlott: