INHOUDSOPGAWE:

Biblioteek vir BMP280 en BME280: 7 stappe
Biblioteek vir BMP280 en BME280: 7 stappe

Video: Biblioteek vir BMP280 en BME280: 7 stappe

Video: Biblioteek vir BMP280 en BME280: 7 stappe
Video: Lesson 31: BMP280 Temperature Sensor with TM1637 Display | Arduino Step By Step Course 2024, Julie
Anonim
Biblioteek vir BMP280 en BME280
Biblioteek vir BMP280 en BME280
Biblioteek vir BMP280 en BME280
Biblioteek vir BMP280 en BME280
Biblioteek vir BMP280 en BME280
Biblioteek vir BMP280 en BME280

Inleiding

Ek wou nie hierdie biblioteek skryf nie. Dit het 'gebeur' as 'n newe-effek van 'n projek wat ek begin het met 'n BMP280. Die projek is nog nie afgehandel nie, maar ek dink die biblioteek is gereed om met ander te deel. Daarna moes ek 'n BME280 gebruik, wat die meting van humiditeit toevoeg tot die druk- en temperatuurvermoë van die BMP280. Die BME280 is "agteruit versoenbaar" met die BMP280 - dit wil sê, al die registers en die stappe wat nodig is om druk en temperatuur van die BME280 af te lees, is dieselfde as dié wat vir die BMP280 gebruik is. Daar is addisionele registers en stappe wat nodig is om humiditeit af te lees, slegs van toepassing op die BME280. Dit laat die vraag ontstaan: een biblioteek vir albei of twee aparte biblioteke. Die hardeware vir die twee toesteltipes is volledig uitruilbaar. Selfs baie van die modules wat verkoop word (byvoorbeeld op eBay en AliExpress) is gemerk as BME/P280. Om uit te vind watter tipe dit is, moet u na die (klein) skrif op die sensor self kyk, of die apparaat -ID -greep toets. Ek het besluit om vir 'n enkele biblioteek te gaan. Dit het blykbaar reggekom.

Terugvoer, veral voorstelle vir verbeterings, sal waardeer word.

Biblioteekkenmerke en -funksies

'N Biblioteek is 'n sagteware wat 'n toepassingsprogrammeringsinterface (API) bied vir 'n programmeerder om die funksies van die toestel uit te oefen, sonder om noodwendig al die fynkorrelige besonderhede te hanteer. Dit is wenslik dat die API maklik is vir 'n beginner met eenvoudige vereistes om aan die gang te kom, terwyl dit die toestel se vermoëns ten volle benut. Dit is wenslik dat die biblioteek enige spesifieke riglyne van die vervaardiger van die toestel, sowel as algemene sagteware, moet volg. Ek het probeer om dit alles te bereik. Toe ek met die BMP280 begin, het ek drie verskillende biblioteke daarvoor gevind: Adafruit_BMP280; Seeed_BMP280; en een met die naam BMP280 van die vervaardiger van die toestelle. Nie Adafruit of Seeed het uitgebreide funksies gebied nie, hoewel dit goed gewerk het en maklik was om te gebruik vir basiese toepassings. Ek kon nie verstaan hoe ons die een wat deur die vervaardiger van die toestelle (Bosch Sensortec) vervaardig is, gebruik nie. Dit kan my tekort wees, eerder as hulle s'n. Maar die biblioteek was baie ingewikkelder as die ander twee; ek kon geen instruksies of voorbeelde van gebruik vind nie (ek het later gevind dat voorbeelde in die lêer 'bmp280_support.c' was, maar dit was nie vir my baie nuttig nie).

As gevolg van hierdie faktore het ek besluit om my eie biblioteek vir die BMP280 te skryf.

Op soek na die biblioteek situasie vir die BME280, vind ek aparte biblioteke Adafruit_BME280, Seed_BME280 en nog een BME280_MOD-1022, geskryf deur Embedded Adventures. Nie een van hulle kombineer die funksies vir BMP280 in 'n biblioteek wat die BME280 kan gebruik nie. Nie een van hulle het uitdruklik die vermoë van die toestelle ondersteun om 'n paar stukkies data te stoor terwyl die toestel en die bedienende mikroverwerker daarvan slaap nie (hierdie vermoë is duidelik te sien in die datablad en word ondersteun in die biblioteek wat ek hier geskryf en beskryf het).

'N Gekombineerde biblioteek moet ondersteuning bied vir al die funksies van die BME280, maar as dit saam met 'n BMP280 gebruik word, behoort dit nie enige onkoste van die ongebruikte funksies af te dwing nie. Die voordele van 'n gekombineerde biblioteek sluit in minder bestuurbare biblioteeklêers, maklike meng-en-pas van verskillende toestelle in dieselfde projek, en vereenvoudigde veranderings vir onderhoud of opgraderings wat slegs op een plek in plaas van twee gedoen moet word. Dit is waarskynlik almal redelik klein, selfs onbeduidend, maar …

Toestelvermoëns

Die BMP280 en BME280 is toestelle op die oppervlak wat ongeveer 5 mm vierkantig en 1 mm hoog is. Daar is 8 koppelvlakblokkies, insluitend 2 afsonderlike kraginvoerblokkies en twee grondblokkies. Hulle is op eBay beskikbaar as 'n module met 4 of 6 penne wat uithaal. Die 4-pins module het 'n vaste I2C adres en kan nie gekonfigureer word om die SPI protokol te gebruik nie.

Die 6-pins module of die kaal toestel kan met I2C- of SPI-protokolle gebruik word. In die I2C -modus kan dit twee verskillende adresse hê, wat verkry word deur die SDO -pen aan te sluit, óf op Ground (vir basisadres = 0x76) óf met Vdd (vir basisadres +1 = 0x77). In die SPI -modus het dit die gewone rangskikking van 1 horlosie, 2 data (een vir elke rigting) en 'n toestelpen (CS).

Die biblioteek wat ek hier geskryf en beskryf het, ondersteun slegs I2C. Die Adafruit_BMP280 en die BME_MOD-1022 biblioteke ondersteun beide i2C en SPI.

Die biblioteek kan hier afgelaai word:

github.com/farmerkeith/BMP280-library

Stap 1: Die opstel van die hardeware

Die opstel van die hardeware
Die opstel van die hardeware

Voordat die biblioteek nuttig kan wees, moet u 'n mikrobeheerder aan die BMP280 koppel (of twee as u wil).

Ek het 'n WeMos D1 mini pro gebruik, so ek sal die verbindings daarvan wys. Ander mikrobeheerders sal soortgelyk wees; u hoef net die SDA- en SCL -penne korrek aan te sluit.

In die geval van die WeMos D1 mini pro is die verbindings:

Funksie WeMos pin BMP280 pin Notes

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominaal 3.3V Grond GND Adresbeheer SDO Grond of Vdd I2C kies CSB Vdd (GND kies SPI)

Let daarop dat die SDO -pen op sommige van die MP280 -modules SDD genoem word, en dat die Vdd -pen VCC kan wees. Let wel: SDA- en SCL-lyne moet optrekweerstands tussen die lyn en die Vin-pen hê. Gewoonlik moet 'n waarde van 4,7K OK wees. Sommige BMP280- en BME280-modules bevat 10K optrekweerstands wat by die module ingesluit is (wat nie goeie praktyk is nie, aangesien die plasing van veelvuldige toestelle op die I2C-bus dit te veel kan laai). Die gebruik van 2 BME/P280-modules elk met 'n 10K-weerstand behoort in die praktyk egter nie 'n probleem te wees nie, solank daar nie te veel ander toestelle op dieselfde bus is nie, ook met optrekweerstands.

Sodra u die hardeware verbind het, kan u maklik kyk of u toestel 'n BMP280 of BME280 is deur die skets I2CScan_ID uit te voer wat u hier kan vind:

U kan ook kyk of u 'n BMP280 of BME280 het deur na die toestel self te kyk. Ek het dit nodig gevind om 'n digitale mikroskoop hiervoor te gebruik, maar as u baie goed kan kyk, kan u dit sonder hulpmiddels doen. Daar is twee reëls druk op die omhulsel van die toestel. Die sleutel is die eerste letter op die tweede reël, wat in die geval van BMP280 -toestelle 'n "K" is en in die geval van BME280 -toestelle 'n "U".

Stap 2: API's wat deur die biblioteek verskaf word

API's wat deur die biblioteek verskaf word
API's wat deur die biblioteek verskaf word
API's wat deur die biblioteek verskaf word
API's wat deur die biblioteek verskaf word

Die biblioteek ingesluit in 'n skets

Die biblioteek word standaard in 'n skets ingesluit met behulp van die stelling

#sluit "boerkeith_BMP280.h" in

Hierdie stelling moet in die vroeë deel van die skets ingesluit word voor die aanvang van die opset () funksie.

Skep 'n BME- of BMP -sagteware -voorwerp

Daar is 3 vlakke vir die skep van die BMP280 sagteware -voorwerp. Die eenvoudigste is net

bme280 objectName; of bmp280 objectName;

byvoorbeeld BMP280 bmp0;

Dit skep 'n sagteware -voorwerp met die standaardadres van 0x76 (dws vir SDO wat aan die grond gekoppel is).

Die volgende vlak vir die skep van 'n BME280- of BMP280 -sagteware -voorwerp het 'n parameter van 0 of 1, soos volg:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Die parameter (0 of 1) word by die I2C -basisadres gevoeg, sodat twee BME280- of BMP280 -toestelle op dieselfde I2C -bus (insluitend een van elk) gebruik kan word.

Die derde vlak vir die skep van 'n BME- of BMP280 -sagteware -voorwerp het twee parameters. Die eerste parameter, wat 0 of 1 is, is vir die adres, soos vir die vorige geval. Die tweede parameter beheer ontfoutdruk. As dit op 1 gestel is, lei elke transaksie met die sagteware -voorwerp tot Serial.print -uitsette wat die programmeerder in staat stel om die besonderhede van die transaksie te sien. Byvoorbeeld:

bmp280 objectNameB (1, 1);

As die parameter vir ontfoutdruk op 0 gestel is, keer die sagteware -voorwerp terug na normale gedrag (geen afdruk nie).

Hierdie stelling of stellings moet ingesluit word na die #include en voor die setup () -funksie.

Initialiseer die BME- of BMP -sagteware -voorwerp

Voordat dit gebruik word, is dit nodig om die kalibrasieparameters van die toestel af te lees en dit te konfigureer vir die metingsmodus, oorsampling en filterinstellings.

Vir 'n eenvoudige inisialisering vir algemene doeleindes, is die stelling:

objectName.begin ();

Hierdie weergawe van begin () lees die kalibrasieparameters van die toestel af en stel osrs_t = 7 (16 temperatuurmetings), osrs_p = 7 (16 drukmetings), modus = 3 (deurlopend, normaal), t_sb = 0 (0,5 ms slaap tussen metingset), filter = 0 (K = 1, dus geen filter nie) en spiw_en = 0 (SPI gedeaktiveer, gebruik dus I2C). In die geval van die BME280 is daar 'n ekstra parameter osrs_h = 7 vir 16 humiditeitsmetings.

Daar is 'n ander weergawe van begin () wat al ses (of 7) parameters neem. Die ekwivalent van bogenoemde stelling is

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

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

Die volledige lys kodes en die betekenis daarvan is in die BME280- en BMP280 -datablad, en ook in die kommentaar in die.cpp -lêer in die biblioteek.

Eenvoudige temperatuur- en drukmeting

Die eenvoudigste manier is om 'n temperatuurmeting te kry

dubbele temperatuur = objectName.readTemperature (); // meet temperatuur

Die eenvoudigste manier is om 'n drukmeting te kry

dubbele druk = objectName.readPressure (); // druk meet

Die maklikste manier is om 'n humiditeitsmeting te kry

dubbele humiditeit = objectName.readHumidity (); // meet humiditeit (slegs BME280)

Om beide temperatuur en druk te verkry, kan die twee stellings hierbo na mekaar gebruik word, maar daar is 'n ander opsie:

dubbele temperatuur;

dubbele druk = objectName.readPressure (temperatuur); // meet druk en temperatuur

Hierdie stelling lees die data van die BME280- of BMP280 -toestel slegs een keer en gee temperatuur en druk terug. Dit is 'n effens meer doeltreffende gebruik van die I2C -bus en verseker dat die twee metings ooreenstem met dieselfde metingsiklus.

Vir die BME 280 is 'n gesamentlike stelling wat al drie waardes (humiditeit, temperatuur en druk) kry:

dubbele temperatuur, druk; dubbele humiditeit = objectName.readHumidity (temperatuur, druk); // meet humiditeit, druk en temperatuur

Hierdie stelling lees die data van die BMP280 -toestel slegs een keer en gee al drie waardes terug. Dit is 'n effens meer doeltreffende gebruik van die I2C -bus en verseker dat die drie metings ooreenstem met dieselfde metingsiklus. Let daarop dat die name van die veranderlikes verander kan word in alles waarvan die gebruiker hou, maar die volgorde is vasgestel - temperatuur kom eerste, en druk kom tweede.

Hierdie gebruiksgevalle word behandel in voorbeeldsketse wat by die biblioteek voorsien word, synde basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino en basicHumidityAndTemperatureAndPressure.ino.

Meer gesofistikeerde temperatuur- en drukmeting

Alhoewel die bogenoemde reeks stellings sonder probleme sal werk, is daar 'n paar probleme:

  1. die toestel werk voortdurend en verbruik dus krag op sy maksimum vlak. As die energie uit 'n battery kom, kan dit nodig wees om dit te verminder.
  2. As gevolg van die verbruikte krag, sal die toestel opwarm, en daarom sal die gemete temperatuur hoër wees as die omgewingstemperatuur. Ek sal dit meer in 'n latere stap behandel.

'N Resultaat wat minder krag gebruik en 'n temperatuur gee wat nader aan die omgewing is, kan verkry word deur begin () te gebruik met parameters wat dit aan die slaap maak (bv. Mode = 0). Byvoorbeeld:

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

As 'n meting verlang word, maak die toestel dan wakker met 'n konfigurasieopdrag om F2 (indien nodig) en F4 te registreer wat die toepaslike waardes van osrs_h, osrs_t en osrs_p, plus mode = 1 (enkelspelmodus) stel. Byvoorbeeld:

[objectName.updateF2Control (1);] // osrs_h - nooit nodig vir BMP280 nie, // en nie nodig vir BME280 as die aantal metings nie verander word // van die waarde wat in begin () verskaf word. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, modus

Nadat die toestel wakker geword het, begin dit meet, maar die resultaat is vir 'n paar millisekondes nie beskikbaar nie - ten minste 4 ms, miskien tot 70 ms of meer, afhangende van die aantal metings wat gespesifiseer is. As die leesopdrag onmiddellik gestuur word, sal die toestel die waardes van die vorige meting teruggee - wat in sommige toepassings aanvaarbaar kan wees, maar in die meeste gevalle is dit waarskynlik beter om uit te stel totdat die nuwe meting beskikbaar is.

Hierdie vertraging kan op verskeie maniere gedoen word.

  1. wag 'n vaste tyd om die langste verwagte vertraging te dek
  2. wag 'n hoeveelheid tyd wat bereken word uit die maksimum meettyd per meting (dws 2.3ms) maal die aantal metings, plus bokoste, plus 'n marge.
  3. Wag 'n korter tydsberekening soos hierbo bereken, maar gebruik die nominale meettyd (dws 2 ms) plus bokoste, en begin dan die bietjie "ek meet" in die statusregister. As die statusbit 0 lees (nie meet nie), kry ons die temperatuur- en drukmetings.
  4. begin onmiddellik die statusregister nagaan en kry die temperatuur- en drukmetings wanneer die statusbit 0 lees,

Ek sal 'n bietjie later 'n voorbeeld toon van een manier om dit te doen.

Konfigurasie register operasies

Om dit alles te laat gebeur, benodig ons verskeie gereedskap wat ek nog nie bekendgestel het nie. Hulle is:

byte readRegister (reg)

leegte updateRegister (reg, waarde)

Elkeen hiervan het verskeie afgeleide opdragte in die biblioteek, wat die sagteware vir spesifieke aksies 'n bietjie eenvoudiger maak.

Die voorbeeld powerSaverPressureAndTemperature.ino gebruik metode nr. 3. Die kode kode wat herhaaldelik nagegaan word, is

terwyl (bmp0.readRegister (0xF3) >> 3); // lus tot F3bit 3 == 0

Let daarop dat hierdie skets vir 'n ESP8266 -mikrobeheerder is. Ek het 'n WeMos D1 mini pro gebruik. Die skets werk nie met Atmega -mikrobeheerders nie, wat verskillende instruksies het om te slaap. Hierdie skets oefen verskeie ander opdragte uit, so ek sal hulle almal voorstel voordat ek die skets in meer besonderhede beskryf.

As die mikrokontroller parallel met die BMP280 -sensor slaap, kan die konfigurasie van die sensor vir die vereiste metings uitgevoer word in die begin () -opdrag met behulp van die 6 parameters. As die mikrobeheerder egter nie slaap nie, maar die sensor wel, moet die sensor op die tydstip van die meting wakker gemaak word en die meetkonfigurasie daarvan meegedeel word. Dit kan direk gedoen word met

updateRegister (reg, waarde)

maar dit is 'n bietjie makliker met die volgende drie opdragte:

updateF2Control (osrs_h); // Slegs BME280

updateF4Control (osrs_t, osrs_p, modus); updateF5Config (t_sb, filter, spi3W_en);

Nadat die meting gedoen is, sal die toestel outomaties weer aan die slaap raak as die gebruikte modus 'n enkele opname (geforseerde modus) is. As die metingset egter veelvuldige metings behels met behulp van die deurlopende (normale) modus, moet die BMP280 weer aan die slaap gesit word. Dit kan gedoen word met een van die twee volgende opdragte:

updateF4Control16xSleep ();

updateF4ControlSleep (waarde);

Beide hiervan stel die modusbisse op 00 (dws slaapmodus). Die eerste stel egter die osrs_t en osrs_p op 111 (dws 16 metings), terwyl die tweede een die lae 6 bisse van "waarde" in stukkies 7: 2 van die 0xF4 -register stoor.

Net so stoor die volgende stelling die lae ses bisse "waarde" in bisse 7: 2 van die 0xF5 -register.

updateF5ConfigSleep (waarde);

Die gebruik van laasgenoemde opdragte maak dit moontlik om 12 stukkies inligting in die BMP280 -registers F4 en F5 te stoor. Ten minste in die geval van die ESP8266, wanneer die mikrobeheerder wakker word na 'n tydperk van slaap, begin dit aan die begin van die skets sonder kennis van sy toestand voor die slaapopdrag. Om kennis van die toestand voor die slaapopdrag te stoor, kan data in die flash -geheue gestoor word met behulp van die EEPROM -funksies of deur 'n lêer te skryf met SPIFFS. Flitsgeheue het egter 'n beperking op die aantal skryfsiklusse, in die orde van 10 000 tot 100 000. Dit beteken dat as die mikrobeheerder elke paar sekondes deur 'n slaap-wakker siklus gaan, dit die toelaatbare geheue-skryf kan oorskry beperk binne 'n paar maande. Die stoor van 'n paar stukkies data in die BMP280 het geen sodanige beperking nie.

Die data wat in registers F4 en F5 gestoor is, kan herstel word wanneer die mikrobeheerder wakker word met behulp van die opdragte

readF4Sleep ();

readF5Sleep ();

Hierdie funksies lees die ooreenstemmende register, skuif die inhoud om die 2 LSB's te verwyder en gee die oorblywende 6 bisse terug. Hierdie funksies word soos volg in die skets powerSaverPressureAndTemperatureESP.ino gebruik:

// lees die waarde van EventCounter terug van bmp0

byte bmp0F4value = bmp0.readF4Sleep (); // 0 tot 63 byte bmp0F5value = bmp0.readF5Sleep (); // 0 tot 63 eventCounter = bmp0F5waarde*64+bmp0F4waarde; // 0 tot 4095

Hierdie funksies lees die ooreenstemmende register, skuif die inhoud om die 2 LSB's te verwyder en gee die oorblywende 6 bisse terug. Hierdie funksies word in die voorbeeldskets powerSaverPressureAndTemperature.ino soos volg gebruik:

// lees die waarde van EventCounter terug van bmp1

byte bmp1F4value = bmp1.readF4Sleep (); // 0 tot 63 byte bmp1F5value = bmp1.readF5Sleep (); // 0 tot 63 eventCounter = bmp1F5waarde*64+bmp1F4waarde; // 0 tot 4095

Rou temperatuur en druk funksies

Die basiese funksies readTemperature, readPressure en readHumidity het twee komponente. Eerstens word die rou 20-bis temperatuur en drukwaardes verkry uit die BME/P280, of die rou 16-bis humiditeitswaarde word verkry uit die BME280. Dan word die kompensasie -algoritme gebruik om die uitsetwaardes in grade Celsius, hPa of %RH te genereer.

Die biblioteek bied afsonderlike funksies vir hierdie komponente, sodat data oor rou temperatuur, druk en humiditeit verkry kan word en miskien op een of ander manier gemanipuleer kan word. Die algoritme om die temperatuur, druk en humiditeit van hierdie rou waardes af te lei word ook verskaf. In die biblioteek word hierdie algoritmes geïmplementeer met behulp van rekenkundige dubbele lengte dryfpunt. Dit werk goed op die ESP8266, 'n 32-bis-verwerker en gebruik 64 bisse vir 'dubbele' float-veranderlikes. Om hierdie funksies toeganklik te maak, kan nuttig wees om die berekening vir ander platforms te beoordeel en moontlik te verander.

Hierdie funksies is:

readRawPressure (rouTemperatuur); // lees ruwe druk- en temperatuurdata van BME/P280readRawHumidity (rawTemperature, rawPressure); // lees rou humiditeit-, temperatuur- en drukdata van BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rouHumidity, t_fine)

Die "t-fine" -argument vir hierdie funksies is 'n bietjie verduideliking werd. Beide druk- en humiditeitsvergoedingsalgoritmes bevat 'n temperatuurafhanklike komponent wat bereik word deur die t_fine veranderlike. Die calcTemperature -funksie skryf 'n waarde in t_fine gebaseer op die logika vir temperatuurkompensasie, wat dan as 'n inset in beide calcPressure en calcHumidity gebruik word.

'N Voorbeeld van die gebruik van hierdie funksies kan gevind word in die voorbeeldskets rawPressureAndTemperature.ino, en ook in die kode vir die funksie readHumidity () in die.cpp -lêer van die biblioteek.

Hoogte en seevlak druk

Daar is 'n bekende verband tussen atmosferiese druk en hoogte. Die weer beïnvloed ook druk. As die weerorganisasies inligting oor atmosferiese druk publiseer, pas hulle dit gewoonlik aan op hoogte, en daarom toon die 'sinoptiese grafiek' isobare (lyne van konstante druk) wat gestandaardiseer is om seevlak te beteken. Daar is dus werklik drie waardes in hierdie verhouding, en as u twee daarvan ken, kan u die derde aflei. Die 3 waardes is:

  • hoogte bo seespieël
  • werklike lugdruk op daardie hoogte
  • ekwivalente lugdruk op seevlak (strenger, gemiddelde seevlak, want onmiddellike seevlak verander voortdurend)

Hierdie biblioteek bied twee funksies vir hierdie verhouding, soos volg:

calcAltitude (druk, seaLevelhPa);

calcNormalised Pressure (druk, hoogte);

Daar is ook 'n vereenvoudigde weergawe wat die standaard seevlakdruk van 1013,15 hPa veronderstel.

calcAltitude (druk); // standaard seaLevelPressure veronderstel

Stap 3: BMP280 -toestelbesonderhede

BMP280 Toestelbesonderhede
BMP280 Toestelbesonderhede

Hardeware vermoëns

Die BMP280 het 2 grepe konfigurasiedata (by registeradresse 0xF4 en 0xF5) wat gebruik word om verskeie metings- en data -uitvoeropsies te beheer. Dit bied ook 2 stukkies statusinligting en 24 grepe kalibrasieparameters wat gebruik word om die rou temperatuur en drukwaardes om te skakel in konvensionele temperatuur- en drukeenhede. Die BME280 het die volgende bykomende data:

  • 1 ekstra greep konfigurasiedata by registeradres 0xF2 wat gebruik word om verskeie humiditeitsmetings te beheer;
  • 8 ekstra grepe kalibrasieparameters wat gebruik word om die waarde van rou humiditeit in relatiewe humiditeitspersentasie om te skakel.

Die temperatuur-, druk- en statusregisters vir die BME280 is dieselfde as vir die BMP280, met geringe uitsonderings soos volg:

  • die "ID" stukkies van die BME280 is ingestel op 0x60, sodat dit onderskei kan word van BMP280 wat 0x56, 0x57 of 0x58 kan wees
  • die slaaptydbeheer (t_sb) word verander sodat die twee lang tye in die BMP280 (2000 ms en 4000 ms) in die BME280 vervang word met kort tye van 10 ms en 20 ms. Die maksimum slaaptyd in die BME280 is 1000 ms.
  • In die BME280 is die temperatuur- en drukgrondwaardes altyd 20 bisse as gefiltreer word. Die gebruik van 16 tot 19 bit waardes is beperk tot gevalle sonder filtering (dws filter = 0).

Temperatuur en druk is elk 20 biswaardes, wat omgeskakel moet word na konvensionele temperatuur en druk via 'n taamlik ingewikkelde algoritme met behulp van 3 16 bit kalibrasie parameters vir temperatuur, en 9 16 bit kalibrasie parameters plus die temperatuur vir druk. Die granulaat van die temperatuurmeting is 0,0003 grade Celsius vir 'n minste beduidende bitverandering (20 bit uitlees), wat toeneem tot 0,0046 grade Celsius as die 16 bit uitlees gebruik word.

Humiditeit is 'n waarde van 16 bit wat deur 'n ander komplekse algoritme in relatiewe humiditeit omgeskakel moet word met behulp van 6 kalibrasieparameters, wat 'n mengsel van 8, 12 en 16 bisse is.

Die gegewensblad toon die absolute akkuraatheid van die temperatuuraflees as +-0,5 C by 25 C en +-1 C oor die reeks 0 tot 65 C.

Die korrelasie van die drukmeting is 0,15 Pascal (dws 0,0015 hectoPascal) by 'n resolusie van 20 bit, of 2,5 Pascal by 'n resolusie van 16 bit. Die ruwe drukwaarde word deur die temperatuur beïnvloed, sodat ongeveer 25C 'n toename in temperatuur van 1 graad C die gemete druk met 24 Pascal verlaag. Die temperatuurgevoeligheid word in die kalibrasie -algoritme uiteengesit, dus moet die gegewe drukwaardes akkuraat wees by verskillende temperature.

Die gegewensblad toon die absolute akkuraatheid van die drukaflezing as +-1 hPa vir temperature tussen 0 C en 65 C.

Die akkuraatheid van die humiditeit word in die gegewensblad gegee as +-3% RH en +-1% histerese.

Hoe dit werk

Die 24 grepe temperatuur- en drukkalibreringsdata, en ook in die geval van die BME280, moet die 8 grepe humiditeitskalibrasie -data van die toestel af gelees word en in veranderlikes gestoor word. Hierdie data word individueel in die toestel in die fabriek geprogrammeer, sodat verskillende toestelle verskillende waardes het - ten minste vir sommige van die parameters. 'N BME/P280 kan in een van twee toestande wees. In een toestand meet dit. In die ander toestand wag dit (slaap).

In watter toestand dit is, kan dit nagegaan word deur na bit 3 van register 0xF3 te kyk.

Die resultate van die mees onlangse meting kan te eniger tyd verkry word deur die ooreenstemmende gegewenswaarde te lees, ongeag of die toestel slaap of meet.

Daar is ook twee maniere om die BME/P280 te gebruik. Die een is die deurlopende modus (genaamd Normale modus in die gegewensblad), wat herhaaldelik wissel tussen die meet- en slaaptoestande. In hierdie modus voer die toestel 'n stel metings uit, gaan dan aan die slaap, word dan wakker vir 'n ander stel metings, ensovoorts. Die aantal individuele metings en die duur van die slaapgedeelte van die siklus kan almal deur die konfigurasieregisters beheer word.

Die ander manier om die BME/P280 te gebruik, is 'n enkele opname -modus (in die datablad genoem Forced -modus). In hierdie modus word die toestel uit die slaap wakker gemaak deur 'n opdrag om te meet, dit doen 'n stel metings en gaan dan weer aan die slaap. Die aantal individuele metings in die stel word beheer deur die konfigurasieopdrag wat die toestel wakker maak.

As 'n enkele meting in die BMP280 gedoen word, word die 16 belangrikste stukkies in die waarde ingevul, en die vier minste belangrike stukkies in die waarde -uitlees is almal nulle. Die aantal metings kan ingestel word op 1, 2, 4, 8 of 16 en namate die aantal metings vermeerder word, neem die aantal bisse wat met data gevul word, toe, sodat met 16 metings alle 20 bisse gevul word met metingsdata. Die gegewensblad verwys na hierdie proses as oorsampling.

In die BME280 geld dieselfde rangskikking solank die resultaat nie gefiltreer word nie. As filter gebruik word, is die waardes altyd 20 bisse, ongeag hoeveel metings in elke metingsiklus gedoen word.

Elke individuele meting neem ongeveer 2 millisekondes (tipiese waarde; maksimum waarde is 2,3 ms). Voeg hierby 'n vaste bokoste van ongeveer 2 ms (gewoonlik 'n bietjie minder), beteken dat 'n metingsreeks, wat kan bestaan uit 1 tot 32 individuele metings, van 4 ms tot 66 ms kan duur.

Die gegewensblad bevat 'n stel aanbevole kombinasies van temperatuur- en drukoormonstering vir verskillende toepassings.

Opstelbeheerregisters

Die twee konfigurasiebeheerregisters in die BMP280 is by registeradresse 0xF4 en 0xF5, en word op 6 individuele konfigurasiebeheerwaardes gekarteer. 0xF4 bestaan uit:

  • 3 bits osrs_t (meet temperatuur 0, 1, 2, 4, 8 of 16 keer);
  • 3 bits osrs_p (meet druk 0, 1, 2, 4, 8 of 16 keer); en
  • 2 bis -modus (slaap, gedwonge (dws enkel opname), normaal (dws deurlopend).

0xF5 bestaan uit:

  • 3 bis t_sb (bystandtyd, 0,5 ms tot 4000 ms);
  • 3 bisse filter (sien hieronder); en
  • 1 bis spiw_en wat SPI of I2C kies.

Die filterparameter beheer 'n tipe eksponensiële vervalalgoritme, of Infinite Impulse Response (IIR) filter, toegepas op die ruwe druk- en temperatuurmetingswaardes (maar nie op die humiditeitswaardes nie). Die vergelyking word in die gegewensblad gegee. 'N Ander aanbieding is:

Waarde (n) = Waarde (n-1) * (K-1) / K + meting (n) / K

waar (n) die mees onlangse meting en uitsetwaarde aandui; en K is die filterparameter. Die filterparameter K en kan ingestel word op 1, 2, 4, 8 of 16. As K op 1 gestel word, word die vergelyking net Waarde (n) = meting (n). Die kodering van die filterparameter is:

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

Die BME 280 voeg 'n verdere konfigurasiebeheerregister by adres 0xF2, "ctrl_hum" by met 'n enkele 3-bis parameter osrs_h (meet humiditeit 0, 1, 2, 4, 8 of 16 keer).

Stap 4: Meting en uitlees tydsberekening

Ek is van plan om dit later by te voeg, met die tydsberekening van opdragte en metingsreaksies.

Iddt - stroom by temperatuurmeting. Tipiese waarde 325 uA

Iddp - stroom by drukmeting. Tipiese waarde 720 uA, maksimum 1120 uA

Iddsb - huidige in standby -modus. Tipiese waarde 0,2 uA, maksimum 0,5 uA

Iddsl - huidige in die slaapmodus. Tipiese waarde 0,1 uA, maksimum 0,3 uA

Stap 5: riglyne vir sagteware

Riglyne vir sagteware
Riglyne vir sagteware
Riglyne vir sagteware
Riglyne vir sagteware

I2C Burst -modus

Die BMP280 -gegewensblad gee leiding oor die uitlees van data (afdeling 3.9). Dit sê "dit word sterk aanbeveel om 'n burst-lees te gebruik en nie elke register individueel aan te spreek nie. Dit sal 'n moontlike mengsel van grepe wat aan verskillende metings behoort, voorkom en koppelvlakverkeer verminder." Daar word geen leiding gegee oor die lees van die kompensasie-/kalibrasieparameters nie. Dit is vermoedelik nie 'n probleem nie, omdat dit staties is en nie verander nie.

Hierdie biblioteek lees alle aangrensende waardes in 'n enkele leesoperasie - 24 grepe in die geval van die temperatuur- en drukvergoedingsparameters, 6 grepe vir temperatuur en druk gekombineer en 8 grepe vir humiditeit, temperatuur en druk saam. As die temperatuur alleen gekontroleer word, word slegs 3 grepe gelees.

Gebruik van makros (#definieer, ens.)

Daar is geen makro's in hierdie biblioteek nie, behalwe die gewone makro -biblioteek met 'insluit wag' wat duplisering voorkom.

Alle konstantes word gedefinieer met behulp van die const -navraag, en ontfoutdruk word beheer met standaard C -funksies.

Dit was vir my 'n mate van onsekerheid, maar die advies wat ek kry uit die lees van baie plasings oor hierdie onderwerp is dat die gebruik van #define vir die verklaring van konstantes (ten minste) en (waarskynlik) ontfoutingskontrole onnodig en ongewens is.

Die saak vir die gebruik van const eerder as #define is redelik duidelik - const gebruik dieselfde hulpbronne as #define (dws nul) en die gevolglike waardes volg die omvangsreëls, en verminder die kans op foute.

Die saak vir die beheer van ontfoutingdruk is 'n bietjie minder duidelik, want die manier waarop ek dit gedoen het, beteken dat die finale kode die logika van die ontfoutingstate bevat, selfs al word dit nooit uitgeoefen nie. As die biblioteek in 'n groot projek op 'n mikrobeheerder met 'n baie beperkte geheue gebruik kan word, kan dit 'n probleem word. Aangesien my ontwikkeling op 'n ESP8266 met 'n groot flitsgeheue was, was dit blykbaar nie 'n probleem vir my nie.

Stap 6: Temperatuurprestasie

Ek is van plan om dit later by te voeg.

Stap 7: Drukprestasie

Ek is van plan om dit later by te voeg.

Aanbeveel: