Innholdsfortegnelse:

Bibliotek for BMP280 og BME280: 7 trinn
Bibliotek for BMP280 og BME280: 7 trinn

Video: Bibliotek for BMP280 og BME280: 7 trinn

Video: Bibliotek for BMP280 og BME280: 7 trinn
Video: BME280, Датчик атмосферного давления с гигрометром 2024, November
Anonim
Bibliotek for BMP280 og BME280
Bibliotek for BMP280 og BME280
Bibliotek for BMP280 og BME280
Bibliotek for BMP280 og BME280
Bibliotek for BMP280 og BME280
Bibliotek for BMP280 og BME280

Introduksjon

Jeg bestemte meg ikke for å skrive dette biblioteket. Det "skjedde" som en bivirkning av et prosjekt jeg startet som bruker en BMP280. Det prosjektet er ennå ikke ferdig, men jeg tror biblioteket er klart til å dele med andre. Deretter hadde jeg et behov for å bruke en BME280, som legger til fuktighetsmåling til trykket og temperaturegenskapene til BMP280. BME280 er "bakoverkompatibel" med BMP280 - det vil si at alle registre og trinnene som trengs for å lese trykk og temperatur fra BME280 er de samme som brukes for BMP280. Det er flere registre og trinn som trengs for å lese av fuktighet, bare gjeldende for BME280. Dette reiser spørsmålet, ett bibliotek for begge eller to separate biblioteker. Maskinvaren for de to enhetstypene er fullt utskiftbar. Selv mange av modulene som selges (for eksempel på Ebay og AliExpress) er merket BME/P280. For å finne ut hvilken type det er, må du se på (liten) skrift på selve sensoren, eller teste enhets -ID -byten. Jeg bestemte meg for å gå for et enkelt bibliotek. Det ser ut til å ha fungert OK.

Tilbakemeldinger, spesielt forslag til forbedringer, vil bli verdsatt.

Bibliotekets funksjoner og muligheter

Et bibliotek er et programvare som gir et programmeringsgrensesnitt (API) for en programmerer å utøve funksjonene til enheten, uten nødvendigvis å måtte forholde seg til alle finkornete detaljer. Ønskelig bør API -en være enkel for en nybegynner med enkle krav å komme i gang, samtidig som den gir full utnyttelse av enhetsfunksjonene. Det er ønskelig at biblioteket følger spesifikke retningslinjer fra enhetsprodusenten, samt god praksis for generell programvare. Jeg har forsøkt å oppnå alt dette. Da jeg begynte med BMP280, fant jeg 3 forskjellige biblioteker for det: Adafruit_BMP280; Seeed_BMP280; og en som heter BMP280 fra enhetsprodusenten. Verken Adafruit eller Seeed ga utvidede muligheter, selv om de fungerte bra og var enkle å bruke for grunnleggende applikasjoner. Jeg kunne ikke finne ut hvordan vi bruker den produsert av enhetsprodusenten (Bosch Sensortec). Dette kan være min mangel, snarere enn deres. Imidlertid var biblioteket mye mer komplisert enn de to andre, jeg kunne ikke finne noen instruksjoner eller eksempler på bruk (jeg fant senere eksempler i filen "bmp280_support.c", men disse var ikke spesielt nyttige for meg).

Som et resultat av disse faktorene bestemte jeg meg for å skrive mitt eget bibliotek for BMP280.

Når jeg så på biblioteksituasjonen for BME280, fant jeg separate biblioteker Adafruit_BME280, Seed_BME280 og en annen BME280_MOD-1022 skrevet av Embedded Adventures. Ingen av dem kombinerte funksjonene for BMP280 i et bibliotek som var i stand til å bruke BME280. Ingen av dem støttet eksplisitt enhetens evne til å lagre noen få data mens enheten og den kontrollerende mikroprosessoren sover (denne funksjonen er tydelig i databladet og støttes i biblioteket jeg har skrevet og beskrevet her).

Et kombinert bibliotek bør ha støtte for alle funksjonene til BME280, men når det brukes med en BMP280, bør det ikke pålegge noen omkostninger fra de ubrukte funksjonene. Fordelene med et kombinert bibliotek inkluderer færre biblioteksfiler å administrere, enkel blanding og matching av forskjellige enheter i det samme prosjektet, og forenklede endringer for vedlikehold eller oppgraderinger som bare må gjøres på ett sted i stedet for to. Disse er sannsynligvis alle ganske små, til og med ubetydelige, men …

Enhetsfunksjoner

BMP280 og BME280 er overflatemonterte enheter på omtrent 5 mm firkant og 1 mm høye. Det er 8 grensesnittputer, inkludert 2 separate strøminngangsputer og to jordputer. De er tilgjengelige på eBay som en modul med enten 4 eller 6 pinner hentet ut. 4-pinners modulen har en fast I2C-adresse og kan ikke konfigureres til å bruke SPI-protokollen.

6-pinners modulen eller bare enheten kan brukes med enten I2C- eller SPI-protokoller. I I2C -modus kan den ha to forskjellige adresser, oppnådd ved å koble SDO -pinnen enten til Ground (for baseadresse = 0x76) eller til Vdd (for basisadresse +1 = 0x77). I SPI -modus har den det vanlige arrangementet av 1 klokke, 2 data (en for hver retning) og en pin for valg av enhet (CS).

Biblioteket jeg skrev og beskriver her støtter bare I2C. Adafruit_BMP280 og BME_MOD-1022 bibliotekene har støtte for både i2C og SPI.

Biblioteket kan lastes ned her:

github.com/farmerkeith/BMP280-library

Trinn 1: Konfigurere maskinvaren

Sette opp maskinvaren
Sette opp maskinvaren

Før biblioteket kan være nyttig, er det nødvendig å koble en mikrokontroller til BMP280 (eller to av dem hvis du ønsker det).

Jeg brukte en WeMos D1 mini pro, så jeg vil vise forbindelsene. Andre mikrokontrollere vil være like, du trenger bare å koble SDA- og SCL -pinnene riktig.

Når det gjelder WeMos D1 mini pro, er tilkoblingene:

Funksjon WeMos pin BMP280 pin Notes

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominell 3.3V Jord GND Adressekontroll SDO Jord eller Vdd I2C velg CSB Vdd (GND velger SPI)

Vær oppmerksom på at SDO -pinnen på noen av MP280 -modulene er merket SDD, og Vdd -pinnen kan være merket VCC. Merk: SDA- og SCL-linjer skal ha pull-up-motstander mellom linjen og Vin-pinnen. Vanligvis bør en verdi på 4,7K være OK. Noen BMP280- og BME280-moduler har 10K opptrekkmotstander som er inkludert i modulen (noe som ikke er god praksis, siden å sette flere enheter på I2C-bussen kan laste den for mye). Imidlertid bør bruk av 2 BME/P280-moduler hver med en 10K-motstand ikke være et problem i praksis så lenge det ikke er for mange andre enheter på samme buss, også med opptrekkmotstander.

Når du har koblet maskinvaren, kan du enkelt kontrollere om enheten din er en BMP280 eller en BME280 ved å kjøre skissen I2CScan_ID som du finner her:

Du kan også sjekke om du har en BMP280 eller BME280 ved å se på selve enheten. Jeg fant det nødvendig å bruke et digitalt mikroskop for å gjøre dette, men hvis synet ditt er veldig godt, kan du kanskje gjøre det uten hjelpemidler. Det er to utskriftslinjer på enhetens foringsrør. Nøkkelen er den første bokstaven på den andre linjen, som for BMP280 -enheter er en "K" og for BME280 -enheter er en "U".

Trinn 2: APIer levert av biblioteket

APIer levert av biblioteket
APIer levert av biblioteket
APIer levert av biblioteket
APIer levert av biblioteket

Inkludert biblioteket i en skisse

Biblioteket er inkludert i en skisse på standard måte ved hjelp av setningen

#inkludere "farmerkeith_BMP280.h"

Denne uttalelsen må inkluderes i den tidlige delen av skissen før oppsettet () startes.

Opprette et BME- eller BMP -programvareobjekt

Det er 3 nivåer for å lage BMP280 -programvareobjektet. Det enkleste er bare

bme280 objektnavn; eller bmp280 objektnavn;

for eksempel BMP280 bmp0;

Dette oppretter et programvareobjekt med standardadressen 0x76 (dvs. for SDO koblet til bakken).

Det neste nivået for å lage et BME280- eller BMP280 -programvareobjekt har en parameter på enten 0 eller 1, som følger:

bme280 objektnavnA (0);

bmp280 objectNameB (1);

Parameteren (0 eller 1) legges til I2C -baseadressen, slik at to BME280- eller BMP280 -enheter kan brukes på samme I2C -buss (inkludert en av hver).

Det tredje nivået for å lage et BME- eller BMP280 -programvareobjekt har to parametere. Den første parameteren, som enten er 0 eller 1, er for adressen, som for forrige sak. Den andre parameteren kontrollerer feilsøkingsutskrift. Hvis den er satt til 1, resulterer hver transaksjon med programvareobjektet i Serial.print -utganger som gjør det mulig for programmereren å se detaljene i transaksjonen. For eksempel:

bmp280 objectNameB (1, 1);

Hvis parameteren for feilsøkingsutskrift er satt til 0, går programvareobjektet tilbake til normal oppførsel (ingen utskrift).

Denne eller deklarasjonen må inkluderes etter #include og før setup () -funksjonen.

Initialiserer BME- eller BMP -programvareobjektet

Før den brukes, er det nødvendig å lese kalibreringsparametrene fra enheten og konfigurere den for hvilken målemodus, oversampling og filterinnstillinger som er passende.

For en enkel initialisering for generelle formål er uttalelsen:

objectName.begin ();

Denne versjonen av start () leser kalibreringsparametrene fra enheten og angir osrs_t = 7 (16 temperaturmålinger), osrs_p = 7 (16 trykkmålinger), modus = 3 (kontinuerlig, normal), t_sb = 0 (0,5 ms søvn mellom målesett), filter = 0 (K = 1, så ingen filtrering) og spiw_en = 0 (SPI deaktivert, så bruk I2C). Når det gjelder BME280, er det en ekstra parameter osrs_h = 7 for 16 fuktighetsmålinger.

Det er en annen versjon av begin () som tar alle seks (eller 7) parametrene. Tilsvarende til uttalelsen ovenfor er

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

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

Den komplette listen over koder og deres betydning er i databladet BME280 og BMP280, og også i kommentarene i.cpp -filen i biblioteket.

Enkel temperatur- og trykkmåling

For å få en temperaturmåling er den enkleste måten

dobbel temperatur = objectName.readTemperature (); // måle temperaturen

For å få en trykkmåling er den enkleste måten

dobbelt trykk = objectName.readPressure (); // måle trykk

Den enkleste måten er å få en fuktighetsmåling

dobbel fuktighet = objectName.readHumidity (); // måle fuktighet (bare BME280)

For å få både temperatur og trykk kan de to utsagnene ovenfor brukes etter hverandre, men det er et annet alternativ, som er:

dobbel temperatur;

dobbelt trykk = objectName.readPressure (temperatur); // måle trykk og temperatur

Denne uttalelsen leser dataene fra BME280- eller BMP280 -enheten bare én gang, og returnerer både temperatur og trykk. Dette er litt mer effektiv bruk av I2C -bussen og sikrer at de to avlesningene tilsvarer den samme målesyklusen.

For BME 280 er en kombinert uttalelse som får alle tre verdiene (fuktighet, temperatur og trykk):

dobbel temperatur, trykk; dobbel fuktighet = objectName.readHumidity (temperatur, trykk); // måle fuktighet, trykk og temperatur

Denne setningen leser dataene fra BMP280 -enheten bare én gang, og returnerer alle tre verdiene. Dette er litt mer effektiv bruk av I2C -bussen og sikrer at de tre avlesningene tilsvarer den samme målesyklusen. Vær oppmerksom på at navnene på variablene kan endres til alt brukeren liker, men rekkefølgen deres er fast - temperaturen kommer først, og trykket kommer andre.

Disse brukstilfellene er dekket i eksempelskisser som følger med biblioteket, som basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino og basicHumidityAndTemperatureAndPressure.ino.

Mer sofistikert temperatur- og trykkmåling

Selv om ovenstående serie utsagn vil fungere uten problemer, er det et par problemer:

  1. enheten kjører kontinuerlig, og bruker derfor strøm på sitt maksimale nivå. Hvis energien kommer fra et batteri, kan det være nødvendig å redusere dette.
  2. på grunn av strømforbruket vil enheten oppleve oppvarming, og derfor vil den målte temperaturen være høyere enn omgivelsestemperaturen. Jeg vil dekke dette mer i et senere trinn.

Et resultat som bruker mindre strøm og gir en temperatur som er nærmere omgivelsene, kan oppnås ved å bruke begin () med parametere som setter den i dvale (f.eks. Modus = 0). For eksempel:

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

Når en måling er ønsket, våkner du enheten med en konfigurasjonskommando for å registrere F2 (om nødvendig) og F4 som angir de riktige verdiene til osrs_h, osrs_t og osrs_p, pluss -modus = 1 (enkeltskuddsmodus). For eksempel:

[objectName.updateF2Control (1);] // osrs_h - aldri nødvendig for BMP280, // og ikke nødvendig for BME280 hvis antall målinger ikke endres // fra verdien som ble oppgitt i begynnelsen (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, modus

Etter å ha vekket enheten, begynner den å måle, men resultatet vil ikke være tilgjengelig på noen millisekunder - minst 4 ms, kanskje opptil 70 ms eller mer, avhengig av antall målinger som er spesifisert. Hvis lese -kommandoen sendes umiddelbart, vil enheten returnere verdiene fra forrige måling - noe som kan være akseptabelt i noen applikasjoner, men i de fleste tilfeller er det sannsynligvis bedre å utsette til den nye målingen er tilgjengelig.

Denne forsinkelsen kan gjøres på flere måter.

  1. vent et fast tidsrom for å dekke den lengste forventede forsinkelsen
  2. vent en tid beregnet ut fra maksimal målingstid per måling (dvs. 2,3 ms) ganger antall målinger, pluss overhead, pluss en margin.
  3. vent en kortere tid beregnet som ovenfor, men bruk den nominelle måletiden (dvs. 2 ms) pluss overhead, og begynn deretter å sjekke "Jeg måler" -biten i statusregisteret. Når statusbiten leser 0 (dvs. ikke måler), får du temperatur- og trykkavlesningene.
  4. umiddelbart begynne å kontrollere statusregisteret, og få temperatur- og trykkavlesninger når statusbiten leser 0,

Jeg vil vise et eksempel på en måte å gjøre dette på litt senere.

Konfigurasjonsregisteroperasjoner

For å få alt dette til å skje, trenger vi flere verktøy som jeg ennå ikke har introdusert. De er:

byte readRegister (reg)

void updateRegister (reg, verdi)

Hver av disse har flere avledede kommandoer i biblioteket, noe som gjør programvaren for spesifikke handlinger litt enklere.

Eksemplet powerSaverPressureAndTemperature.ino bruker metode nr. 3. Kodelinjen som utfører gjentatt kontroll er

mens (bmp0.readRegister (0xF3) >> 3); // sløyfe til F3bit 3 == 0

Vær oppmerksom på at denne skissen er for en ESP8266 mikrokontroller. Jeg brukte en WeMos D1 mini pro. Skissen vil ikke fungere med Atmega mikrokontrollere, som har forskjellige instruksjoner for å sove. Denne skissen utøver flere andre kommandoer, så jeg vil introdusere dem alle før jeg beskriver den skissen mer detaljert.

Når mikrokontrolleren sover parallelt med BMP280 -sensoren, kan konfigurasjonen av sensoren for de nødvendige målingene gjøres i kommandoen start (), ved hjelp av de 6 parametrene. Men hvis mikrokontrolleren ikke sover, men sensoren er det, må sensoren vekkes på målingstidspunktet og fortelles om målekonfigurasjonen. Dette kan gjøres direkte med

updateRegister (reg, verdi)

men er litt lettere med følgende tre kommandoer:

updateF2Control (osrs_h); // bare BME280

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

Etter at målingen er utført, hvis modusen som brukes er Single shot (tvunget modus), vil enheten automatisk gå i dvale igjen. Imidlertid, hvis målesettet innebærer flere målinger i kontinuerlig (normal) modus, må BMP280 settes i dvale igjen. Dette kan gjøres med en av de to følgende kommandoene:

updateF4Control16xSleep ();

updateF4ControlSleep (verdi);

Begge disse setter modusbitene til 00 (dvs. hvilemodus). Imidlertid setter den første osrs_t og osrs_p til 111 (dvs. 16 målinger), mens den andre lagrer de lave 6 bitene fra "verdi" til bits 7: 2 i 0xF4 -registeret.

På samme måte lagrer følgende påstand de lave seks bitene med "verdi" i bitene 7: 2 i 0xF5 -registret.

updateF5ConfigSleep (verdi);

Bruken av disse sistnevnte kommandoene muliggjør lagring av 12 biter informasjon i BMP280 -registerene F4 og F5. I hvert fall når det gjelder ESP8266, når mikrokontrolleren våkner etter en periode med søvn, starter den i begynnelsen av skissen uten å ha kjennskap til tilstanden før søvnkommandoen. For å lagre kunnskap om tilstanden før søvnkommandoen, kan data lagres i flashminne, enten ved hjelp av EEPROM -funksjonene eller ved å skrive en fil ved hjelp av SPIFFS. Imidlertid har flashminnet en begrensning av antall skrivesykluser, i størrelsesorden 10 000 til 100 000. Dette betyr at hvis mikrokontrolleren går gjennom en søvn-våkne-syklus noen få sekunder, kan den overskride den tillatte minneskriveren grense om noen måneder. Lagring av noen få biter data i BMP280 har ingen slik begrensning.

Dataene som er lagret i registerene F4 og F5 kan gjenopprettes når mikrokontrolleren våkner ved hjelp av kommandoene

readF4Sleep ();

readF5Sleep ();

Disse funksjonene leser det tilsvarende registeret, skifter innholdet for å fjerne de 2 LSB -ene og returnerer de resterende 6 bitene. Disse funksjonene brukes i eksempelskissen powerSaverPressureAndTemperatureESP.ino som følger:

// les verdien av EventCounter tilbake fra bmp0

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

Disse funksjonene leser det tilsvarende registeret, skifter innholdet for å fjerne de 2 LSBene og returnerer de 6 resterende bitene. Disse funksjonene brukes i eksempelskissen powerSaverPressureAndTemperature.ino som følger:

// les verdien av EventCounter tilbake fra bmp1

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

Rå temperatur og trykkfunksjoner

Den grunnleggende funksjonen readTemperature, readPressure og readHumidity har to komponenter. Først blir de rå 20-biters temperatur og trykkverdier hentet fra BME/P280, eller den rå 16-biters fuktighetsverdi er hentet fra BME280. Deretter brukes kompensasjonsalgoritmen til å generere utgangsverdiene i grader Celsius, hPa eller %RH.

Biblioteket tilbyr separate funksjoner for disse komponentene, slik at data om råtemperatur, trykk og fuktighet kan oppnås og kanskje manipuleres på en eller annen måte. Algoritmen for å avlede temperaturen, trykket og fuktigheten fra disse råverdiene er også gitt. I biblioteket implementeres disse algoritmene ved bruk av dobbeltlengde flytende aritmetikk. Det fungerer bra på ESP8266, som er en 32-biters prosessor og bruker 64 bits for "doble" flytevariabler. Å gjøre disse funksjonene tilgjengelige kan være nyttig for å vurdere og muligens endre beregningen for andre plattformer.

Disse funksjonene er:

readRawPressure (rawTemperature); // leser rådata og temperaturdata fra BME/P280readRawHumidity (rawTemperature, rawPressure); // leser rå fuktighet, temperatur og trykkdata fra BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

"T-fine" -argumentet til disse funksjonene er verdt litt forklaring. Både algoritmer for trykk- og fuktighetskompensasjon inkluderer en temperaturavhengig komponent som oppnås gjennom variabelen t_fine. CalcTemperature -funksjonen skriver en verdi i t_fine basert på temperaturkompensasjonsalgoritmen logikk, som deretter brukes som inngang i både calcPressure og calcHumidity.

Et eksempel på bruk av disse funksjonene finnes i eksempelskissen rawPressureAndTemperature.ino, og også i koden for readHumidity () -funksjonen i.cpp -filen i biblioteket.

Høyde og havnivåstrykk

Det er et kjent forhold mellom atmosfærisk trykk og høyde. Været påvirker også trykket. Når værorganisasjonene publiserer informasjon om atmosfærisk trykk, justerer de det vanligvis for høyde, og så viser det "synoptiske diagrammet" isobarer (linjer med konstant trykk) standardisert til å bety havnivå. Så egentlig er det 3 verdier i dette forholdet, og å kjenne to av dem muliggjør utledning av den tredje. De tre verdiene er:

  • høyde over havet
  • faktisk lufttrykk i den høyden
  • ekvivalent lufttrykk ved havnivå (strengere, gjennomsnittlig havnivå, fordi øyeblikkelig havnivå endres konstant)

Dette biblioteket gir to funksjoner for dette forholdet, som følger:

calcAltitude (trykk, seaLevelhPa);

calcNormalisedPressure (trykk, høyde);

Det er også en forenklet versjon, som forutsetter standard havtrykk på 1013,15 hPa.

calcAltitude (trykk); // standard seaLevelPressure antatt

Trinn 3: BMP280 enhetsdetaljer

BMP280 Enhetsdetaljer
BMP280 Enhetsdetaljer

Maskinvaremuligheter

BMP280 har 2 byte med konfigurasjonsdata (ved registeradresser 0xF4 og 0xF5) som brukes til å kontrollere flere måle- og datautmatingsalternativer. Den gir også 2 biter med statusinformasjon og 24 byte med kalibreringsparametere som brukes til å konvertere rå temperatur og trykkverdier til konvensjonelle temperatur- og trykkenheter. BME280 har tilleggsdata som følger:

  • 1 ekstra byte med konfigurasjonsdata på registeradressen 0xF2 som brukes til å kontrollere flere fuktighetsmålinger;
  • 8 ekstra byte kalibreringsparametere som brukes til å konvertere rå fuktighetsverdi til relativ fuktighetsprosent.

Temperatur-, trykk- og statusregistrene for BME280 er de samme som for BMP280 med mindre unntak som følger:

  • "ID" -bitene i BME280 er satt til 0x60, så det kan skilles fra BMP280 som kan være 0x56, 0x57 eller 0x58
  • sovetidskontrollen (t_sb) endres slik at de to lange tidene i BMP280 (2000 ms og 4000 ms) erstattes i BME280 med korte tider på 10 ms og 20 ms. Maksimal søvntid i BME280 er 1000 ms.
  • I BME280 er temperatur- og trykkråverdiene alltid 20 bits hvis filtrering påføres. Bruken av 16 til 19 bitverdier er begrenset til tilfeller uten filtrering (dvs. filter = 0).

Temperatur og trykk er hver 20 biters verdier, som må konverteres til konvensjonell temperatur og trykk via en ganske kompleks algoritme ved bruk av 3 16 biters kalibreringsparametere for temperatur og 9 16 biters kalibreringsparametere pluss temperaturen for trykk. Granulatiteten til temperaturmåling er 0,0003 grader Celsius for en minst signifikant bitendring (20 biters avlesning), og øker til 0,0046 grader Celsius hvis 16 biters avlesning brukes.

Fuktighet er en 16 -bits verdi som må konverteres til relativ fuktighet via en annen kompleks algoritme ved å bruke 6 kalibreringsparametere som er en blanding av 8, 12 og 16 bits.

Dataarket viser absolutt nøyaktighet av temperaturavlesningen som +-0,5 C ved 25 C og +-1 C i området 0 til 65 C.

Trykkmålingens granularitet er 0,15 Pascal (dvs. 0,0015 hektoPascal) ved 20 biters oppløsning, eller 2,5 Pascal ved 16 biters oppløsning. Råtrykkverdien påvirkes av temperaturen, slik at en temperaturøkning på 1 grad C reduserer det målte trykket med 24 Pascal rundt 25C. Temperaturfølsomheten er redegjort for i kalibreringsalgoritmen, så de leverte trykkverdiene bør være nøyaktige ved forskjellige temperaturer.

Dataarket viser absolutt nøyaktighet av trykkavlesningen som +-1 hPa for temperaturer mellom 0 C og 65 C.

Nøyaktigheten av fuktigheten er gitt i databladet som +-3% RH, og +-1% hysterese.

Hvordan det fungerer

De 24 byte med temperatur- og trykkalibreringsdata, og også for BME280, må de 8 byte med fuktighetskalibreringsdata leses fra enheten og lagres i variabler. Disse dataene er individuelt programmert på enheten på fabrikken, så forskjellige enheter har forskjellige verdier - i hvert fall for noen av parameterne. En BME/P280 kan være i en av to tilstander. I en tilstand måler den. I den andre staten venter den (sover).

Hvilken tilstand den er i kan kontrolleres ved å se på bit 3 i register 0xF3.

Resultatene av den siste målingen kan når som helst oppnås ved å lese den tilsvarende dataverdien, uavhengig av om enheten sover eller måler.

Det er også to måter å bruke BME/P280. Den ene er Kontinuerlig modus (kalt Normal modus i databladet), som gjentatte ganger går mellom måling og sovende tilstand. I denne modusen utfører enheten et sett med målinger, går deretter i dvale, våkner deretter for et nytt sett med målinger og så videre. Antall individuelle målinger og varigheten av søvndelen av syklusen kan alle kontrolleres gjennom konfigurasjonsregistrene.

Den andre måten å bruke BME/P280 er Single Shot -modus (kalt tvungen modus i databladet). I denne modusen vekkes enheten fra hvilemodus med en kommando som måles, den gjør et sett med målinger og går deretter i dvale igjen. Antall individuelle målinger i settet styres i konfigurasjonskommandoen som vekker enheten.

I BMP280, hvis en enkelt måling er utført, fylles de 16 mest signifikante bitene i verdien, og de fire minst signifikante bitene i verdien er alle nuller. Antall målinger kan settes til 1, 2, 4, 8 eller 16, og etter hvert som antallet målinger øker, øker antallet biter som er fylt med data, slik at med 16 målinger fylles alle 20 biter med måledata. Dataarket omtaler denne prosessen som oversampling.

I BME280 gjelder det samme arrangementet så lenge resultatet ikke blir filtrert. Hvis filtrering brukes, er verdiene alltid 20 bits, uavhengig av hvor mange målinger som tas i hver målesyklus.

Hver individuelle måling tar omtrent 2 millisekunder (typisk verdi; maksimal verdi er 2,3 ms). Legg til dette betyr at en fast overhead på omtrent 2 ms (vanligvis litt mindre) betyr at en målesekvens, som kan bestå av fra 1 til 32 individuelle målinger, kan ta fra 4 ms opp til 66 ms.

Dataarket inneholder et sett med anbefalte kombinasjoner av temperatur og trykkoversampling for forskjellige applikasjoner.

Konfigurasjonskontrollregistre

De to konfigurasjonskontrollregistrene i BMP280 er på registeradressene 0xF4 og 0xF5, og er kartlagt til 6 individuelle konfigurasjonskontrollverdier. 0xF4 består av:

  • 3 bits osrs_t (mål temperatur 0, 1, 2, 4, 8 eller 16 ganger);
  • 3 bits osrs_p (måle trykk 0, 1, 2, 4, 8 eller 16 ganger); og
  • 2 bits modus (hvilemodus, tvunget (dvs. enkeltbilde), normal (dvs. kontinuerlig).

0xF5 består av:

  • 3 bits t_sb (standby -tid, 0,5 ms til 4000 ms);
  • 3 bits filter (se nedenfor); og
  • 1 bit spiw_en som velger SPI eller I2C.

Filterparameteren styrer en type eksponentiell forfallalgoritme, eller Infinite Impulse Response (IIR) -filter, som brukes på målingene for råtrykk og temperatur (men ikke på fuktighetsverdiene). Ligningen er gitt i databladet. En annen presentasjon er:

Verdi (n) = Verdi (n-1) * (K-1) / K + måling (n) / K

hvor (n) angir den siste måle- og utgangsverdien; og K er filterparameteren. Filterparameteren K og kan settes til 1, 2, 4, 8 eller 16. Hvis K er satt til 1 blir ligningen bare verdi (n) = måling (n). Kodingen av filterparameteren er:

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

BME 280 legger til et ytterligere konfigurasjonskontrollregister på adressen 0xF2, "ctrl_hum" med en enkelt 3-biters parameter osrs_h (måle fuktighet 0, 1, 2, 4, 8 eller 16 ganger).

Trinn 4: Måling og avlesningstidspunkt

Jeg planlegger å legge til dette senere, og viser tidspunktet for kommandoer og målesvar.

Iddt - strøm ved temperaturmåling. Typisk verdi 325 uA

Iddp - strøm ved trykkmåling. Typisk verdi 720 uA, maks 1120 uA

Iddsb - gjeldende i standby -modus. Typisk verdi 0,2 uA, maks 0,5 uA

Iddsl - gjeldende i hvilemodus. Typisk verdi 0,1 uA, maks 0,3 uA

Trinn 5: Retningslinjer for programvare

Retningslinjer for programvare
Retningslinjer for programvare
Retningslinjer for programvare
Retningslinjer for programvare

I2C Burst -modus

BMP280 -databladet gir veiledning om dataavlesning (avsnitt 3.9). Det står "det anbefales sterkt å bruke en burst-lese og ikke adressere hvert register individuelt. Dette forhindrer en mulig blanding av byte som tilhører forskjellige målinger og reduserer grensesnitttrafikk." Det gis ingen veiledning angående avlesning av kompensasjons-/kalibreringsparameterne. Antagelig er dette ikke et problem fordi de er statiske og ikke endres.

Dette biblioteket leser alle sammenhengende verdier i en enkelt leseoperasjon - 24 byte for temperatur- og trykkompensasjonsparametere, 6 byte for temperatur og trykk kombinert, og 8 byte for fuktighet, temperatur og trykk kombinert. Når temperaturen alene sjekkes, leses bare 3 byte.

Bruk av makroer (#define etc.)

Det er ingen makroer i dette biblioteket enn den vanlige biblioteket "include guard" -makro som forhindrer duplisering.

Alle konstanter defineres ved hjelp av const -søkeordet, og feilsøkingsutskrift kontrolleres med standard C -funksjoner.

Det har vært kilden til en viss usikkerhet for meg, men rådet jeg får fra å lese mange innlegg om dette emnet er at bruk av #define for erklæring av konstanter (minst) og (sannsynligvis) feilsøkingsutskriftskontroll er unødvendig og uønsket.

Tilfellet for bruk av const i stedet for #define er ganske klart - const bruker de samme ressursene som #define (dvs. null), og de resulterende verdiene følger omfangsreglene, og reduserer dermed sjansen for feil.

Saken for feilsøkingsutskriftskontroll er litt mindre klar, fordi måten jeg har gjort det på betyr at den siste koden inneholder logikken for feilsøkingsutskriftssetningene, selv om de aldri blir utøvd. Hvis biblioteket skal brukes i et stort prosjekt på en mikrokontroller med svært begrenset minne, kan dette bli et problem. Siden min utvikling var på en ESP8266 med et stort flashminne, så dette ikke ut til å være et problem for meg.

Trinn 6: Temperaturytelse

Jeg har tenkt å legge til dette senere.

Trinn 7: Trykkytelse

Jeg har tenkt å legge til dette senere.

Anbefalt: