Përmbajtje:

Biblioteka për BMP280 dhe BME280: 7 hapa
Biblioteka për BMP280 dhe BME280: 7 hapa

Video: Biblioteka për BMP280 dhe BME280: 7 hapa

Video: Biblioteka për BMP280 dhe BME280: 7 hapa
Video: Arduino Nano, BME280 и SSD1306 OLED-метеостанция 2024, Korrik
Anonim
Biblioteka për BMP280 dhe BME280
Biblioteka për BMP280 dhe BME280
Biblioteka për BMP280 dhe BME280
Biblioteka për BMP280 dhe BME280
Biblioteka për BMP280 dhe BME280
Biblioteka për BMP280 dhe BME280

Prezantimi

Unë nuk vendosa të shkruaj këtë bibliotekë. "Ndodhi" si një efekt anësor i një projekti që fillova që përdor një BMP280. Ai projekt ende nuk ka përfunduar, por mendoj se biblioteka është gati për ta ndarë me të tjerët. Më pas më lindi nevoja për të përdorur një BME280, e cila shton matjen e lagështisë në presionin dhe temperaturën e aftësisë së BMP280. BME280 është "i pajtueshëm prapa" me BMP280 - domethënë, të gjithë regjistrat dhe hapat e nevojshëm për të lexuar presionin dhe temperaturën nga BME280 janë të njëjta me ato të përdorura për BMP280. Ekzistojnë regjistra dhe hapa shtesë të nevojshëm për të lexuar lagështinë, të zbatueshme vetëm për BME280. Kjo ngre pyetjen, një bibliotekë për të dyja, ose dy biblioteka të veçanta. Pajisjet kompjuterike për dy llojet e pajisjeve janë plotësisht të këmbyeshme. Edhe shumë nga modulet që shiten (për shembull në Ebay dhe AliExpress) janë etiketuar BME/P280. Për të zbuluar se cili lloj është, duhet të shikoni shkrimin (e vogël) në vetë sensorin, ose të provoni bajtin e ID -së së pajisjes. Vendosa të shkoj në një bibliotekë të vetme. Duket se ka funksionuar në rregull.

Reagimet, veçanërisht çdo sugjerim për përmirësime, do të vlerësohen.

Karakteristikat dhe aftësitë e bibliotekës

Një bibliotekë është një pjesë e softuerit që siguron një Ndërfaqe Programimi Aplikimi (API) për një programues që të ushtrojë aftësitë e pajisjes, pa pasur nevojë të merret me të gjitha detajet e imëta. Në mënyrë të dëshirueshme, API duhet të jetë e lehtë për një fillestar me kërkesa të thjeshta për të filluar, ndërsa siguron shfrytëzimin e plotë të aftësive të pajisjes. Me dëshirë biblioteka duhet të ndjekë çdo udhëzim specifik nga prodhuesi i pajisjes, si dhe praktikat e përgjithshme të mira softuerike. Unë jam përpjekur t’i arrij të gjitha këto. Kur fillova me BMP280, gjeta 3 biblioteka të ndryshme për të: Adafruit_BMP280; Shihet_BMP280; dhe një të quajtur BMP280 nga prodhuesi i pajisjes. As Adafruit as Seeed nuk ofruan aftësi të zgjeruara, megjithëse ato funksionuan mirë dhe ishin të lehta për t'u përdorur për aplikimet themelore. Nuk mund ta kuptoja se si ta përdorim atë të prodhuar nga prodhuesi i pajisjes (Bosch Sensortec). Kjo mund të jetë mangësia ime, sesa e tyre. Sidoqoftë, biblioteka ishte shumë më e ndërlikuar se dy të tjerat, nuk gjeta ndonjë udhëzim ose shembuj përdorimi (më vonë gjeta shembuj që ishin në skedarin "bmp280_support.c", megjithatë këto nuk ishin veçanërisht të dobishme për mua).

Si rezultat i këtyre faktorëve, vendosa të shkruaj bibliotekën time për BMP280.

Duke parë situatën e bibliotekës për BME280, gjeta biblioteka të veçanta Adafruit_BME280, Seed_BME280 dhe një tjetër BME280_MOD-1022 të shkruar nga Embedded Adventures. Asnjë prej tyre nuk i kombinoi funksionet për BMP280 në një bibliotekë të aftë për të përdorur BME280. Asnjëra prej tyre nuk e mbështeti shprehimisht aftësinë e pajisjeve për të ruajtur disa pjesë të të dhënave ndërsa pajisja dhe mikroprocesori i saj kontrollues janë në gjumë (kjo aftësi është e dukshme në fletën e të dhënave dhe mbështetet në bibliotekën që kam shkruar dhe përshkruar këtu).

Një bibliotekë e kombinuar duhet të ketë mbështetje për të gjitha aftësitë e BME280, por kur përdoret me një BMP280 nuk duhet të imponojë asnjë ngarkesë nga funksionet e papërdorura. Përfitimet e një biblioteke të kombinuar përfshijnë më pak skedarë bibliotekash për tu menaxhuar, përzierje të lehtë të pajisjeve të ndryshme në të njëjtin projekt dhe ndryshime të thjeshta për mirëmbajtje ose azhurnime të cilat duhet të bëhen vetëm në një vend dhe jo në dy. Këto janë ndoshta të gjitha fare të vogla, madje të parëndësishme, por…

Aftësitë e pajisjes

BMP280 dhe BME280 janë pajisje të montimit në sipërfaqe rreth 5mm katrorë dhe 1 mm të lartë. Ka 8 pads ndërfaqe, duke përfshirë 2 pads të veçanta të dhëna të energjisë dhe dy pads Ground. Ato janë të disponueshme në eBay si modul me 4 ose 6 kunja të nxjerra. Moduli 4-pin ka një adresë fikse I2C dhe nuk mund të konfigurohet për të përdorur protokollin SPI.

Moduli 6-pin ose pajisja e zhveshur mund të përdoret me protokollet I2C ose SPI. Në modalitetin I2C mund të ketë dy adresa të ndryshme, të arritura duke lidhur pinin SDO ose me Ground (për adresën bazë = 0x76) ose me Vdd (për adresën bazë +1 = 0x77). Në modalitetin SPI ka rregullimin e zakonshëm të 1 orës, 2 të dhënave (një për secilin drejtim) dhe një pin të zgjedhur të pajisjes (CS).

Biblioteka që kam shkruar dhe përshkruar këtu mbështet vetëm I2C. Bibliotekat Adafruit_BMP280 dhe BME_MOD-1022 kanë mbështetje si për i2C ashtu edhe për SPI.

Biblioteka mund të shkarkohet këtu:

github.com/farmerkeith/BMP280-library

Hapi 1: Konfigurimi i pajisjes

Konfigurimi i pajisjeve kompjuterike
Konfigurimi i pajisjeve kompjuterike

Para se biblioteka të jetë e dobishme është e nevojshme të lidhni një mikrokontrollues me BMP280 (ose me dy prej tyre nëse dëshironi).

Kam përdorur një WeMos D1 mini pro, kështu që unë do të tregoj lidhjet e tij. Mikrokontrolluesit e tjerë do të jenë të ngjashëm, ju vetëm duhet të lidhni saktë kunjat SDA dhe SCL.

Në rastin e WeMos D1 mini pro, lidhjet janë:

Funksioni WeMos pin BMP280 pin Shënime

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominale 3.3V Ground Kontrolli i adresës SDO Ground ose Vdd I2C zgjidhni CSB Vdd (GND zgjedh SPI)

Vini re se kunja SDO në disa nga modulet MP280 është etiketuar SDD, dhe kunja Vdd mund të etiketohet VCC. Shënim: Linjat SDA dhe SCL duhet të kenë rezistencë tërheqëse midis linjës dhe pinit Vin. Zakonisht një vlerë prej 4.7K duhet të jetë në rregull. Disa module BMP280 dhe BME280 kanë rezistenca tërheqëse 10K të përfshira në modul (gjë që nuk është praktikë e mirë, pasi vendosja e pajisjeve të shumta në autobusin I2C mund ta ngarkojë atë tepër). Sidoqoftë, përdorimi i 2 moduleve BME/P280 secila me një rezistencë 10K nuk duhet të jetë problem në praktikë për aq kohë sa nuk ka shumë pajisje të tjera në të njëjtin autobus gjithashtu me rezistorë tërheqës.

Pasi të keni lidhur pajisjen, mund të kontrolloni me lehtësi nëse pajisja juaj është BMP280 ose BME280 duke ekzekutuar skicën I2CScan_ID të cilën mund ta gjeni këtu:

Ju gjithashtu mund të kontrolloni nëse keni një BMP280 ose BME280 duke parë vetë pajisjen. E kam parë të nevojshme të përdor një mikroskop dixhital për ta bërë këtë, por nëse shikimi juaj është shumë i mirë, ju mund ta bëni atë pa asnjë ndihmë. Ekzistojnë dy rreshta printimi në zorrën e pajisjes. Çelësi është shkronja e parë në rreshtin e dytë, e cila në rastin e pajisjeve BMP280 është një "K" dhe në rastin e pajisjeve BME280 është një "U".

Hapi 2: API -të e ofruara nga Biblioteka

API -të e siguruara nga Biblioteka
API -të e siguruara nga Biblioteka
API -të e siguruara nga Biblioteka
API -të e siguruara nga Biblioteka

Përfshirja e bibliotekës në një skicë

Biblioteka përfshihet në një skicë në mënyrë standarde duke përdorur deklaratën

#përfshi "farmerkeith_BMP280.h"

Kjo deklaratë duhet të përfshihet në pjesën e hershme të skicës para fillimit të funksionit të konfigurimit ().

Krijimi i një objekti softverik BME ose BMP

Ekzistojnë 3 nivele për krijimin e objektit të softuerit BMP280. Më e thjeshta është vetëm

emri i objektit bme280; ose emri i objektit bmp280;

për shembull, BMP280 bmp0;

Kjo krijon një objekt softuerik me adresën e paracaktuar prej 0x76 (dmth. Për SDO të lidhur me tokën).

Niveli tjetër për krijimin e një objekti softuerik BME280 ose BMP280 ka një parametër 0 ose 1, si më poshtë:

bme280 objectNameA (0);

bmp280 objekt EmriB (1);

Parametri (0 ose 1) i shtohet adresës bazë të I2C, në mënyrë që dy pajisje BME280 ose BMP280 të mund të përdoren në të njëjtin autobus I2C (duke përfshirë një nga secila).

Niveli i tretë për krijimin e një objekti softuerik BME ose BMP280 ka dy parametra. Parametri i parë, i cili është ose 0 ose 1, është për adresën, si për rastin e mëparshëm. Parametri i dytë kontrollon printimin e korrigjimit. Nëse është vendosur në 1, çdo transaksion me objektin e softuerit rezulton në rezultate Serial.print që i mundësojnë programuesit të shohë detajet e transaksionit. Për shembull:

bmp280 objectNameB (1, 1);

Nëse parametri i printimit të korrigjimit është vendosur në 0, objekti i softuerit kthehet në sjellje normale (pa shtypje).

Kjo deklaratë ose deklarata duhet të përfshihet pas #include dhe para funksionit setup ().

Fillimi i objektit të softuerit BME ose BMP

Para përdorimit, është e nevojshme të lexoni parametrat e kalibrimit nga pajisja dhe ta konfiguroni për çfarëdo mënyre të matjes, parametrat e tepërt të mostrimit dhe filtrit.

Për një inicim të thjeshtë, me qëllim të përgjithshëm, deklarata është:

emri i objektit.filloj ();

Ky version i fillimit () lexon parametrat e kalibrimit nga pajisja dhe vendos osrs_t = 7 (16 matje të temperaturës), osrs_p = 7 (16 matje të presionit), modaliteti = 3 (i vazhdueshëm, Normal), t_sb = 0 (0.5 ms gjumë midis grupet e matjes), filtri = 0 (K = 1, pra pa filtrim) dhe spiw_en = 0 (SPI i çaktivizuar, prandaj përdorni I2C). Në rastin e BME280, ekziston një parametër shtesë osrs_h = 7 për 16 matje të lagështisë.

Ekziston një version tjetër i fillimit () që merr të gjashtë (ose 7) parametrat. Ekuivalenti i deklaratës së mësipërme është

emri i objektit.filloj (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en

ose objektName.fillo (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en, osrs_h

Lista e plotë e kodeve dhe kuptimet e tyre është në fletën e të dhënave BME280 dhe BMP280, dhe gjithashtu në komentet në skedarin.cpp në bibliotekë.

Matje e thjeshtë e temperaturës dhe presionit

Për të marrë një matje të temperaturës mënyra më e thjeshtë është

temperaturë e dyfishtë = objectName.readTemperature (); // mat temperaturën

Për të marrë një matje të presionit mënyra më e thjeshtë është

presion i dyfishtë = objektName.readPressure (); // mat presionin

Për të marrë një matje të lagështisë mënyra më e thjeshtë është

lagështia e dyfishtë = objektName.readHumidity (); // mat lagështinë (vetëm BME280)

Për të marrë temperaturën dhe presionin, dy pohimet e mësipërme mund të përdoren njëra pas tjetrës, por ekziston një mundësi tjetër, e cila është:

temperaturë e dyfishtë;

presion i dyfishtë = emri i objektit.leximi i presionit (temperatura); // mat presionin dhe temperaturën

Kjo deklaratë lexon të dhënat nga pajisja BME280 ose BMP280 vetëm një herë, dhe kthen temperaturën dhe presionin. Ky është përdorimi pak më efikas i autobusit I2C dhe siguron që dy leximet të korrespondojnë me të njëjtin cikël matës.

Për BME 280, një deklaratë e kombinuar që merr të tre vlerat (lagështia, temperatura dhe presioni) është:

temperatura e dyfishtë, presioni; lagështia e dyfishtë = emri i objektit.leximi i lagështisë (temperatura, presioni); // mat lagështinë, presionin dhe temperaturën

Kjo deklaratë lexon të dhënat nga pajisja BMP280 vetëm një herë dhe kthen të tre vlerat. Ky është përdorimi pak më efikas i autobusit I2C dhe siguron që të tre leximet korrespondojnë me të njëjtin cikël matës. Vini re se emrat e variablave mund të ndryshohen në çdo gjë që i pëlqen përdoruesit, por rendi i tyre është fiks - temperatura vjen e para, dhe presioni vjen i dyti.

Këto raste përdorimi mbulohen në skica shembullore të ofruara me bibliotekën, duke qenë bazëTemperature.ino, basicPressure.ino, basicHumidity.ino, BasicTemperatureAndPressure.ino dhe BasicHumidityAndTemperatureAndPressure.ino.

Matje më e sofistikuar e temperaturës dhe presionit

Edhe pse seria e mësipërme e deklaratave do të funksionojë pa probleme, ka disa çështje:

  1. pajisja po punon vazhdimisht, dhe për këtë arsye po konsumon energji në nivelin e saj maksimal. Nëse energjia vjen nga një bateri, mund të jetë e nevojshme ta zvogëloni atë.
  2. për shkak të energjisë së konsumuar, pajisja do të përjetojë ngrohje, dhe për këtë arsye temperatura e matur do të jetë më e lartë se temperatura e ambientit. Unë do ta mbuloj këtë më shumë në një hap të mëvonshëm.

Një rezultat që përdor më pak energji dhe jep një temperaturë që është më afër ambientit, mund të merret duke përdorur fillimin () me parametrat që e vënë atë në gjumë (p.sh. modaliteti = 0). Për shembull:

emri i objektit.filloj (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en [, osrs_h]

Pastaj, kur kërkohet një matje, zgjoni pajisjen me një komandë konfigurimi për të regjistruar F2 (nëse kërkohet) dhe F4 që vendos vlerat e duhura të osrs_h, osrs_t dhe osrs_p, plus modalitetin = 1 (modaliteti i një goditjeje të vetme). Për shembull:

[objectName.updateF2Control (1);] // osrs_h - nuk nevojitet kurrë për BMP280, // dhe nuk nevojitet për BME280 nëse numri i matjeve nuk po ndryshon // nga vlera e dhënë në fillim (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, modaliteti

Pasi të zgjohet pajisja, ajo do të fillojë të matet, por rezultati nuk do të jetë i disponueshëm për disa milisekonda - të paktën 4 ms, ndoshta deri në 70 ms ose më shumë, në varësi të numrit të matjeve që janë specifikuar. Nëse komanda e leximit dërgohet menjëherë, pajisja do të kthejë vlerat nga matja e mëparshme - të cilat mund të jenë të pranueshme në disa aplikacione, por në shumicën e rasteve ndoshta është më mirë të vononi derisa matja e re të jetë e disponueshme.

Kjo vonesë mund të bëhet në disa mënyra.

  1. prisni një sasi të caktuar kohe për të mbuluar vonesën më të gjatë të pritshme
  2. prisni një sasi kohe të llogaritur nga koha maksimale e matjes për matje (p.sh. 2.3ms) shumëfishuar numrin e matjeve, plus shpenzimet e përgjithshme, plus një diferencë.
  3. prisni një kohë më të shkurtër të llogaritur si më sipër, por duke përdorur kohën nominale të matjes (p.sh. 2 ms) plus shpenzimet e sipërme, dhe pastaj filloni të kontrolloni bitin "Po mat" në regjistrin e gjendjes. Kur biti i statusit lexon 0 (dmth. Nuk matet), merrni leximet e temperaturës dhe presionit.
  4. filloni menjëherë të kontrolloni regjistrin e gjendjes dhe merrni leximet e temperaturës dhe presionit kur biti i statusit lexon 0,

Unë do të tregoj një shembull të një mënyre për ta bërë këtë pak më vonë.

Operacionet e regjistrit të konfigurimit

Për të realizuar të gjithë këtë, ne kemi nevojë për disa mjete që unë ende nuk i kam prezantuar. Ata janë:

byte lexo Regjistrohu (reg)

void updateRegjistrohu (reg, vlera)

Secila prej këtyre ka disa komanda të prejardhura në bibliotekë, të cilat e bëjnë softuerin për veprime specifike pak më të thjeshtë.

Shembulli powerSaverPressureAndTemperature.ino përdor metodën Nr. 3. Linja e kodit që bën kontrollimin e përsëritur është

ndërsa (bmp0.readRegister (0xF3) >> 3); // lak untl F3bit 3 == 0

Vini re se kjo skicë është për një mikrokontrollues ESP8266. Kam përdorur një WeMos D1 mini pro. Skica nuk do të funksionojë me mikrokontrolluesit Atmega, të cilët kanë udhëzime të ndryshme për të fjetur. Ky skicë ushtron disa komanda të tjera, kështu që unë do t'i prezantoj të gjitha para se ta përshkruaj atë skicë në mënyrë më të detajuar.

Kur mikrokontrolluesi fle paralelisht me sensorin BMP280, konfigurimi i sensorit për matjet e kërkuara mund të bëhet në komandën start (), duke përdorur 6 parametrat. Sidoqoftë, nëse mikrokontrolluesi nuk fle, por sensori është, atëherë në kohën e matjes sensori duhet të zgjohet dhe t'i tregohet konfigurimi i tij i matjes. Kjo mund të bëhet drejtpërdrejt me

updateRegjistrohu (reg, vlera)

por është pak më e lehtë me tre komandat e mëposhtme:

updateF2Control (osrs_h); // BME280 vetëm

updateF4Control (osrs_t, osrs_p, mode); updateF5Config (t_sb, filtër, spi3W_en);

Pasi të bëhet matja, nëse mënyra e përdorur është Single shot (Mënyra e detyruar), atëherë pajisja automatikisht do të kthehet në gjumë. Sidoqoftë, nëse grupi i matjeve përfshin matje të shumta duke përdorur modalitetin e vazhdueshëm (Normal), atëherë BMP280 do të duhet të vihet përsëri në gjumë. Kjo mund të bëhet me njërën nga dy komandat e mëposhtme:

updateF4Control16xSleep ();

updateF4ControlSleep (vlera);

Të dyja këto i vendosin bitët e modalitetit në 00 (dmth. Modaliteti i fjetjes). Megjithatë e para vendos osrs_t dhe osrs_p në 111 (dmth. 16 matje) ndërsa e dyta ruan 6 bitët e ulët nga "vlera" në bitët 7: 2 të regjistrit 0xF4.

Në mënyrë të ngjashme deklarata e mëposhtme ruan gjashtë bitët e ulët të "vlerës" në bitët 7: 2 të regjistrit 0xF5.

updateF5ConfigSleep (vlera);

Përdorimi i këtyre komandave të fundit mundëson ruajtjen e 12 bitëve të informacionit në regjistrat BMP280 F4 dhe F5. Të paktën në rastin e ESP8266, kur mikrokontrolluesi zgjohet pas një periudhe gjumi, ai fillon në fillim të skicës pa njohuri për gjendjen e tij para komandës së gjumit. Për të ruajtur njohuritë për gjendjen e tij para komandës së gjumit, të dhënat mund të ruhen në flash memorie, duke përdorur ose funksionet EEPROM ose duke shkruar një skedar duke përdorur SPIFFS. Sidoqoftë, memoria flash ka një kufizim të numrit të cikleve të shkrimit, të rendit prej 10, 000 në 100, 000. Kjo do të thotë që nëse mikrokontrolluesi po kalon një cikël gjumë-zgjim çdo disa sekonda, mund të tejkalojë shkrimin e kujtesës së lejuar limit brenda pak muajsh. Ruajtja e disa pjesëve të të dhënave në BMP280 nuk ka një kufizim të tillë.

Të dhënat e ruajtura në regjistrat F4 dhe F5 mund të rikuperohen kur mikrokontrolluesi zgjohet duke përdorur komandat

readF4Sleep ();

lexoF5Sleep ();

Këto funksione lexojnë regjistrin përkatës, zhvendosin përmbajtjen për të hequr 2 LSB dhe kthejnë 6 bitët e mbetur. Këto funksione përdoren në shembullin e skicës powerSaverPressureAndTemperatureESP.ino si më poshtë:

// lexoni vlerën e EventCounter nga bmp0

byte bmp0F4value = bmp0.readF4Sleep (); // 0 deri 63 bajt bmp0F5vlera = bmp0.readF5Sleep (); // 0 deri 63 eventCounter = bmp0F5vlera*64+bmp0F4vlera; // 0 deri në 4095

Këto funksione lexojnë regjistrin përkatës, zhvendosin përmbajtjen për të hequr 2 LSB dhe kthejnë 6 bitët e mbetur. Këto funksione përdoren në shembullin e skicës powerSaverPressureAndTemperature.ino si më poshtë:

// lexoni vlerën e EventCounter mbrapa nga bmp1

byte bmp1F4value = bmp1.readF4Sleep (); // 0 deri në 63 bajt bmp1F5vlera = bmp1.readF5Sleep (); // 0 deri 63 eventCounter = bmp1F5vlera*64+bmp1F4vlera; // 0 deri në 4095

Funksionet e temperaturës dhe presionit të papërpunuar

Funksionet bazë të leximitTemperatura, readPressure dhe readHumidity kanë dy përbërës. Së pari vlerat e papërpunuara të temperaturës dhe presionit 20-bit merren nga BME/P280, ose vlera e lagështisë së papërpunuar 16-bit merret nga BME280. Pastaj algoritmi i kompensimit përdoret për të gjeneruar vlerat e daljes në gradë Celsius, hPa ose %RH.

Biblioteka siguron funksione të veçanta për këto përbërës, në mënyrë që të dhënat e temperaturës së papërpunuar, presionit dhe lagështisë të mund të merren, dhe ndoshta të manipulohen në një farë mënyre. Algoritmi për të nxjerrë temperaturën, presionin dhe lagështinë nga këto vlera të papërpunuara gjithashtu sigurohet. Në bibliotekë këto algoritme zbatohen duke përdorur aritmetikë të pikës lundruese me gjatësi të dyfishtë. Punon mirë në ESP8266 i cili është një procesor 32-bit dhe përdor 64 bit për variablat notues "të dyfishtë". Bërja e këtyre funksioneve të arritshme mund të jetë e dobishme për vlerësimin dhe ndoshta ndryshimin e llogaritjes për platforma të tjera.

Këto funksione janë:

readRawPressure (Temperatura e papërpunuar); // lexon të dhënat e presionit të papërpunuar dhe të temperaturës nga BME/P280readRawHumidity (rawTemperature, rawPressure); // lexon të dhëna të papërpunuara të lagështirës, temperaturës dhe presionit nga BME280 calcTemperature (Temperatura e papërpunuar, t_fine); calcPressure (Presioni i papërpunuar, t_fine); calcHumidity (lagështia e papërpunuar, t_fine)

Argumenti "t-fine" për këto funksione vlen pak për shpjegim. Të dy algoritmet e kompensimit të presionit dhe lagështisë përfshijnë një komponent të varur nga temperatura i cili arrihet përmes ndryshores t_fine. Funksioni calcTemperature shkruan një vlerë në t_fine bazuar në logjikën e algoritmit të kompensimit të temperaturës, e cila më pas përdoret si një hyrje si në calcPressure ashtu edhe në calcHumidity.

Një shembull i përdorimit të këtyre funksioneve mund të gjendet në shembullin skicë rawPressureAndTemperature.ino, dhe gjithashtu në kodin për funksionin readHumidity () në skedarin.cpp të bibliotekës.

Presioni mbi lartësinë dhe nivelin e detit

Ekziston një lidhje e njohur midis presionit atmosferik dhe lartësisë. Moti gjithashtu ndikon në presion. Kur organizatat e motit publikojnë informacionin e presionit atmosferik, ata zakonisht e rregullojnë atë për lartësinë dhe kështu "grafiku sinoptik" tregon izobarë (linja të presionit të vazhdueshëm) të standardizuar për të nënkuptuar nivelin e detit. Pra, me të vërtetë ka 3 vlera në këtë marrëdhënie, dhe njohja e dy prej tyre mundëson nxjerrjen e së tretës. 3 vlerat janë:

  • lartësi mbi nivelin e detit
  • presioni aktual i ajrit në atë lartësi
  • presioni ekuivalent i ajrit në nivelin e detit (më rreptësisht, niveli mesatar i detit, sepse niveli i menjëhershëm i detit ndryshon vazhdimisht)

Kjo bibliotekë ofron dy funksione për këtë marrëdhënie, si më poshtë:

calcAltitude (presioni, detiLevelhPa);

presioni i normalizuar (presioni, lartësia);

Ekziston edhe një version i thjeshtuar, i cili supozon presionin standard të nivelit të detit prej 1013.15 hPa.

calcAltitude (presion); // presioni standard i detit i supozuar

Hapi 3: Detajet e pajisjes BMP280

Detajet e pajisjes BMP280
Detajet e pajisjes BMP280

Aftësitë harduerike

BMP280 ka 2 byte të të dhënave të konfigurimit (në adresat e regjistrit 0xF4 dhe 0xF5) e cila përdoret për të kontrolluar shumëfishimin e opsioneve të matjes dhe daljes së të dhënave. Ai gjithashtu siguron 2 bit të informacionit të statusit, dhe 24 bajt të parametrave të kalibrimit të cilët përdoren në konvertimin e temperaturës së papërpunuar dhe vlerave të presionit në njësi konvencionale të temperaturës dhe presionit. BME280 ka të dhëna shtesë si më poshtë:

  • 1 bajt shtesë të të dhënave të konfigurimit në adresën e regjistrit 0xF2 të përdorura për të kontrolluar matjet e shumta të lagështisë;
  • 8 bajt shtesë të parametrave të kalibrimit të përdorur në konvertimin e vlerës së lagështisë së papërpunuar në përqindje të lagështisë relative.

Regjistrat e temperaturës, presionit dhe gjendjes për BME280 janë të njëjta si për BMP280 me përjashtime të vogla si më poshtë:

  • bitet "ID" të BME280 janë vendosur në 0x60, kështu që mund të dallohen nga BMP280 që mund të jenë 0x56, 0x57 ose 0x58
  • kontrolli i kohës së gjumit (t_sb) ndryshohet në mënyrë që dy kohët e gjata në BMP280 (2000 ms dhe 4000 ms) të zëvendësohen në BME280 me kohë të shkurtra 10 ms dhe 20 ms. Koha maksimale e gjumit në BME280 është 1000 ms.
  • Në BME280 vlerat e papërpunuara të temperaturës dhe presionit janë gjithmonë 20 bit nëse aplikohet filtrimi. Përdorimi i vlerave 16 deri në 19 bit është i kufizuar në rastet pa filtrim (dmth filtër = 0).

Temperatura dhe presioni janë secila vlera 20 bit, të cilat duhet të shndërrohen në temperaturë dhe presion konvencional përmes një algoritmi mjaft kompleks duke përdorur 3 parametra kalibrimi 16 16 bit për temperaturën, dhe 9 parametra kalibrimi 16 16 bit plus temperaturën për presion. Granulatiteti i matjes së temperaturës është 0.0003 gradë Celsius për një ndryshim më pak të rëndësishëm të bitit (leximi 20 bit), duke u rritur në 0.0046 gradë Celsius nëse përdoret leximi 16 bit.

Lagështia është një vlerë 16 bit e cila duhet të konvertohet në lagështi relative nëpërmjet një algoritmi tjetër kompleks duke përdorur 6 parametra kalibrimi të cilët janë një përzierje prej 8, 12 dhe 16 bit.

Fleta e të dhënave tregon saktësinë absolute të leximit të temperaturës si +-0.5 C në 25 C dhe +-1 C në intervalin 0 deri 65 C.

Granulariteti i matjes së presionit është 0.15 Pascals (p.sh. 0.0015 hectoPascals) në rezolucion 20 bit, ose 2.5 Pascals në rezolucion 16 bit. Vlera e presionit të papërpunuar ndikohet nga temperatura, kështu që rreth 25C, një rritje e temperaturës prej 1 gradë C ul presionin e matur me 24 Pascals. Ndjeshmëria ndaj temperaturës llogaritet në algoritmin e kalibrimit, kështu që vlerat e dorëzuara të presionit duhet të jenë të sakta në temperatura të ndryshme.

Fleta e të dhënave tregon saktësinë absolute të leximit të presionit si +-1 hPa për temperaturat midis 0 C dhe 65 C.

Saktësia e lagështirës jepet në fletën e të dhënave si +-3% RH, dhe +-1% histerezë.

Si punon

24 bajtët e të dhënave të kalibrimit të temperaturës dhe presionit, dhe gjithashtu në rastin e BME280 8 bajtët e të dhënave të kalibrimit të lagështisë, duhet të lexohen nga pajisja dhe të ruhen në variabla. Këto të dhëna programohen individualisht në pajisjen në fabrikë, kështu që pajisje të ndryshme kanë vlera të ndryshme - të paktën për disa nga parametrat. Një BME/P280 mund të jetë në njërën nga dy gjendjet. Në një gjendje matet. Në gjendjen tjetër është duke pritur (duke fjetur).

Në cilën gjendje është mund të kontrollohet duke parë bitin 3 të regjistrit 0xF3.

Rezultatet e matjes më të fundit mund të merren në çdo kohë duke lexuar vlerën përkatëse të të dhënave, pavarësisht nëse pajisja është duke fjetur apo matur.

Ekzistojnë gjithashtu dy mënyra të funksionimit të BME/P280. Njëra është mënyra e vazhdueshme (e quajtur modaliteti normal në fletën e të dhënave) e cila ciklet vazhdimisht midis gjendjeve të matjes dhe gjumit. Në këtë mënyrë pajisja kryen një sërë matjesh, pastaj shkon për të fjetur, pastaj zgjohet për një grup tjetër matjesh, etj. Numri i matjeve individuale dhe kohëzgjatja e pjesës së gjumit të ciklit mund të kontrollohen të gjitha përmes regjistrave të konfigurimit.

Mënyra tjetër e funksionimit të BME/P280 është mënyra e shkrepjes së vetme (e quajtur mënyra e detyruar në fletën e të dhënave). Në këtë mënyrë pajisja zgjohet nga gjumi me një urdhër për të matur, bën një sërë matjesh, pastaj kthehet në gjumë. Numri i matjeve individuale në grup kontrollohet në komandën e konfigurimit që zgjon pajisjen.

Në BMP280, nëse bëhet një matje e vetme, 16 bitët më domethënës në vlerë janë të populluar, dhe katër bitët më pak të rëndësishëm në leximin e vlerës janë të gjitha zero. Numri i matjeve mund të vendoset në 1, 2, 4, 8 ose 16 dhe me rritjen e numrit të matjeve, rritet numri i bitëve të populluar me të dhëna, kështu që me 16 matje të gjitha 20 bitët popullohen me të dhëna matëse. Fleta e të dhënave i referohet këtij procesi si mbivendosje.

Në BME280, e njëjta rregullim vlen për aq kohë sa rezultati nuk po filtrohet. Nëse përdoret filtrimi, vlerat janë gjithmonë 20 bit, pavarësisht se sa matje janë marrë në secilin cikël matës.

Çdo matje individuale zgjat rreth 2 milisekonda (vlera tipike; vlera maksimale është 2.3 ms). Shtojini kësaj një tarifë fikse prej rreth 2 ms (zakonisht pak më pak) do të thotë që një sekuencë matjeje, e cila mund të përbëhet nga 1 deri në 32 matje individuale, mund të marrë nga 4 ms deri në 66 ms.

Fleta e të dhënave siguron një grup kombinimesh të rekomanduara të mbivendosjes së temperaturës dhe presionit për aplikime të ndryshme.

Regjistrat e kontrollit të konfigurimit

Dy regjistrat e kontrollit të konfigurimit në BMP280 janë në adresat e regjistrit 0xF4 dhe 0xF5, dhe janë të hartuar në 6 vlera individuale të kontrollit të konfigurimit. 0xF4 përbëhet nga:

  • 3 bit osrs_t (matni temperaturën 0, 1, 2, 4, 8 ose 16 herë);
  • 3 bit osrs_p (matni presionin 0, 1, 2, 4, 8 ose 16 herë); dhe
  • Modaliteti 2 bit (Gjumi, i detyruar (dmth. Shkrepje e vetme), Normale (dmth e vazhdueshme).

0xF5 përbëhet nga:

  • 3 bit t_sb (koha e gatishmërisë, 0.5ms në 4000 ms);
  • 3 bit filtër (shih më poshtë); dhe
  • 1 bit spiw_en i cili zgjedh SPI ose I2C.

Parametri i filtrit kontrollon një lloj algoritmi të kalbjes eksponenciale, ose filtrin Infinite Impulse Response (IIR), i aplikuar në vlerat e matjes së presionit dhe temperaturës së papërpunuar (por jo në vlerat e lagështisë). Ekuacioni jepet në fletën e të dhënave. Një prezantim tjetër është:

Vlera (n) = Vlera (n-1) * (K-1) / K + matja (n) / K

ku (n) tregon vlerën më të fundit të matjes dhe prodhimit; dhe K është parametri i filtrit. Parametri i filtrit K dhe mund të vendoset në 1, 2, 4, 8 ose 16. Nëse K është vendosur në 1 ekuacioni thjesht bëhet Vlera (n) = matja (n). Kodimi i parametrit të filtrit është:

  • filtri = 000, K = 1
  • filtri = 001, K = 2
  • filtri = 010, K = 4
  • filtër = 011, K = 8
  • filtri = 1xx, K = 16

BME 280 shton një regjistër të mëtejshëm të kontrollit të konfigurimit në adresën 0xF2, "ctrl_hum" me një parametër të vetëm 3-bit osrs_h (matni lagështinë 0, 1, 2, 4, 8 ose 16 herë).

Hapi 4: Matja dhe Koha e Leximit

Unë planifikoj ta shtoj këtë më vonë, duke treguar kohën e komandave dhe përgjigjeve të matjes.

Iddt - rryma në matjen e temperaturës. Vlera tipike 325 uA

Iddp - rryma në matjen e presionit. Vlera tipike 720 uA, max 1120 uA

Iddsb - aktuale në modalitetin e gatishmërisë. Vlera tipike 0.2 uA, max 0.5 uA

Iddsl - aktuale në modalitetin e gjumit. Vlera tipike 0.1 uA, max 0.3 uA

Hapi 5: Udhëzimet e softuerit

Udhëzimet e softuerit
Udhëzimet e softuerit
Udhëzimet e softuerit
Udhëzimet e softuerit

Modaliteti I2C Burst

Fleta e të dhënave BMP280 jep udhëzime në lidhje me leximin e të dhënave (pjesa 3.9). Ai thotë "rekomandohet fuqimisht të përdorni një lexim të menjëhershëm dhe të mos adresoni çdo regjistër individualisht. Kjo do të parandalojë një përzierje të mundshme të bajtëve që i përkasin matjeve të ndryshme dhe do të zvogëlojë trafikun e ndërfaqes." Asnjë udhëzim nuk jepet në lidhje me leximin e parametrave të kompensimit/kalibrimit. Me sa duket këto nuk janë çështje sepse janë statike dhe nuk ndryshojnë.

Kjo bibliotekë lexon të gjitha vlerat fqinje në një operacion të vetëm leximi - 24 bajtë në rastin e parametrave të kompensimit të temperaturës dhe presionit, 6 bajtë për temperaturën dhe presionin e kombinuar, dhe 8 bajtë për lagështinë, temperaturën dhe presionin e kombinuar. Kur kontrollohet vetëm temperatura, lexohen vetëm 3 byte.

Përdorimi i makrove (#define etj.)

Nuk ka makro në këtë bibliotekë përveç bibliotekës së zakonshme "përfshi ruajtjen" e cila parandalon dyfishimin.

Të gjitha konstantet përcaktohen duke përdorur fjalën kyçe const, dhe printimi i korrigjimit kontrollohet me funksionet standarde C.

Ka qenë burimi i njëfarë pasigurie për mua, por këshilla që marr nga leximi i shumë postimeve mbi këtë temë është se përdorimi i #define për deklarimin e konstantave (të paktën) dhe (ndoshta) kontrolli i printimit të korrigjimit është i panevojshëm dhe i padëshirueshëm.

Rasti për përdorimin e const në vend të #define është mjaft i qartë - const përdor të njëjtat burime si #define (dmth zero) dhe vlerat rezultuese ndjekin rregullat e fushës, duke zvogëluar kështu mundësinë e gabimeve.

Rasti për kontrollin e printimit të korrigjimit është pak më pak i qartë, sepse mënyra se si e kam bërë atë do të thotë që kodi përfundimtar përmban logjikën për deklaratat e printimit të korrigjimit, edhe pse ato nuk ushtrohen kurrë. Nëse biblioteka do të përdoret në një projekt të madh në një mikrokontrollues me memorie shumë të kufizuar, kjo mund të bëhet një çështje. Meqenëse zhvillimi im ishte në një ESP8266 me një memorie të madhe flash, kjo nuk dukej të ishte një çështje për mua.

Hapi 6: Performanca e temperaturës

Kam në plan ta shtoj këtë më vonë.

Hapi 7: Performanca e Presionit

Kam në plan ta shtoj këtë më vonë.

Recommended: