Taula de continguts:

Biblioteca per a BMP280 i BME280: 7 passos
Biblioteca per a BMP280 i BME280: 7 passos

Vídeo: Biblioteca per a BMP280 i BME280: 7 passos

Vídeo: Biblioteca per a BMP280 i BME280: 7 passos
Vídeo: AHT20+BMP280 Модуль для метеостанции 2024, Juliol
Anonim
Biblioteca per a BMP280 i BME280
Biblioteca per a BMP280 i BME280
Biblioteca per a BMP280 i BME280
Biblioteca per a BMP280 i BME280
Biblioteca per a BMP280 i BME280
Biblioteca per a BMP280 i BME280

Introducció

No em vaig proposar escriure aquesta biblioteca. Va "passar" com a efecte secundari d'un projecte que vaig començar que utilitza un BMP280. Aquest projecte encara no està acabat, però crec que la biblioteca està a punt per compartir-la amb els altres. Posteriorment, vaig tenir la necessitat d'utilitzar un BME280, que afegeix mesurament d'humitat a la capacitat de pressió i temperatura del BMP280. El BME280 és "compatible amb la versió anterior" amb el BMP280, és a dir, tots els registres i els passos necessaris per llegir la pressió i la temperatura del BME280 són els mateixos que els que s'utilitzen per al BMP280. Hi ha registres i passos addicionals necessaris per llegir la humitat, aplicables només al BME280. Això planteja la qüestió, una biblioteca per a totes dues o dues biblioteques separades. El maquinari per als dos tipus de dispositius és totalment intercanviable. Fins i tot molts dels mòduls que es venen (per exemple a Ebay i AliExpress) tenen l’etiqueta BME / P280. Per esbrinar de quin tipus es tracta, heu de mirar l'escriptura (minúscula) del propi sensor o provar el byte d'identificació del dispositiu. Vaig decidir anar a buscar una sola biblioteca. Sembla que ha funcionat bé.

S’agrairan els comentaris, especialment els suggeriments de millora.

Funcions i funcions de la biblioteca

Una biblioteca és un programari que proporciona una interfície de programació d'aplicacions (API) perquè un programador pugui exercir les capacitats del dispositiu, sense necessàriament haver de tractar tots els detalls de gra fi. Desitjablement, l'API hauria de ser fàcil per a principiants amb requisits senzills, tot proporcionant una explotació completa de les capacitats del dispositiu. Desitjablement, la biblioteca hauria de seguir qualsevol pauta específica del fabricant del dispositiu, així com les bones pràctiques generals de programari. M'he esforçat per aconseguir tot això. Quan vaig començar amb el BMP280, hi vaig trobar 3 biblioteques diferents: Adafruit_BMP280; Seeed_BMP280; i un anomenat BMP280 del fabricant del dispositiu. Ni Adafruit ni Seeed van proporcionar funcions ampliades, tot i que funcionaven bé i eren fàcils d’utilitzar per a aplicacions bàsiques. No he pogut imaginar la nostra manera d’utilitzar la produïda pel fabricant del dispositiu (Bosch Sensortec). Aquesta pot ser la meva deficiència, en lloc de la seva. Tot i que la biblioteca era molt més complicada que les altres dues, no vaig poder trobar cap instrucció ni cap exemple d'ús (posteriorment vaig trobar exemples al fitxer "bmp280_support.c", tot i que no em van resultar especialment útils).

Com a resultat d’aquests factors, vaig decidir escriure la meva pròpia biblioteca per al BMP280.

Veient la situació de la biblioteca per al BME280, he trobat biblioteques separades Adafruit_BME280, Seed_BME280 i una altra BME280_MOD-1022 escrita per Embedded Adventures. Cap d'ells va combinar les funcions de BMP280 en una biblioteca capaç d'utilitzar el BME280. Cap d’ells no admetia explícitament la capacitat dels dispositius d’emmagatzemar uns quants bits de dades mentre el dispositiu i el seu microprocessador de control dormen (aquesta capacitat és evident al full de dades i és compatible amb la biblioteca que he escrit i descrit aquí).

Una biblioteca combinada hauria de tenir suport per a totes les capacitats del BME280, però quan s’utilitzi amb un BMP280 no hauria d’imposar cap sobrecàrrega de les funcions no utilitzades. Els avantatges d’una biblioteca combinada inclouen menys fitxers de biblioteca per gestionar, combinació i combinació senzilla de diferents dispositius del mateix projecte i canvis simplificats per al manteniment o les actualitzacions que només s’han de fer en un lloc en lloc de dos. Probablement, tots són poc importants, fins i tot insignificants, però …

Capacitats del dispositiu

El BMP280 i el BME280 són dispositius de muntatge superficial d’uns 5 mm quadrats i 1 mm d’alçada. Hi ha 8 coixinets d’interfície, inclosos 2 coixinets d’entrada d’alimentació separats i dos coixinets de terra. Estan disponibles a eBay com a mòdul amb 4 o 6 pins. El mòdul de 4 pins té una adreça I2C fixa i no es pot configurar per utilitzar el protocol SPI.

El mòdul de 6 pins o el dispositiu bare es poden utilitzar amb protocols I2C o SPI. En mode I2C pot tenir dues adreces diferents, aconseguides connectant el pin SDO a terra (per a adreça base = 0x76) o a Vdd (per a adreça base +1 = 0x77). En mode SPI té la disposició habitual de 1 rellotge, 2 dades (una per a cada direcció) i un pin de selecció de dispositiu (CS).

La biblioteca que he escrit i descrit aquí només admet I2C. Les biblioteques Adafruit_BMP280 i BME_MOD-1022 tenen suport tant per a i2C com per a SPI.

La biblioteca es pot descarregar aquí:

github.com/farmerkeith/BMP280-library

Pas 1: Configuració del maquinari

Configuració del maquinari
Configuració del maquinari

Abans que la biblioteca pugui ser útil, cal connectar un microcontrolador al BMP280 (o a dos d’ells si ho desitgeu).

He utilitzat un WeMos D1 mini pro, així que mostraré les seves connexions. Altres microcontroladors seran similars, només cal que connecteu correctament els pins SDA i SCL.

En el cas del WeMos D1 mini pro, les connexions són:

Funció Pin de WeMos pin BMP280 Notes

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND Control d’adreces SDO Ground o Vdd I2C seleccioneu CSB Vdd (GND selecciona SPI)

Tingueu en compte que el pin SDO d'alguns dels mòduls MP280 té l'etiqueta SDD i que el pin Vdd pot ser VCC. Nota: les línies SDA i SCL han de tenir resistències de tracció entre la línia i el pin Vin. Normalment, un valor de 4,7 K hauria d’estar bé. Alguns mòduls BMP280 i BME280 tenen resistències de tracció de 10K incloses al mòdul (cosa que no és una bona pràctica, ja que posar diversos dispositius al bus I2C pot carregar-lo excessivament). No obstant això, l'ús de 2 mòduls BME / P280 cadascun amb una resistència de 10 K no hauria de ser un problema a la pràctica sempre que no hi hagi molts altres dispositius al mateix bus també amb resistències de tracció.

Un cop tingueu el maquinari connectat, podeu comprovar fàcilment si el vostre dispositiu és un BMP280 o un BME280 executant l’esbós I2CScan_ID que podeu trobar aquí:

També podeu comprovar si teniu un BMP280 o BME280 mirant el dispositiu en si. Vaig considerar necessari fer un microscopi digital per fer-ho, però si la vostra vista és molt bona, podreu fer-ho sense cap ajuda. Hi ha dues línies d’impressió a la carcassa del dispositiu. La clau és la primera lletra de la segona línia, que en el cas dels dispositius BMP280 és una "K" i en el cas dels dispositius BME280 és una "U".

Pas 2: API proporcionades per la biblioteca

API proporcionades per la biblioteca
API proporcionades per la biblioteca
API proporcionades per la biblioteca
API proporcionades per la biblioteca

Incloure la biblioteca en un esbós

La biblioteca s’inclou en un esbós de manera estàndard mitjançant l’enunciat

#include "farmerkeith_BMP280.h"

Aquesta afirmació s'ha d'incloure a la part inicial de l'esbós abans de l'inici de la funció setup ().

Creació d’un objecte de programari BME o BMP

Hi ha 3 nivells per crear l'objecte de programari BMP280. El més senzill és just

bme280 ObjectName; o bmp280 objectName;

per exemple, BMP280 bmp0;

Això crea un objecte de programari amb l'adreça per defecte de 0x76 (és a dir, per a SDO connectat a terra).

El següent nivell per crear un objecte de programari BME280 o BMP280 té un paràmetre 0 o 1, de la següent manera:

bme280 objectNameA (0);

bmp280 ObjectNameB (1);

El paràmetre (0 o 1) s'afegeix a l'adreça base I2C, de manera que es poden utilitzar dos dispositius BME280 o BMP280 al mateix bus I2C (inclòs un de cadascun).

El tercer nivell per crear un objecte de programari BME o BMP280 té dos paràmetres. El primer paràmetre, que és 0 o 1, és per a l'adreça, com per al cas anterior. El segon paràmetre controla la impressió de depuració. Si s'estableix a 1, cada transacció amb l'objecte de programari dóna lloc a sortides Serial.print que permeten al programador veure els detalls de la transacció. Per exemple:

bmp280 ObjectNameB (1, 1);

Si el paràmetre d'impressió de depuració s'estableix a 0, l'objecte de programari torna al comportament normal (sense impressió).

Aquesta declaració o sentències s'ha d'incloure després de la #include i abans de la funció setup ().

Inicialització de l'objecte de programari BME o BMP

Abans d’utilitzar-lo, cal llegir els paràmetres de calibratge del dispositiu i configurar-lo per al mode de mesura, el mostreig excessiu i la configuració del filtre.

Per a una inicialització senzilla i de propòsit general, la declaració és:

objectName.begin ();

Aquesta versió de begin () llegeix els paràmetres de calibratge del dispositiu i defineix osrs_t = 7 (16 mesures de temperatura), osrs_p = 7 (16 mesures de pressió), mode = 3 (continu, Normal), t_sb = 0 (0,5 ms de son entre conjunts de mesures), filter = 0 (K = 1, per tant, no hi ha filtratge) i spiw_en = 0 (SPI desactivat, per tant, utilitzeu I2C). En el cas del BME280, hi ha un paràmetre addicional osrs_h = 7 per a 16 mesures d'humitat.

Hi ha una altra versió de begin () que pren els sis (o 7) paràmetres. L'equivalent de l'afirmació anterior és

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

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

La llista completa de codis i els seus significats es troba al full de dades BME280 i BMP280, i també als comentaris del fitxer.cpp de la biblioteca.

Mesura senzilla de temperatura i pressió

Per obtenir una mesura de temperatura, la forma més senzilla és

temperatura doble = objectName.readTemperature (); // mesurar la temperatura

Per obtenir una mesura de pressió, la forma més senzilla és

doble pressió = objectName.readPressure (); // mesurar la pressió

Per obtenir una mesura d’humitat la forma més senzilla és

doble humitat = objectName.readHumidity (); // mesurar la humitat (només BME280)

Per obtenir temperatura i pressió, es poden utilitzar les dues frases anteriors una darrere l’altra, però hi ha una altra opció, que és:

doble temperatura;

doble pressió = objectName.readPressure (temperatura); // mesurar la pressió i la temperatura

Aquesta afirmació llegeix les dades del dispositiu BME280 o BMP280 només una vegada i retorna la temperatura i la pressió. Aquest és un ús lleugerament més eficient del bus I2C i assegura que les dues lectures corresponen al mateix cicle de mesura.

Per al BME 280, una afirmació combinada que obté els tres valors (humitat, temperatura i pressió) és:

doble temperatura, pressió; doble humitat = objectName.readHumidity (temperatura, pressió); // mesurar la humitat, la pressió i la temperatura

Aquesta declaració només llegeix les dades del dispositiu BMP280 i retorna els tres valors. Aquest és un ús lleugerament més eficient del bus I2C i assegura que les tres lectures corresponen al mateix cicle de mesura. Tingueu en compte que els noms de les variables es poden canviar per qualsevol cosa que agradi a l'usuari, però el seu ordre és fix: la temperatura és la primera i la pressió és la segona.

Aquests casos d'ús es cobreixen en exemples d'esbossos proporcionats amb la biblioteca, essent basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino i basicHumidityAndTemperatureAndPressure.ino.

Mesura de temperatura i pressió més sofisticada

Tot i que la sèrie d’afirmacions anteriors funcionarà sense problemes, hi ha un parell de problemes:

  1. el dispositiu funciona en continu i, per tant, consumeix energia al seu nivell màxim. Si l'energia prové d'una bateria, pot ser que sigui necessari reduir-la.
  2. a causa de la potència consumida, el dispositiu experimentarà escalfament i, per tant, la temperatura mesurada serà superior a la temperatura ambient. Vaig a tractar això més en un pas posterior.

Un resultat que utilitza menys potència i proporciona una temperatura més propera a l’ambient es pot obtenir utilitzant begin () amb paràmetres que el fan dormir (per exemple, mode = 0). Per exemple:

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

Després, quan es vulgui fer una mesura, activeu el dispositiu amb una ordre de configuració per registrar F2 (si cal) i F4 que estableix els valors adequats de osrs_h, osrs_t i osrs_p, mode més = 1 (mode de tret simple). Per exemple:

[objectName.updateF2Control (1);] // osrs_h: mai necessari per a BMP280, // i no és necessari per a BME280 si no es canvia el nombre de mesures // a partir del valor proporcionat a begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Després d’haver despertat el dispositiu, començarà a mesurar-se, però el resultat no estarà disponible durant uns milisegons (almenys 4 ms, potser fins a 70 ms o més, segons el nombre de mesures que s’hagin especificat). Si l’ordre de lectura s’envia immediatament, el dispositiu retornarà els valors de la mesura anterior, cosa que pot ser acceptable en algunes aplicacions, però en la majoria dels casos és probable que sigui millor retardar fins que la mesura nova estigui disponible.

Aquest retard es pot fer de diverses maneres.

  1. espereu un temps fixat per cobrir el retard esperat més llarg
  2. espereu una quantitat de temps calculada a partir del temps màxim de mesura per mesura (és a dir, 2,3 ms) el nombre de mesures, més despeses generals, més un marge.
  3. espereu un temps més curt calculat com a anterior, però utilitzant el temps de mesura nominal (és a dir, 2 ms) més la despesa general i, a continuació, comenceu a comprovar el bit "Estic mesurant" al registre d'estat. Quan el bit d'estat llegeix 0 (és a dir, no mesura), obteniu les lectures de temperatura i pressió.
  4. Comenceu immediatament a comprovar el registre d'estat i obteniu les lectures de temperatura i pressió quan el bit d'estat llegeix 0,

Més endavant mostraré un exemple d’una manera de fer-ho.

Operacions de registre de configuració

Per fer que tot això passi, necessitem diverses eines que encara no he introduït. Ells són:

byte readRegister (reg)

void updateRegister (reg, valor)

Cadascuna d’aquestes té diverses ordres derivades a la biblioteca, que fan que el programari per a accions específiques sigui una mica més senzill.

L'exemple powerSaverPressureAndTemperature.ino utilitza el mètode núm. 3. La línia de codi que fa la comprovació repetida és

mentre que (bmp0.readRegister (0xF3) >> 3); // loop untl F3bit 3 == 0

Tingueu en compte que aquest esbós és per a un microcontrolador ESP8266. He utilitzat un WeMos D1 mini pro. L'esbós no funcionarà amb microcontroladors Atmega, que tenen instruccions diferents per dormir. Aquest esbós exerceix diversos altres comandaments, de manera que els introduiré tots abans de descriure l'esbós amb més detall.

Quan el microcontrolador dorm en paral·lel amb el sensor BMP280, la configuració del sensor per a les mesures necessàries es pot fer a l’ordre begin (), mitjançant els 6 paràmetres. Tanmateix, si el microcontrolador no dorm, però el sensor sí, al moment de la mesura s’ha de despertar el sensor i comunicar-li la configuració de la mesura. Això es pot fer directament amb

updateRegister (reg, valor)

però és una mica més fàcil amb les tres ordres següents:

updateF2Control (osrs_h); // Només BME280

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

Un cop feta la mesura, si el mode utilitzat és Plànol simple (mode forçat), el dispositiu tornarà a dormir automàticament. Tanmateix, si el conjunt de mesures inclou diverses mesures mitjançant el mode continu (Normal), caldrà tornar a dormir el BMP280. Això es pot fer amb qualsevol de les dues ordres següents:

updateF4Control16xSleep ();

updateF4ControlSleep (valor);

Tots dos configuren els bits de mode a 00 (és a dir, mode de repòs). Tanmateix, el primer estableix osrs_t i osrs_p a 111 (és a dir, 16 mesures) mentre que el segon emmagatzema els 6 bits baixos del "valor" als bits 7: 2 del registre 0xF4.

De manera similar, la sentència següent emmagatzema els sis bits baixos de "valor" als bits 7: 2 del registre 0xF5.

updateF5ConfigSleep (valor);

L'ús d'aquestes darreres ordres permeten emmagatzemar 12 bits d'informació als registres F4 i F5 de BMP280. Almenys en el cas de l’ESP8266, quan el microcontrolador es desperta després d’un període de son, s’inicia al principi de l’esbós sense conèixer el seu estat abans de l’ordre de suspensió. Per emmagatzemar el coneixement del seu estat abans de l'ordre de suspensió, les dades es poden emmagatzemar a la memòria flash, mitjançant les funcions EEPROM o escrivint un fitxer mitjançant SPIFFS. No obstant això, la memòria flash té una limitació del nombre de cicles d'escriptura, de l'ordre de 10.000 a 100.000. límit en pocs mesos. Emmagatzemar uns quants bits de dades al BMP280 no té aquesta limitació.

Les dades emmagatzemades als registres F4 i F5 es poden recuperar quan el microcontrolador es desperta mitjançant les ordres

readF4Sleep ();

readF5Sleep ();

Aquestes funcions llegeixen el registre corresponent, canvien el contingut per eliminar els 2 LSB i retornen els 6 bits restants. Aquestes funcions s'utilitzen a l'exemple d'esbós powerSaverPressureAndTemperatureESP.ino de la següent manera:

// llegeix el valor de EventCounter de bmp0

byte bmp0F4value = bmp0.readF4Sleep (); // 0 a 63 bytes bmp0F5value = bmp0.readF5Sleep (); // 0 a 63 eventCounter = valor bmp0F5 * 64 + valor bmp0F4; // 0 a 4095

Aquestes funcions llegeixen el registre corresponent, canvien el contingut per eliminar els 2 LSB i retornen els 6 bits restants. Aquestes funcions s'utilitzen a l'exemple d'esbós powerSaverPressureAndTemperature.ino de la següent manera:

// llegeix el valor de EventCounter de bmp1

byte bmp1F4value = bmp1.readF4Sleep (); // 0 a 63 bytes bmp1F5value = bmp1.readF5Sleep (); // 0 a 63 eventCounter = valor bmp1F5 * 64 + valor bmp1F4; // 0 a 4095

Funcions de temperatura i pressió en brut

Les funcions bàsiques readTemperature, readPressure i readHumidity tenen dos components. En primer lloc, els valors de pressió i temperatura de 20 bits en brut s’obtenen a partir del BME / P280, o el valor d’humitat en brut de 16 bits s’obté a partir del BME280. A continuació, s’utilitza l’algorisme de compensació per generar els valors de sortida en graus Celsius, hPa o% RH.

La biblioteca proporciona funcions diferents per a aquests components, de manera que es poden obtenir les dades de temperatura, pressió i humitat en brut, i potser manipular-les d’alguna manera. També es proporciona l'algorisme per obtenir la temperatura, la pressió i la humitat d'aquests valors bruts. A la biblioteca, aquests algorismes s’implementen mitjançant aritmètica de coma flotant de doble longitud. Funciona bé a l'ESP8266, que és un processador de 32 bits i utilitza 64 bits per a variables flotants "dobles". Fer accessibles aquestes funcions pot ser útil per avaluar i possiblement canviar el càlcul d'altres plataformes.

Aquestes funcions són:

readRawPressure (RawTemperature); // llegeix les dades de pressió i temperatura en brut de BME / P280readRawHumidity (rawTemperature, rawPressure); // llegeix dades sobre humitat, temperatura i pressió en brut de BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (RawHumidity, t_fine)

L'argument "t-fine" d'aquestes funcions val una mica d'explicació. Tant els algorismes de compensació de pressió com d'humitat inclouen un component dependent de la temperatura que s'aconsegueix mitjançant la variable t_fine. La funció calcTemperature escriu un valor a t_fine basat en la lògica de l’algoritme de compensació de temperatura, que després s’utilitza com a entrada tant a calcPressure com a calcHumidity.

Un exemple de l’ús d’aquestes funcions es pot trobar a l’exemple sketch rawPressureAndTemperature.ino, i també al codi per a la funció readHumidity () al fitxer.cpp de la biblioteca.

Pressió d’altitud i nivell del mar

Es coneix una relació entre la pressió atmosfèrica i l’altitud. El temps també influeix en la pressió. Quan les organitzacions meteorològiques publiquen informació sobre la pressió atmosfèrica, normalment l’ajusten a l’altitud i, per tant, la "carta sinòptica" mostra isòbares (línies de pressió constant) estandarditzades al nivell del mar. De manera que realment hi ha 3 valors en aquesta relació, i conèixer-ne dos permet derivar el tercer. Els 3 valors són:

  • altitud sobre el nivell del mar
  • pressió real de l’aire a aquesta altitud
  • pressió d'aire equivalent al nivell del mar (més estrictament, nivell mitjà del mar, perquè el nivell instantani del mar canvia constantment)

Aquesta biblioteca proporciona dues funcions per a aquesta relació, de la següent manera:

calcAltitude (pressió, seaLevelhPa);

calcNormalisedPression (pressió, altitud);

També hi ha una versió simplificada, que assumeix la pressió estàndard del nivell del mar de 1013,15 hPa.

calcAltitud (pressió); // seaLevelPressure estàndard assumida

Pas 3: detalls del dispositiu BMP280

Detalls del dispositiu BMP280
Detalls del dispositiu BMP280

Capacitats de maquinari

El BMP280 té 2 bytes de dades de configuració (a les adreces de registre 0xF4 i 0xF5) que s’utilitzen per controlar múltiples opcions de mesurament i sortida de dades. També proporciona 2 bits d'informació d'estat i 24 bytes de paràmetres de calibratge que s'utilitzen per convertir els valors de temperatura i pressió bruts en unitats de temperatura i pressió convencionals. El BME280 té dades addicionals de la següent manera:

  • 1 byte addicional de dades de configuració a l'adreça de registre 0xF2 que s'utilitza per controlar diverses mesures d'humitat;
  • 8 bytes addicionals de paràmetres de calibratge utilitzats per convertir el valor d'humitat bruta en percentatge d'humitat relativa.

Els registres de temperatura, pressió i estat per al BME280 són els mateixos que per al BMP280 amb excepcions menors de la següent manera:

  • els bits "ID" del BME280 s'estableixen a 0x60, de manera que es pot distingir de BMP280 que pot ser 0x56, 0x57 o 0x58
  • es canvia el control del temps de son (t_sb) de manera que els dos temps llargs del BMP280 (2000 ms i 4000 ms) se substitueixen al BME280 per temps curts de 10 ms i 20 ms. El temps màxim de son al BME280 és de 1000 ms.
  • A la BME280, els valors bruts de temperatura i pressió sempre són de 20 bits si s’aplica un filtre. L'ús de valors de 16 a 19 bits es limita a casos sense filtratge (és a dir, filtre = 0).

La temperatura i la pressió són valors de 20 bits cadascun, que han de convertir-se en temperatura i pressió convencionals mitjançant un algorisme bastant complex mitjançant 3 paràmetres de calibratge de 16 bits per a la temperatura i 9 paràmetres de calibratge de 16 bits més la temperatura per a la pressió. La granulatitat de la mesura de temperatura és de 0,0003 graus centígrads per a un canvi de bits menys significatiu (lectura de 20 bits), augmentant a 0,0046 graus centígrads si s’utilitza la lectura de 16 bits.

La humitat és un valor de 16 bits que cal convertir en humitat relativa mitjançant un altre algorisme complex mitjançant 6 paràmetres de calibratge que són una barreja de 8, 12 i 16 bits.

El full de dades mostra la precisió absoluta de la lectura de temperatura com a + -0,5 C a 25 C i + -1 C en el rang de 0 a 65 C.

La granularitat de la mesura de pressió és de 0,15 Pascals (és a dir, 0,0015 hectoPascals) a una resolució de 20 bits o 2,5 Pascals a una resolució de 16 bits. El valor de la pressió bruta es veu afectat per la temperatura, de manera que al voltant de 25 ° C, un augment de la temperatura d’1 grau C disminueix la pressió mesurada en 24 pascals. La sensibilitat a la temperatura es explica a l'algoritme de calibratge, de manera que els valors de pressió lliurats han de ser precisos a diferents temperatures.

El full de dades mostra la precisió absoluta de la lectura de pressió com a + -1 hPa per a temperatures entre 0 C i 65 C.

La precisió de la humitat es dóna al full de dades com a + -3% d’HR i + -1% d’histèresi.

Com funciona

Els 24 bytes de dades de calibratge de temperatura i pressió, i també en el cas del BME280, els 8 bytes de dades de calibratge d’humitat, s’han de llegir des del dispositiu i emmagatzemar-los en variables. Aquestes dades es programen individualment al dispositiu de fàbrica, de manera que els diferents dispositius tenen valors diferents, almenys per a alguns dels paràmetres. Un BME / P280 pot estar en un dels dos estats. En un estat mesura. A l’altre estat està esperant (dormint).

En quin estat es troba es pot comprovar mirant el bit 3 del registre 0xF3.

Els resultats de la mesura més recent es poden obtenir en qualsevol moment llegint el valor de les dades corresponents, independentment de si el dispositiu està dormint o de mesura.

També hi ha dues maneres d’operar el BME / P280. Un és el mode continu (anomenat mode normal al full de dades) que repeteix repetidament els cicles entre els estats de mesura i de repòs. En aquest mode, el dispositiu realitza un conjunt de mesures, es posa a dormir, es desperta per obtenir un altre conjunt de mesures, etc. El nombre de mesures individuals i la durada de la part de son del cicle es poden controlar mitjançant els registres de configuració.

L'altra forma d'operar el BME / P280 és el mode de tret simple (anomenat mode forçat al full de dades). En aquest mode, el dispositiu es desperta del mode de repòs mitjançant una ordre per mesurar, fa un conjunt de mesures i torna a dormir. El nombre de mesures individuals del conjunt es controla a l’ordre de configuració que activa el dispositiu.

Al BMP280, si es fa una mesura única, es completen els 16 bits més significatius del valor i els quatre bits menys significatius de la lectura del valor són tots zeros. El nombre de mesures es pot establir a 1, 2, 4, 8 o 16 i, a mesura que s’incrementa el nombre de mesures, augmenta el nombre de bits poblats de dades, de manera que amb 16 mesures tots els 20 bits es poblen de dades de mesura. El full de dades fa referència a aquest procés com a mostreig excessiu.

A la BME280, s'aplica la mateixa disposició sempre que no es filtri el resultat. Si s’utilitza el filtratge, els valors són sempre de 20 bits, independentment de quantes mesures es prenguin en cada cicle de mesura.

Cada mesura individual triga uns 2 mil·lisegons (valor típic; el valor màxim és de 2,3 ms). Afegiu-hi una sobrecàrrega fixa d’uns 2 ms (normalment una mica menys) significa que una seqüència de mesurament, que pot consistir d’1 a 32 mesures individuals, pot durar de 4 ms a 66 ms.

El full de dades proporciona un conjunt de combinacions recomanades de sobre mostreig de temperatura i pressió per a diverses aplicacions.

Registres de control de configuració

Els dos registres de control de configuració del BMP280 es troben a les adreces de registre 0xF4 i 0xF5 i es mapen a 6 valors de control de configuració individuals. 0xF4 consisteix en:

  • 3 bits osrs_t (mesura la temperatura 0, 1, 2, 4, 8 o 16 vegades);
  • 3 bits osrs_p (mesura la pressió 0, 1, 2, 4, 8 o 16 vegades); i
  • Mode de 2 bits (repòs, forçat (és a dir, tret únic), normal (és a dir, continu).

0xF5 consisteix en:

  • 3 bits t_sb (temps d'espera, de 0,5 ms a 4000 ms);
  • Filtre de 3 bits (vegeu més avall); i
  • 1 bit spiw_en que selecciona SPI o I2C.

El paràmetre del filtre controla un tipus d'algorisme de desintegració exponencial, o filtre de resposta infinita d'impulsos (IIR), aplicat als valors de mesura de pressió i temperatura bruts (però no als valors d'humitat). L’equació es dóna al full de dades. Una altra presentació és:

Valor (n) = Valor (n-1) * (K-1) / K + mesura (n) / K

on (n) indica el valor de sortida i mesurament més recent; i K és el paràmetre del filtre. El paràmetre de filtre K i es pot establir a 1, 2, 4, 8 o 16. Si K s'estableix a 1, l'equació es converteix en Valor (n) = mesura (n). La codificació del paràmetre del filtre és:

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

El BME 280 afegeix un registre de control de configuració addicional a l'adreça 0xF2, "ctrl_hum" amb un únic paràmetre de 3 bits osrs_h (mesura la humitat 0, 1, 2, 4, 8 o 16 vegades).

Pas 4: mesura i temps de lectura

Penso afegir-ho més endavant, mostrant el moment de les ordres i les respostes de mesura.

Iddt - corrent a la mesura de la temperatura. Valor típic 325 uA

Iddp: corrent a la mesura de la pressió. Valor típic 720 uA, màxim 1120 uA

Iddsb: actual en mode d'espera. Valor típic: 0,2 uA, màxim 0,5 uA

Iddsl: actual en mode de repòs. Valor típic 0,1 uA, màxim 0,3 uA

Pas 5: directrius de programari

Directrius de programari
Directrius de programari
Directrius de programari
Directrius de programari

Mode de ràfega I2C

El full de dades BMP280 proporciona orientacions sobre la lectura de dades (secció 3.9). Es diu "es recomana utilitzar una lectura de ràfegues i no dirigir tots els registres de manera individual. Això evitarà una possible barreja de bytes pertanyents a diferents mesures i reduirà el trànsit de la interfície". No es dóna cap orientació sobre la lectura dels paràmetres de compensació / calibratge. Presumiblement no són un problema perquè són estàtics i no canvien.

Aquesta biblioteca llegeix tots els valors contigus en una sola operació de lectura: 24 bytes en el cas dels paràmetres de compensació de temperatura i pressió, 6 bytes per a temperatura i pressió combinades i 8 bytes per a humitat, temperatura i pressió combinades. Quan es comprova només la temperatura, només es llegeixen 3 bytes.

Ús de macros (#define etc.)

No hi ha cap macro en aquesta biblioteca que no sigui la macro habitual "include guard" de la biblioteca que impedeix la duplicació.

Totes les constants es defineixen mitjançant la paraula clau const i la impressió de depuració es controla amb funcions C estàndard.

Ha estat la font d’alguna incertesa per a mi, però el consell que rebo de llegir moltes publicacions sobre aquest tema és que l’ús de #define per a la declaració de constants (com a mínim) i (probablement) el control d’impressió de depuració és innecessari i indesitjable.

El cas de l’ús de const en lloc de #define és bastant clar: const utilitza els mateixos recursos que #define (és a dir, nul) i els valors resultants segueixen les regles d’abast, reduint així la possibilitat d’errors.

El cas del control d’impressió de depuració és una mica menys clar, perquè la manera com ho he fet significa que el codi final conté la lògica de les declaracions d’impressió de depuració, tot i que mai no s’exerceixen. Si la biblioteca s'ha d'utilitzar en un gran projecte en un microcontrolador amb una memòria molt limitada, això pot esdevenir un problema. Atès que el meu desenvolupament estava basat en un ESP8266 amb una gran memòria flash, no em va semblar un problema.

Pas 6: rendiment de la temperatura

Penso afegir-ho més endavant.

Pas 7: rendiment de la pressió

Penso afegir-ho més endavant.

Recomanat: