Indholdsfortegnelse:

Bibliotek for BMP280 og BME280: 7 trin
Bibliotek for BMP280 og BME280: 7 trin

Video: Bibliotek for BMP280 og BME280: 7 trin

Video: Bibliotek for BMP280 og BME280: 7 trin
Video: Фишки Arduino, о которых ты не знал! 2024, Juli
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

Introduktion

Jeg havde ikke tænkt mig at skrive dette bibliotek. Det "skete" som en bivirkning af et projekt, jeg startede, der bruger en BMP280. Det projekt er endnu ikke afsluttet, men jeg tror, biblioteket er klar til at dele med andre. Efterfølgende havde jeg et behov for at bruge en BME280, som tilføjer fugtighedsmåling til BMP280's tryk og temperatur. BME280 er "bagudkompatibel" med BMP280 - det vil sige, at alle registre og de trin, der er nødvendige for at aflæse tryk og temperatur fra BME280, er de samme som dem, der bruges til BMP280. Der er yderligere registre og trin, der er nødvendige for at aflæse luftfugtighed, kun gældende for BME280. Dette rejser spørgsmålet, et bibliotek for begge eller to separate biblioteker. Hardwaren til de to enhedstyper er fuldt ud udskiftelig. Selv mange af de moduler, der sælges (f.eks. På Ebay og AliExpress) er mærket BME/P280. For at finde ud af hvilken type det er, skal du se på (minimalt) skrift på selve sensoren eller teste enheds -ID -byte. Jeg besluttede at gå til et enkelt bibliotek. Det ser ud til at have fungeret ok.

Feedback, især eventuelle forslag til forbedringer, vil blive værdsat.

Bibliotekets funktioner og muligheder

Et bibliotek er et stykke software, der leverer en Application Programming Interface (API) til en programmerer til at udøve enhedens muligheder uden nødvendigvis at skulle håndtere alle de finkornede detaljer. Det er ønskeligt, at API'en skal være let for en nybegynder med enkle krav at komme i gang, samtidig med at den giver fuld udnyttelse af enhedens muligheder. Det er ønskeligt, at biblioteket skal følge eventuelle specifikke retningslinjer fra enhedsproducenten, samt generel software god praksis. Jeg har bestræbt mig på at opnå alt dette. Da jeg startede med BMP280, fandt jeg 3 forskellige biblioteker til det: Adafruit_BMP280; Seeed_BMP280; og en kaldet BMP280 fra enhedsproducenten. Hverken Adafruit eller Seeed leverede udvidede muligheder, selvom de fungerede godt og var lette at bruge til grundlæggende applikationer. Jeg kunne ikke finde ud af, hvordan vi skulle bruge den, der blev produceret af enhedsproducenten (Bosch Sensortec). Dette kan være min mangel, snarere end deres. Men biblioteket var meget mere kompliceret end de to andre, jeg kunne ikke finde nogen instruktioner eller eksempler på brug (jeg fandt efterfølgende eksempler i filen "bmp280_support.c", men disse var ikke særlig nyttige for mig).

Som et resultat af disse faktorer besluttede jeg at skrive mit eget bibliotek til BMP280.

Når jeg kiggede på bibliotekssituationen for BME280, fandt jeg separate biblioteker Adafruit_BME280, Seed_BME280 og en anden BME280_MOD-1022 skrevet af Embedded Adventures. Ingen af dem kombinerede funktionerne for BMP280 i et bibliotek, der kunne bruge BME280. Ingen af dem understøttede eksplicit enhedernes evne til at gemme et par stumper data, mens enheden og dens styrende mikroprocessor sover (denne evne er tydelig i databladet og understøttet i biblioteket, jeg har skrevet og beskrevet her).

Et kombineret bibliotek skal have understøttelse af alle mulighederne i BME280, men når det bruges med et BMP280, bør det ikke pålægge nogen omkostninger fra de ubrugte funktioner. Fordelene ved et kombineret bibliotek inkluderer færre biblioteksfiler at administrere, let blanding og matchning af forskellige enheder i det samme projekt og forenklede ændringer til vedligeholdelse eller opgraderinger, der kun skal udføres ét sted i stedet for to. Disse er nok alle ganske små, endda ubetydelige, men …

Enhedsfunktioner

BMP280 og BME280 er overflademonterede enheder på cirka 5 mm firkant og 1 mm høje. Der er 8 interfacepuder, herunder 2 separate strømindgangspuder og to jordpuder. De er tilgængelige på eBay som et modul med enten 4 eller 6 ben hentet. Det 4-benede modul har en fast I2C-adresse og kan ikke konfigureres til at bruge SPI-protokollen.

Det 6-benede modul eller den bare enhed kan bruges med enten I2C- eller SPI-protokoller. I I2C -tilstand kan den have to forskellige adresser, der opnås ved at tilslutte SDO -stiften enten til jorden (for basisadresse = 0x76) eller til Vdd (for basisadresse +1 = 0x77). I SPI -tilstand har den det sædvanlige arrangement af 1 ur, 2 data (en for hver retning) og en pin til valg af enhed (CS).

Det bibliotek, jeg skrev og beskriver her, understøtter kun I2C. Adafruit_BMP280 og BME_MOD-1022 bibliotekerne understøtter både i2C og SPI.

Biblioteket kan downloades her:

github.com/farmerkeith/BMP280-library

Trin 1: Opsætning af hardwaren

Opsætning af hardware
Opsætning af hardware

Inden biblioteket kan være nyttigt, er det nødvendigt at tilslutte en mikrokontroller til BMP280 (eller to af dem, hvis du ønsker det).

Jeg brugte en WeMos D1 mini pro, så jeg vil vise dens forbindelser. Andre mikrokontrollere vil være ens, du skal bare tilslutte SDA- og SCL -benene korrekt.

For WeMos D1 mini pro er forbindelserne:

Funktion WeMos pin BMP280 pin Notes

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominel 3.3V Jord GND Adressekontrol SDO Jord eller Vdd I2C vælg CSB Vdd (GND vælger SPI)

Bemærk, at SDO -pin på nogle af MP280 -modulerne er mærket SDD, og Vdd -pin kan være mærket VCC. Bemærk: SDA- og SCL-linjer skal have pull-up-modstande mellem linjen og Vin-stiften. Typisk bør en værdi på 4,7K være OK. Nogle BMP280 og BME280 moduler har 10K pull-up modstande inkluderet i modulet (hvilket ikke er god praksis, da at sætte flere enheder på I2C bussen kan indlæse den for meget). Imidlertid bør brug af 2 BME/P280-moduler hver med en 10K-modstand ikke være et problem i praksis, så længe der ikke er for mange andre enheder på den samme bus, også med pull-up-modstande.

Når du har tilsluttet hardwaren, kan du nemt kontrollere, om din enhed er en BMP280 eller en BME280 ved at køre skitsen I2CScan_ID, som du kan finde her:

Du kan også kontrollere, om du har en BMP280 eller BME280 ved at se på selve enheden. Jeg fandt det nødvendigt at bruge et digitalt mikroskop til at gøre dette, men hvis dit syn er meget godt, kan du muligvis gøre det uden hjælpemidler. Der er to linjer med udskrivning på enhedens hus. Nøglen er det første bogstav på den anden linje, som for BMP280 -enheder er et "K", og for BME280 -enheder er et "U".

Trin 2: API'er leveret af biblioteket

API'er leveret af biblioteket
API'er leveret af biblioteket
API'er leveret af biblioteket
API'er leveret af biblioteket

Herunder biblioteket i en skitse

Biblioteket er inkluderet i en skitse på standardmåden ved hjælp af udsagnet

#inkludere "farmerkeith_BMP280.h"

Denne erklæring skal inkluderes i den tidlige del af skitsen, før opsætningen () -funktionen startes.

Oprettelse af et BME- eller BMP -softwareobjekt

Der er 3 niveauer til oprettelse af BMP280 -softwareobjektet. Det enkleste er bare

bme280 objektnavn; eller bmp280 objektnavn;

for eksempel BMP280 bmp0;

Dette skaber et softwareobjekt med standardadressen 0x76 (dvs. for SDO forbundet til jorden).

Det næste niveau til oprettelse af et BME280- eller BMP280 -softwareobjekt har en parameter på enten 0 eller 1 som følger:

bme280 objektnavnA (0);

bmp280 objektnavnB (1);

Parameteren (0 eller 1) tilføjes til I2C -basisadressen, så to BME280- eller BMP280 -enheder kan bruges på den samme I2C -bus (inklusive en af hver).

Det tredje niveau til oprettelse af et BME- eller BMP280 -softwareobjekt har to parametre. Den første parameter, som enten er 0 eller 1, er for adressen som for den foregående sag. Den anden parameter styrer fejlfinding udskrivning. Hvis den er indstillet til 1, resulterer hver transaktion med softwareobjektet i Serial.print -output, der gør det muligt for programmereren at se detaljerne i transaktionen. For eksempel:

bmp280 objektnavnB (1, 1);

Hvis fejlfindingsudskrivningsparameteren er indstillet til 0, vender softwareobjektet tilbage til normal adfærd (ingen udskrivning).

Denne erklæring eller udsagn skal medtages efter #include og før opsætningsfunktionen ().

Initialisering af BME- eller BMP -softwareobjektet

Inden den bruges, er det nødvendigt at læse kalibreringsparametrene fra enheden og konfigurere den til den målemåde, oversampling og filterindstillinger, der er passende.

For en enkel, generel initialisering er erklæringen:

objectName.begin ();

Denne version af begin () læser kalibreringsparametrene fra enheden og indstiller osrs_t = 7 (16 temperaturmålinger), osrs_p = 7 (16 trykmålinger), mode = 3 (kontinuerlig, normal), t_sb = 0 (0,5 ms søvn mellem målesæt), filter = 0 (K = 1, så ingen filtrering) og spiw_en = 0 (SPI deaktiveret, så brug I2C). For BME280 er der en ekstra parameter osrs_h = 7 for 16 luftfugtighedsmålinger.

Der er en anden version af begin (), der tager alle seks (eller 7) parametre. Ækvivalenten til ovenstående erklæring 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 fulde liste over koder og deres betydning er i databladet BME280 og BMP280 og også i kommentarerne i.cpp -filen i biblioteket.

Enkel temperatur- og trykmåling

For at få en temperaturmåling er den enkleste måde

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

For at få en trykmåling er den enkleste måde

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

For at få en fugtighedsmåling er den enkleste måde

dobbelt luftfugtighed = objectName.readHumidity (); // mål luftfugtighed (kun BME280)

For at få både temperatur og tryk kan de ovenstående to udsagn bruges efter hinanden, men der er en anden mulighed, som er:

dobbelt temperatur;

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

Denne erklæring læser kun dataene fra BME280 eller BMP280 enheden og returnerer både temperatur og tryk. Dette er en lidt mere effektiv brug af I2C -bussen og sikrer, at de to aflæsninger svarer til den samme målecyklus.

For BME 280 er en kombineret erklæring, der får alle tre værdier (fugtighed, temperatur og tryk):

dobbelt temperatur, tryk; dobbelt luftfugtighed = objectName.readHumidity (temperatur, tryk); // måle luftfugtighed, tryk og temperatur

Denne erklæring læser dataene fra BMP280 -enheden kun én gang og returnerer alle tre værdier. Dette er en lidt mere effektiv brug af I2C -bussen og sikrer, at de tre aflæsninger svarer til den samme målecyklus. Bemærk, at navnene på variablerne kan ændres til alt, hvad brugeren kan lide, men deres rækkefølge er fastlagt - temperaturen kommer først, og trykket kommer for det andet.

Disse anvendelsessager er dækket i eksempelskitser, der følger med biblioteket, idet de er basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino og basicHumidityAndTemperatureAndPressure.ino.

Mere sofistikeret temperatur- og trykmåling

Selvom ovenstående serie af udsagn fungerer uden problemer, er der et par spørgsmål:

  1. enheden kører kontinuerligt og bruger derfor strøm på sit maksimale niveau. Hvis energien kommer fra et batteri, kan det være nødvendigt at reducere dette.
  2. på grund af den forbrugte strøm vil enheden opleve opvarmning, og derfor vil den målte temperatur være højere end omgivelsestemperaturen. Jeg vil dække dette mere i et senere trin.

Et resultat, der bruger mindre strøm og giver en temperatur, der er tættere på omgivelserne, kan opnås ved at bruge begin () med parametre, der sætter det i dvale (f.eks. Mode = 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 ønskes, skal du vække enheden med en konfigurationskommando for at registrere F2 (hvis det kræves) og F4, der indstiller de relevante værdier for osrs_h, osrs_t og osrs_p, plus mode = 1 (single shot mode). For eksempel:

[objectName.updateF2Control (1);] // osrs_h - aldrig nødvendig for BMP280, // og ikke nødvendig for BME280, hvis antallet af målinger ikke ændres // fra værdien angivet i begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Efter at have vågnet enheden, begynder den at måle, men resultatet vil ikke være tilgængeligt i nogle millisekunder - mindst 4 ms, måske op til 70 ms eller mere, afhængigt af antallet af målinger, der er angivet. Hvis læsekommandoen sendes med det samme, returnerer enheden værdierne fra den tidligere måling - hvilket kan være acceptabelt i nogle applikationer, men i de fleste tilfælde er det sandsynligvis bedre at forsinke, indtil den nye måling er tilgængelig.

Denne forsinkelse kan gøres på flere måder.

  1. vent et bestemt tidsrum for at dække den længste forventede forsinkelse
  2. vent et tidsrum beregnet ud fra den maksimale måletid pr. måling (dvs. 2,3 ms) gange antallet af målinger plus overhead plus en margin.
  3. vent en kortere tid beregnet som ovenfor, men ved hjælp af den nominelle måletid (dvs. 2 ms) plus overhead, og begynd derefter at kontrollere "Jeg måler" -biten i statusregistret. Når statusbitten læser 0 (dvs. ikke måler), skal du få temperatur- og trykmålingerne.
  4. start straks med at kontrollere statusregistret, og få temperatur- og trykaflæsninger, når statusbiten læser 0,

Jeg vil vise et eksempel på en måde at gøre dette lidt senere.

Konfigurationsregisteroperationer

For at få alt dette til at ske, har vi brug for flere værktøjer, som jeg endnu ikke har introduceret. De er:

byte readRegister (reg)

void updateRegister (reg, værdi)

Hver af disse har flere afledte kommandoer i biblioteket, som gør softwaren til specifikke handlinger lidt enklere.

Eksemplet powerSaverPressureAndTemperature.ino bruger metode nr. 3. Kodelinjen, der foretager den gentagne kontrol, er

mens (bmp0.readRegister (0xF3) >> 3); // loop til F3bit 3 == 0

Bemærk, at denne skitse er til en ESP8266 mikrokontroller. Jeg brugte en WeMos D1 mini pro. Skitsen fungerer ikke med Atmega -mikrokontrollere, der har forskellige instruktioner til at sove. Denne skitse udøver flere andre kommandoer, så jeg vil introducere dem alle, før jeg beskriver denne skitse mere detaljeret.

Når mikrokontrolleren sover parallelt med BMP280 -sensoren, kan konfigurationen af sensoren til de krævede målinger udføres i start () -kommandoen ved hjælp af de 6 parametre. Men hvis mikrokontrolleren ikke sover, men sensoren er det, skal sensoren på målingstidspunktet vækkes og fortælle sin målekonfiguration. Dette kan gøres direkte med

updateRegister (reg, værdi)

men er lidt lettere med følgende tre kommandoer:

updateF2Control (osrs_h); // Kun BME280

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

Når målingen er udført, hvis den anvendte tilstand er enkeltskud (tvungen tilstand), går enheden automatisk i dvale igen. Men hvis målesættet involverer flere målinger ved hjælp af kontinuerlig (normal) tilstand, skal BMP280 sættes i dvale igen. Dette kan gøres med en af de to følgende kommandoer:

updateF4Control16xSleep ();

updateF4ControlSleep (værdi);

Begge disse indstiller funktionsbitene til 00 (dvs. dvaletilstand). Den første indstiller imidlertid osrs_t og osrs_p til 111 (dvs. 16 målinger), mens den anden lagrer de lave 6 bits fra "værdi" til bits 7: 2 i 0xF4 -registret.

På samme måde gemmer den følgende sætning de lave seks bits af "værdi" i bit 7: 2 i 0xF5 -registret.

updateF5ConfigSleep (værdi);

Brugen af disse sidstnævnte kommandoer muliggør lagring af 12 bits information i BMP280 -registre F4 og F5. I hvert fald i tilfælde af ESP8266, når mikrokontrolleren vågner efter en periode med søvn, starter den i begyndelsen af skitsen uden kendskab til dens tilstand før søvnkommandoen. For at gemme kendskab til dens tilstand før sleep -kommandoen kan data gemmes i flash -hukommelse ved hjælp af enten EEPROM -funktionerne eller ved at skrive en fil ved hjælp af SPIFFS. Flashhukommelsen har imidlertid en begrænsning af antallet af skrivecyklusser i størrelsesordenen 10.000 til 100.000. Det betyder, at hvis mikrokontrolleren gennemgår en sove-vågne-cyklus hvert par sekunder, kan den overskride den tilladte hukommelsesskrivning grænse om et par måneder. Lagring af et par stykker data i BMP280 har ingen sådan begrænsning.

De data, der er gemt i registre F4 og F5, kan gendannes, når mikrokontrolleren vågner ved hjælp af kommandoerne

readF4Sleep ();

readF5Sleep ();

Disse funktioner læser det tilsvarende register, flytter indholdet for at fjerne de 2 LSB'er og returnerer de resterende 6 bit. Disse funktioner bruges i eksemplet sketch powerSaverPressureAndTemperatureESP.ino som følger:

// læs værdien af EventCounter tilbage fra bmp0

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

Disse funktioner læser det tilsvarende register, flytter indholdet for at fjerne de 2 LSB'er og returnerer de resterende 6 bit. Disse funktioner bruges i eksemplet sketch powerSaverPressureAndTemperature.ino som følger:

// læs værdien af EventCounter tilbage 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 trykfunktioner

De grundlæggende readTemperature-, readPressure- og readHumidity -funktioner har to komponenter. Først opnås de rå 20-bit temperatur- og trykværdier fra BME/P280, eller den rå 16-bit fugtighedsværdi opnås fra BME280. Derefter bruges kompensationsalgoritmen til at generere outputværdierne i grader Celsius, hPa eller %RH.

Biblioteket har separate funktioner til disse komponenter, så data om råtemperatur, tryk og luftfugtighed kan opnås og måske manipuleres på en eller anden måde. Algoritmen til at udlede temperaturen, trykket og fugtigheden fra disse råværdier findes også. I biblioteket implementeres disse algoritmer ved hjælp af dobbeltlængde -flydende aritmetik. Det fungerer godt på ESP8266, som er en 32-bit processor og bruger 64 bit til "dobbelte" float-variabler. At gøre disse funktioner tilgængelige kan være nyttig til vurdering og muligvis ændring af beregningen for andre platforme.

Disse funktioner er:

readRawPressure (rawTemperature); // læser råtryk og temperaturdata fra BME/P280readRawHumidity (rawTemperature, rawPressure); // læser rå fugtigheds-, temperatur- og trykdata fra BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

"T-fine" argumentet til disse funktioner er en smule forklaring værd. Både algoritmer til tryk- og fugtighedskompensation inkluderer en temperaturafhængig komponent, der opnås gennem variablen t_fine. Funktionen calcTemperature skriver en værdi i t_fine baseret på temperaturkompensationsalgoritmen logik, som derefter bruges som input i både calcPressure og calcHumidity.

Et eksempel på brugen af disse funktioner findes i eksempelskitsen rawPressureAndTemperature.ino og også i koden til funktionen readHumidity () i bibliotekets.cpp -fil.

Højde og havniveautryk

Der er et kendt forhold mellem atmosfærisk tryk og højde. Vejret påvirker også trykket. Når vejrorganisationerne offentliggør oplysninger om atmosfærisk tryk, justerer de det normalt til højde, så det "synoptiske diagram" viser isobarer (linjer med konstant tryk) standardiseret til at betyde havets overflade. Så der er virkelig 3 værdier i dette forhold, og at kende to af dem muliggør udledning af den tredje. De 3 værdier er:

  • højde over havets overflade
  • det faktiske lufttryk i den højde
  • ækvivalent lufttryk ved havniveau (mere strengt, middelhavsniveau, fordi øjeblikkelig havniveau konstant ændres)

Dette bibliotek indeholder to funktioner til dette forhold som følger:

calcAltitude (tryk, seaLevelhPa);

calcNormalisedPressure (tryk, højde);

Der er også en forenklet version, der forudsætter standard havtryk på 1013,15 hPa.

calcAltitude (tryk); // standard seaLevelPressure forudsat

Trin 3: BMP280 -enhedsoplysninger

BMP280 Enhedsoplysninger
BMP280 Enhedsoplysninger

Hardwarefunktioner

BMP280 har 2 byte konfigurationsdata (ved registeradresser 0xF4 og 0xF5), som bruges til at styre flere måle- og dataoutputmuligheder. Det giver også 2 bits statusinformation og 24 bytes kalibreringsparametre, der bruges til at konvertere råtemperatur og trykværdier til konventionelle temperatur- og trykenheder. BME280 har yderligere data som følger:

  • 1 ekstra byte af konfigurationsdata på registeradressen 0xF2, der bruges til at styre flere luftfugtighedsmålinger;
  • 8 ekstra bytes kalibreringsparametre, der bruges til at konvertere råfugtighedsværdien til relativ fugtighedsprocent.

Temperatur-, tryk- og statusregistre for BME280 er de samme som for BMP280 med mindre undtagelser som følger:

  • "ID" bitene i BME280 er indstillet til 0x60, så det kan skelnes fra BMP280, som kan være 0x56, 0x57 eller 0x58
  • søvntidskontrollen (t_sb) ændres, så de to lange tider i BMP280 (2000 ms og 4000 ms) erstattes i BME280 med korte tider på 10 ms og 20 ms. Den maksimale søvntid i BME280 er 1000 ms.
  • I BME280 er temperatur- og trykråværdierne altid 20 bit, hvis filtrering anvendes. Anvendelsen af 16 til 19 bit -værdier er begrænset til tilfælde uden filtrering (dvs. filter = 0).

Temperatur og tryk er hver 20 bit værdier, som skal konverteres til konventionel temperatur og tryk via en temmelig kompleks algoritme ved hjælp af 3 16 bit kalibreringsparametre for temperatur og 9 16 bit kalibreringsparametre plus temperaturen for tryk. Temperaturmålingens granulatitet er 0,0003 grader Celsius for en mindst signifikant bitændring (20 bit aflæsning), der stiger til 0,0046 grader Celsius, hvis 16 bit aflæsning bruges.

Fugtighed er en 16 bit værdi, som skal konverteres til relativ luftfugtighed via en anden kompleks algoritme ved hjælp af 6 kalibreringsparametre, som er en blanding af 8, 12 og 16 bits.

Dataarket viser den absolutte nøjagtighed af temperaturaflæsning som +-0,5 C ved 25 C og +-1 C i området 0 til 65 C.

Trykmålingens granularitet er 0,15 Pascal (dvs. 0,0015 hektoPascal) ved 20 bit opløsning eller 2,5 Pascal ved 16 bit opløsning. Råtrykværdien påvirkes af temperaturen, så omkring 25C, en stigning i temperaturen på 1 grad C reducerer det målte tryk med 24 Pascal. Temperaturfølsomheden er redegjort for i kalibreringsalgoritmen, så de leverede trykværdier skal være nøjagtige ved forskellige temperaturer.

Databladet viser den absolutte nøjagtighed af trykaflæsning som +-1 hPa for temperaturer mellem 0 C og 65 C.

Fugtighedens nøjagtighed er angivet i databladet som +-3% RH og +-1% hysterese.

Hvordan det virker

De 24 bytes med temperatur- og trykkalibreringsdata, og også i tilfælde af BME280, skal de 8 bytes med fugtighedskalibreringsdata læses fra enheden og gemmes i variabler. Disse data er individuelt programmeret i enheden på fabrikken, så forskellige enheder har forskellige værdier - i hvert fald for nogle af parametrene. En BME/P280 kan være i en af to tilstande. I en tilstand måler den. I den anden tilstand venter den (sover).

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

Resultaterne af den seneste måling kan til enhver tid opnås ved at læse den tilsvarende dataværdi, uanset om enheden sover eller måler.

Der er også to måder at betjene BME/P280. Den ene er Kontinuerlig tilstand (kaldet Normal tilstand i databladet), der gentagne gange cykler mellem måling og sovende tilstande. I denne tilstand udfører enheden et sæt målinger, går derefter i dvale, vågner derefter til et andet sæt målinger og så videre. Antallet af individuelle målinger og varigheden af søvnens del af cyklussen kan alle styres gennem konfigurationsregistrene.

Den anden måde at betjene BME/P280 er Single Shot -tilstand (kaldet tvungen tilstand i databladet). I denne tilstand vågnes enheden fra søvn af en kommando til måling, den foretager et sæt målinger og går derefter i dvale igen. Antallet af individuelle målinger i sættet styres i konfigurationskommandoen, der vækker enheden.

Hvis der foretages en enkelt måling i BMP280, udfyldes de 16 mest signifikante bits i værdien, og de fire mindst signifikante bits i værdiaflæsningen er alle nuller. Antallet af målinger kan indstilles til 1, 2, 4, 8 eller 16, og når antallet af målinger øges, øges antallet af bits, der er udfyldt med data, så med 16 målinger fyldes alle 20 bit med måledata. Dataarket omtaler denne proces som oversampling.

I BME280 gælder det samme arrangement, så længe resultatet ikke filtreres. Hvis der bruges filtrering, er værdierne altid 20 bit, uanset hvor mange målinger der foretages i hver målecyklus.

Hver individuel måling tager cirka 2 millisekunder (typisk værdi; maksimal værdi er 2,3 ms). Tilføj hertil betyder en fast overhead på ca. 2 ms (normalt lidt mindre), at en målesekvens, der kan bestå af fra 1 til 32 individuelle målinger, kan tage fra 4 ms op til 66 ms.

Databladet indeholder et sæt anbefalede kombinationer af temperatur- og trykoversampling til forskellige applikationer.

Konfigurationskontrolregistre

De to konfigurationskontrolregistre i BMP280 er på registeradresserne 0xF4 og 0xF5 og tilknyttes 6 individuelle konfigurationskontrolværdier. 0xF4 består af:

  • 3 bit osrs_t (mål temperatur 0, 1, 2, 4, 8 eller 16 gange);
  • 3 bit osrs_p (mål tryk 0, 1, 2, 4, 8 eller 16 gange); og
  • 2 bit Mode (Sleep, Forced (dvs. Single Shot), Normal (dvs. kontinuerlig).

0xF5 består af:

  • 3 bits t_sb (standbytid, 0,5 ms til 4000 ms);
  • 3 bits filter (se nedenfor); og
  • 1 bit spiw_en som vælger SPI eller I2C.

Filterparameteren styrer en type eksponentiel henfaldsalgoritme eller filteret Infinite Impulse Response (IIR), der anvendes på råtryks- og temperaturmåleværdierne (men ikke på fugtighedsværdierne). Ligningen er angivet i databladet. En anden præsentation er:

Værdi (n) = Værdi (n-1) * (K-1) / K + måling (n) / K

hvor (n) angiver den seneste måle- og outputværdi; og K er filterparameteren. Filterparameteren K og kan indstilles til 1, 2, 4, 8 eller 16. Hvis K er indstillet til 1, bliver ligningen bare Værdi (n) = måling (n). Kodningen af filterparameteren er:

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

BME 280 tilføjer et yderligere konfigurationskontrolregister på adressen 0xF2, "ctrl_hum" med en enkelt 3-bit parameter osrs_h (mål luftfugtighed 0, 1, 2, 4, 8 eller 16 gange).

Trin 4: Måling og aflæsningstidspunkt

Jeg planlægger at tilføje dette senere og vise timingen af kommandoer og målesvar.

Iddt - strøm ved temperaturmåling. Typisk værdi 325 uA

Iddp - strøm ved trykmåling. Typisk værdi 720 uA, maks. 1120 uA

Iddsb - aktuel i standbytilstand. Typisk værdi 0,2 uA, maks. 0,5 uA

Iddsl - aktuel i dvaletilstand. Typisk værdi 0,1 uA, maks. 0,3 uA

Trin 5: Retningslinjer for software

Retningslinjer for software
Retningslinjer for software
Retningslinjer for software
Retningslinjer for software

I2C Burst -tilstand

BMP280 -databladet giver vejledning om datalæsning (afsnit 3.9). Der står "det anbefales kraftigt at bruge en burst-læsning og ikke adressere hvert register individuelt. Dette forhindrer en mulig sammenblanding af bytes, der tilhører forskellige målinger og reducerer grænsefladetrafik." Der gives ingen vejledning vedrørende læsning af kompensations-/kalibreringsparametrene. Formentlig er disse ikke et problem, fordi de er statiske og ikke ændres.

Dette bibliotek læser alle sammenhængende værdier i en enkelt læseoperation - 24 bytes i tilfælde af parametre for temperatur og trykkompensation, 6 bytes for kombineret temperatur og tryk og 8 bytes for fugtighed, temperatur og tryk kombineret. Når temperaturen alene kontrolleres, læses kun 3 bytes.

Brug af makroer (#define osv.)

Der er ingen andre makroer i dette bibliotek end den sædvanlige bibliotek "include guard" -makro, som forhindrer dobbeltarbejde.

Alle konstanter defineres ved hjælp af const -søgeordet, og fejlfindingsudskrivning styres med standard C -funktioner.

Det har været kilden til en vis usikkerhed for mig, men det råd, jeg får fra at læse mange indlæg om dette emne, er, at brug af #define til deklaration af konstanter (i det mindste) og (sandsynligvis) fejlretningstrykningskontrol er unødvendig og uønsket.

Sagen om brug af const frem for #define er ret klar - const bruger de samme ressourcer som #define (dvs. nul), og de resulterende værdier følger anvendelsesområdet for reglerne og reducerer derved risikoen for fejl.

Sagen om fejlfindingsudskrivningskontrol er lidt mindre klar, fordi den måde, jeg har gjort det på, betyder, at den sidste kode indeholder logikken for fejlfindingsudskrivningssætningerne, selvom de aldrig bliver udøvet. Hvis biblioteket skal bruges i et stort projekt på en mikrokontroller med meget begrænset hukommelse, kan dette blive et problem. Da min udvikling var på en ESP8266 med en stor flash -hukommelse, syntes dette ikke at være et problem for mig.

Trin 6: Temperaturydelse

Jeg planlægger at tilføje dette senere.

Trin 7: Trykydelse

Jeg planlægger at tilføje dette senere.

Anbefalede: