Tabla de contenido:

Biblioteca para BMP280 y BME280: 7 pasos
Biblioteca para BMP280 y BME280: 7 pasos

Video: Biblioteca para BMP280 y BME280: 7 pasos

Video: Biblioteca para BMP280 y BME280: 7 pasos
Video: Arduino desde cero en Español - Capítulo 36 - BMP280 Presión atmosférica, 🌡️Temperatura, Altitud 2024, Mes de julio
Anonim
Biblioteca para BMP280 y BME280
Biblioteca para BMP280 y BME280
Biblioteca para BMP280 y BME280
Biblioteca para BMP280 y BME280
Biblioteca para BMP280 y BME280
Biblioteca para BMP280 y BME280

Introducción

No me propuse escribir esta biblioteca. "Ocurrió" como un efecto secundario de un proyecto que comencé que usa un BMP280. Ese proyecto aún no está terminado, pero creo que la biblioteca está lista para compartir con otros. Posteriormente tuve la necesidad de usar un BME280, que agrega medición de humedad a la capacidad de presión y temperatura del BMP280. El BME280 es "compatible con versiones anteriores" con el BMP280, es decir, todos los registros y los pasos necesarios para leer la presión y la temperatura del BME280 son los mismos que los utilizados para el BMP280. Hay registros y pasos adicionales necesarios para leer la humedad, aplicables únicamente al BME280. Esto plantea la pregunta, una biblioteca para ambos o dos bibliotecas separadas. El hardware para los dos tipos de dispositivos es completamente intercambiable. Incluso muchos de los módulos que se venden (por ejemplo, en Ebay y AliExpress) están etiquetados como BME / P280. Para saber de qué tipo es, debe mirar la escritura (minúscula) en el sensor o probar el byte de ID del dispositivo. Decidí ir por una sola biblioteca. Parece haber funcionado bien.

Se agradecerá la retroalimentación, especialmente cualquier sugerencia de mejora.

Funciones y capacidades de la biblioteca

Una biblioteca es una pieza de software que proporciona una interfaz de programación de aplicaciones (API) para que un programador ejercite las capacidades del dispositivo, sin tener que lidiar necesariamente con todos los detalles. Deseablemente, la API debería ser fácil para un principiante con requisitos simples para comenzar, al mismo tiempo que proporciona una explotación completa de las capacidades del dispositivo. Es deseable que la biblioteca siga las pautas específicas del fabricante del dispositivo, así como las buenas prácticas generales de software. Me he esforzado por lograr todo esto. Al comenzar con el BMP280, encontré 3 bibliotecas diferentes para él: Adafruit_BMP280; Seeed_BMP280; y uno llamado BMP280 del fabricante del dispositivo. Ni Adafruit ni Seeed proporcionaron capacidades extendidas, aunque funcionaron bien y fueron fáciles de usar para aplicaciones básicas. No pude entender cómo usar el producido por el fabricante del dispositivo (Bosch Sensortec). Ésta puede ser mi deficiencia, más que la de ellos. Sin embargo, la biblioteca era mucho más complicada que las otras dos, no pude encontrar instrucciones o ejemplos de uso (posteriormente encontré ejemplos en el archivo "bmp280_support.c", sin embargo, estos no fueron particularmente útiles para mí).

Como resultado de estos factores, decidí escribir mi propia biblioteca para el BMP280.

Al analizar la situación de la biblioteca del BME280, encontré bibliotecas separadas Adafruit_BME280, Seed_BME280 y otra BME280_MOD-1022 escrita por Embedded Adventures. Ninguno de ellos combinó las funciones de BMP280 en una biblioteca capaz de utilizar el BME280. Ninguno de ellos admitió explícitamente la capacidad de los dispositivos para almacenar algunos bits de datos mientras el dispositivo y su microprocesador de control están inactivos (esta capacidad es evidente en la hoja de datos y se admite en la biblioteca que he escrito y descrito aquí).

Una biblioteca combinada debe admitir todas las capacidades del BME280, pero cuando se usa con un BMP280 no debe imponer ninguna sobrecarga de las funciones no utilizadas. Los beneficios de una biblioteca combinada incluyen menos archivos de biblioteca para administrar, fácil combinación de diferentes dispositivos en el mismo proyecto y cambios simplificados para el mantenimiento o actualizaciones que solo deben realizarse en un lugar en lugar de dos. Probablemente todos sean bastante menores, incluso insignificantes, pero …

Capacidades del dispositivo

El BMP280 y el BME280 son dispositivos de montaje en superficie de unos 5 mm cuadrados y 1 mm de alto. Hay 8 almohadillas de interfaz, incluidas 2 almohadillas de entrada de energía separadas y dos almohadillas de tierra. Están disponibles en eBay como un módulo con 4 o 6 pines sacados. El módulo de 4 pines tiene una dirección I2C fija y no se puede configurar para usar el protocolo SPI.

El módulo de 6 pines o el dispositivo desnudo se pueden utilizar con los protocolos I2C o SPI. En el modo I2C, puede tener dos direcciones diferentes, que se logran conectando el pin SDO a Tierra (para la dirección base = 0x76) o a Vdd (para la dirección base +1 = 0x77). En el modo SPI tiene la disposición habitual de 1 reloj, 2 datos (uno para cada dirección) y un pin de selección de dispositivo (CS).

La biblioteca que escribí y describí aquí solo es compatible con I2C. Las bibliotecas Adafruit_BMP280 y BME_MOD-1022 son compatibles con i2C y SPI.

La biblioteca se puede descargar aquí:

github.com/farmerkeith/BMP280-library

Paso 1: configuración del hardware

Configuración del hardware
Configuración del hardware

Antes de que la biblioteca pueda resultar útil, es necesario conectar un microcontrolador al BMP280 (oa dos de ellos si lo desea).

Usé un WeMos D1 mini pro, así que mostraré sus conexiones. Otros microcontroladores serán similares, solo necesita conectar correctamente los pines SDA y SCL.

En el caso del WeMos D1 mini pro, las conexiones son:

Función WeMos pin BMP280 pin Notas

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Tierra GND Control de dirección SDO Tierra o Vdd I2C seleccionar CSB Vdd (GND selecciona SPI)

Tenga en cuenta que el pin SDO en algunos de los módulos MP280 está etiquetado como SDD, y el pin Vdd puede estar etiquetado como VCC. Nota: Las líneas SDA y SCL deben tener resistencias pull-up entre la línea y el pin Vin. Normalmente, un valor de 4,7K debería estar bien. Algunos módulos BMP280 y BME280 tienen resistencias pull-up de 10K incluidas en el módulo (lo cual no es una buena práctica, ya que colocar varios dispositivos en el bus I2C puede cargarlo excesivamente). Sin embargo, el uso de 2 módulos BME / P280 cada uno con una resistencia de 10K no debería ser un problema en la práctica siempre que no haya demasiados dispositivos en el mismo bus también con resistencias pull-up.

Una vez que tenga el hardware conectado, puede verificar fácilmente si su dispositivo es un BMP280 o un BME280 ejecutando el boceto I2CScan_ID que puede encontrar aquí:

También puede comprobar si tiene un BMP280 o BME280 mirando el dispositivo en sí. Encontré que era necesario usar un microscopio digital para hacer esto, pero si su vista es muy buena, es posible que pueda hacerlo sin ninguna ayuda. Hay dos líneas de impresión en la carcasa del dispositivo. La clave es la primera letra de la segunda línea, que en el caso de los dispositivos BMP280 es una "K" y en el caso de los dispositivos BME280 es una "U".

Paso 2: API proporcionadas por la biblioteca

API proporcionadas por la biblioteca
API proporcionadas por la biblioteca
API proporcionadas por la biblioteca
API proporcionadas por la biblioteca

Incluir la biblioteca en un boceto

La biblioteca se incluye en un boceto de la forma estándar utilizando la declaración

#include "farmerkeith_BMP280.h"

Esta declaración debe incluirse en la primera parte del boceto antes del inicio de la función setup ().

Creación de un objeto de software BME o BMP

Hay 3 niveles para crear el objeto de software BMP280. El mas simple es solo

bme280 objectName; o bmp280 objectName;

por ejemplo, BMP280 bmp0;

Esto crea un objeto de software con la dirección predeterminada de 0x76 (es decir, para SDO conectado a tierra).

El siguiente nivel para crear un objeto de software BME280 o BMP280 tiene un parámetro de 0 o 1, como se indica a continuación:

bme280 objectNameA (0);

bmp280 objectNameB (1);

El parámetro (0 o 1) se agrega a la dirección base I2C, de modo que se pueden usar dos dispositivos BME280 o BMP280 en el mismo bus I2C (incluido uno de cada uno).

El tercer nivel para crear un objeto de software BME o BMP280 tiene dos parámetros. El primer parámetro, que es 0 o 1, es para la dirección, como en el caso anterior. El segundo parámetro controla la impresión de depuración. Si se establece en 1, cada transacción con el objeto de software genera salidas Serial.print que permiten al programador ver los detalles de la transacción. Por ejemplo:

bmp280 objectNameB (1, 1);

Si el parámetro de depuración de impresión se establece en 0, el objeto de software vuelve a su comportamiento normal (sin impresión).

Esta declaración o declaraciones deben incluirse después de #include y antes de la función setup ().

Inicialización del objeto de software BME o BMP

Antes de ser utilizado, es necesario leer los parámetros de calibración del dispositivo y configurarlo para cualquier modo de medición, sobremuestreo y ajustes de filtro apropiados.

Para una inicialización simple y de propósito general, la declaración es:

objectName.begin ();

Esta versión de begin () lee los parámetros de calibración del dispositivo y establece osrs_t = 7 (16 mediciones de temperatura), osrs_p = 7 (16 mediciones de presión), mode = 3 (continuo, Normal), t_sb = 0 (0.5 ms en reposo entre conjuntos de medidas), filter = 0 (K = 1, por lo que no hay filtrado) y spiw_en = 0 (SPI deshabilitado, por lo tanto, use I2C). En el caso del BME280, hay un parámetro adicional osrs_h = 7 para 16 mediciones de humedad.

Hay otra versión de begin () que toma los seis (o 7) parámetros. El equivalente de la declaración anterior es

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

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

La lista completa de códigos y sus significados se encuentra en la hoja de datos BME280 y BMP280, y también en los comentarios en el archivo.cpp de la biblioteca.

Medición sencilla de temperatura y presión

Para obtener una medición de temperatura, la forma más sencilla es

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

Para obtener una medición de presión, la forma más sencilla es

presión doble = objectName.readPressure (); // medir la presión

Para obtener una medición de la humedad, la forma más sencilla es

doble humedad = objectName.readHumidity (); // medir la humedad (solo BME280)

Para obtener tanto la temperatura como la presión, las dos declaraciones anteriores se pueden usar una tras otra, pero hay otra opción, que es:

doble temperatura;

presión doble = objectName.readPressure (temperatura); // medir presión y temperatura

Esta declaración lee los datos del dispositivo BME280 o BMP280 solo una vez y devuelve tanto la temperatura como la presión. Este es un uso ligeramente más eficiente del bus I2C y asegura que las dos lecturas correspondan al mismo ciclo de medición.

Para el BME 280, una declaración combinada que obtiene los tres valores (humedad, temperatura y presión) es:

doble temperatura, presión; doble humedad = objectName.readHumidity (temperatura, presión); // medir humedad, presión y temperatura

Esta declaración lee los datos del dispositivo BMP280 solo una vez y devuelve los tres valores. Este es un uso ligeramente más eficiente del bus I2C y asegura que las tres lecturas correspondan al mismo ciclo de medición. Tenga en cuenta que los nombres de las variables se pueden cambiar a cualquier cosa que le guste al usuario, pero su orden es fijo: la temperatura es lo primero y la presión, lo segundo.

Estos casos de uso se cubren en bocetos de ejemplo proporcionados con la biblioteca, que son basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino y basicHumidityAndTemperatureAndPressure.ino.

Medición de temperatura y presión más sofisticada

Aunque la serie de declaraciones anterior funcionará sin problemas, hay un par de problemas:

  1. el dispositivo funciona continuamente y, por lo tanto, consume energía a su nivel máximo. Si la energía proviene de una batería, puede ser necesario reducirla.
  2. Debido a la energía consumida, el dispositivo experimentará un calentamiento y, por lo tanto, la temperatura medida será más alta que la temperatura ambiente. Cubriré esto más en un paso posterior.

Un resultado que usa menos energía y da una temperatura más cercana a la ambiente, se puede obtener usando begin () con parámetros que lo ponen a dormir (por ejemplo, mode = 0). Por ejemplo:

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

Luego, cuando se desee una medición, active el dispositivo con un comando de configuración para los registros F2 (si es necesario) y F4 que establece los valores apropiados de osrs_h, osrs_t y osrs_p, más mode = 1 (modo de disparo único). Por ejemplo:

[objectName.updateF2Control (1);] // osrs_h - nunca se necesita para BMP280, // y no es necesario para BME280 si el número de medidas no se cambia // del valor proporcionado en begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, modo

Habiendo despertado el dispositivo, comenzará a medir, pero el resultado no estará disponible durante algunos milisegundos, al menos 4 ms, tal vez hasta 70 ms o más, dependiendo de la cantidad de mediciones que se hayan especificado. Si el comando de lectura se envía inmediatamente, el dispositivo devolverá los valores de la medición anterior, lo que puede ser aceptable en algunas aplicaciones, pero en la mayoría de los casos probablemente sea mejor retrasar hasta que la nueva medición esté disponible.

Este retraso se puede realizar de varias formas.

  1. espere una cantidad fija de tiempo para cubrir el retraso esperado más largo
  2. espere una cantidad de tiempo calculada a partir del tiempo máximo de medición por medición (es decir, 2,3 ms) multiplicado por el número de mediciones, más los gastos generales, más un margen.
  3. espere una cantidad de tiempo más corta calculada como arriba, pero usando el tiempo de medición nominal (es decir, 2 ms) más la sobrecarga, y luego comience a verificar el bit "Estoy midiendo" en el registro de estado. Cuando el bit de estado lee 0 (es decir, sin medir), obtenga las lecturas de temperatura y presión.
  4. Comience a verificar inmediatamente el registro de estado y obtenga las lecturas de temperatura y presión cuando el bit de estado lea 0,

Mostraré un ejemplo de una forma de hacer esto un poco más adelante.

Operaciones de registro de configuración

Para que todo esto suceda, necesitamos varias herramientas que aún no he introducido. Son:

byte readRegister (reg)

void updateRegister (registro, valor)

Cada uno de estos tiene varios comandos derivados en la biblioteca, lo que simplifica un poco el software para acciones específicas.

El ejemplo powerSaverPressureAndTemperature.ino usa el método No. 3. La línea de código que realiza la verificación repetida es

while (bmp0.readRegister (0xF3) >> 3); // bucle hasta F3bit 3 == 0

Tenga en cuenta que este boceto es para un microcontrolador ESP8266. Usé un WeMos D1 mini pro. El boceto no funcionará con microcontroladores Atmega, que tienen diferentes instrucciones para dormir. Este boceto ejercita varios otros comandos, así que los presentaré todos antes de describir ese boceto con más detalle.

Cuando el microcontrolador está durmiendo en paralelo con el sensor BMP280, la configuración del sensor para las medidas requeridas se puede realizar en el comando begin (), usando los 6 parámetros. Sin embargo, si el microcontrolador no está durmiendo, pero el sensor sí, entonces, en el momento de la medición, el sensor debe activarse y comunicarse con su configuración de medición. Esto se puede hacer directamente con

updateRegister (registro, valor)

pero es un poco más fácil con los siguientes tres comandos:

updateF2Control (osrs_h); // Solo BME280

updateF4Control (osrs_t, osrs_p, modo); updateF5Config (t_sb, filtro, spi3W_en);

Una vez realizada la medición, si el modo utilizado es Disparo único (modo Forzado), el dispositivo volverá automáticamente a dormir. Sin embargo, si el conjunto de medidas implica varias medidas utilizando el modo continuo (Normal), entonces el BMP280 deberá volver a ponerse en reposo. Esto se puede hacer con cualquiera de los dos comandos siguientes:

updateF4Control16xSleep ();

updateF4ControlSleep (valor);

Ambos establecen los bits de modo en 00 (es decir, modo de reposo). Sin embargo, el primero establece osrs_t y osrs_p en 111 (es decir, 16 mediciones) mientras que el segundo almacena los 6 bits bajos de "valor" en los bits 7: 2 del registro 0xF4.

De manera similar, la siguiente declaración almacena los seis bits más bajos de "valor" en los bits 7: 2 del registro 0xF5.

updateF5ConfigSleep (valor);

El uso de estos últimos comandos permite el almacenamiento de 12 bits de información en los registros BMP280 F4 y F5. Al menos en el caso del ESP8266, cuando el microcontrolador se despierta después de un período de suspensión, comienza al comienzo del boceto sin conocimiento de su estado antes del comando de suspensión. Para almacenar el conocimiento de su estado antes del comando de suspensión, los datos se pueden almacenar en la memoria flash, usando las funciones EEPROM o escribiendo un archivo usando SPIFFS. Sin embargo, la memoria flash tiene una limitación en el número de ciclos de escritura, del orden de 10, 000 a 100, 000. Esto significa que si el microcontrolador está pasando por un ciclo de reposo-activación cada pocos segundos, puede exceder la escritura de memoria permitida. límite en unos meses. El almacenamiento de algunos bits de datos en el BMP280 no tiene tal limitación.

Los datos almacenados en los registros F4 y F5 se pueden recuperar cuando el microcontrolador se despierta usando los comandos

readF4Sleep ();

readF5Sleep ();

Estas funciones leen el registro correspondiente, cambian el contenido para eliminar los 2 LSB y devuelven los 6 bits restantes. Estas funciones se utilizan en el boceto de ejemplo powerSaverPressureAndTemperatureESP.ino de la siguiente manera:

// leer el valor de EventCounter desde bmp0

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

Estas funciones leen el registro correspondiente, cambian el contenido para eliminar los 2 LSB y devuelven los 6 bits restantes. Estas funciones se utilizan en el boceto de ejemplo powerSaverPressureAndTemperature.ino de la siguiente manera:

// leer el valor de EventCounter desde bmp1

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

Funciones de temperatura y presión brutas

Las funciones básicas readTemperature, readPressure y readHumidity tienen dos componentes. Primero, los valores de temperatura y presión sin procesar de 20 bits se obtienen del BME / P280, o el valor de humedad sin procesar de 16 bits se obtiene del BME280. Luego, el algoritmo de compensación se utiliza para generar los valores de salida en grados Celsius, hPa o% RH.

La biblioteca proporciona funciones separadas para estos componentes, de modo que se puedan obtener los datos brutos de temperatura, presión y humedad, y quizás manipularlos de alguna manera. También se proporciona el algoritmo para derivar la temperatura, la presión y la humedad a partir de estos valores brutos. En la biblioteca, estos algoritmos se implementan utilizando aritmética de punto flotante de doble longitud. Funciona bien en el ESP8266, que es un procesador de 32 bits y utiliza 64 bits para variables flotantes "dobles". Hacer que estas funciones sean accesibles puede ser útil para evaluar y posiblemente cambiar el cálculo para otras plataformas.

Estas funciones son:

readRawPressure (rawTemperature); // lee datos brutos de presión y temperatura de BME / P280readRawHumidity (rawTemperature, rawPressure); // lee datos brutos de humedad, temperatura y presión de BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

El argumento "t-fine" de estas funciones merece una pequeña explicación. Los algoritmos de compensación de presión y humedad incluyen un componente dependiente de la temperatura que se logra mediante la variable t_fine. La función calcTemperature escribe un valor en t_fine basado en la lógica del algoritmo de compensación de temperatura, que luego se usa como entrada tanto en calcPressure como en calcHumidity.

Un ejemplo del uso de estas funciones se puede encontrar en el boceto de ejemplo rawPressureAndTemperature.ino, y también en el código para la función readHumidity () en el archivo.cpp de la biblioteca.

Presión de altitud y nivel del mar

Existe una relación conocida entre la presión atmosférica y la altitud. El clima también influye en la presión. Cuando las organizaciones meteorológicas publican información sobre la presión atmosférica, por lo general la ajustan a la altitud y, por lo tanto, el "cuadro sinóptico" muestra isobaras (líneas de presión constante) estandarizadas al nivel medio del mar. Entonces, realmente hay 3 valores en esta relación, y conocer dos de ellos permite derivar el tercero. Los 3 valores son:

  • altitud sobre el nivel del mar
  • presión de aire real a esa altitud
  • presión de aire equivalente al nivel del mar (más estrictamente, nivel medio del mar, porque el nivel del mar instantáneo cambia constantemente)

Esta biblioteca proporciona dos funciones para esta relación, como sigue:

calcAltitude (presión, seaLevelhPa);

calcNormalisedPressure (presión, altitud);

También hay una versión simplificada, que asume la presión estándar al nivel del mar de 1013,15 hPa.

calcAltitude (presión); // estándar seaLevelPressure asumido

Paso 3: Detalles del dispositivo BMP280

Detalles del dispositivo BMP280
Detalles del dispositivo BMP280

Capacidades de hardware

El BMP280 tiene 2 bytes de datos de configuración (en las direcciones de registro 0xF4 y 0xF5) que se utilizan para controlar múltiples opciones de medición y salida de datos. También proporciona 2 bits de información de estado y 24 bytes de parámetros de calibración que se utilizan para convertir los valores brutos de temperatura y presión en unidades convencionales de temperatura y presión. El BME280 tiene datos adicionales de la siguiente manera:

  • 1 byte adicional de datos de configuración en la dirección de registro 0xF2 utilizado para controlar múltiples mediciones de humedad;
  • 8 bytes adicionales de parámetros de calibración utilizados para convertir el valor de humedad bruta en porcentaje de humedad relativa.

Los registros de temperatura, presión y estado del BME280 son los mismos que los del BMP280, con las siguientes excepciones menores:

  • los bits "ID" del BME280 se establecen en 0x60, por lo que se puede distinguir de BMP280, que puede ser 0x56, 0x57 o 0x58
  • el control del tiempo de reposo (t_sb) se cambia de modo que los dos tiempos largos en el BMP280 (2000 ms y 4000 ms) se reemplazan en el BME280 con tiempos cortos de 10 ms y 20 ms. El tiempo máximo de reposo en el BME280 es de 1000 ms.
  • En el BME280, los valores brutos de temperatura y presión son siempre de 20 bits si se aplica filtrado. El uso de valores de 16 a 19 bits está limitado a casos sin filtrado (es decir, filtro = 0).

La temperatura y la presión son valores de 20 bits cada uno, que deben convertirse en temperatura y presión convencionales mediante un algoritmo bastante complejo que utiliza 3 parámetros de calibración de 16 bits para la temperatura y 9 parámetros de calibración de 16 bits más la temperatura para la presión. La granulación de la medición de temperatura es de 0,0003 grados Celsius para un cambio de bit menos significativo (lectura de 20 bits), aumentando a 0,0046 grados Celsius si se utiliza la lectura de 16 bits.

La humedad es un valor de 16 bits que debe convertirse en humedad relativa a través de otro algoritmo complejo utilizando 6 parámetros de calibración que son una combinación de 8, 12 y 16 bits.

La hoja de datos muestra la precisión absoluta de la lectura de temperatura como + -0,5 C a 25 C y + -1 C en el rango de 0 a 65 C.

La granularidad de la medición de presión es de 0,15 Pascales (es decir, 0,0015 hectoPascales) a una resolución de 20 bits, o 2,5 Pascales a una resolución de 16 bits. El valor de la presión bruta se ve afectado por la temperatura, de modo que alrededor de 25 ° C, un aumento de la temperatura de 1 grado C disminuye la presión medida en 24 Pascales. La sensibilidad a la temperatura se tiene en cuenta en el algoritmo de calibración, por lo que los valores de presión suministrados deben ser precisos a diferentes temperaturas.

La hoja de datos muestra la precisión absoluta de la lectura de presión como + -1 hPa para temperaturas entre 0 C y 65 C.

La precisión de la humedad se da en la hoja de datos como + -3% RH y + -1% de histéresis.

Cómo funciona

Los 24 bytes de datos de calibración de temperatura y presión, y también en el caso del BME280 los 8 bytes de datos de calibración de humedad, deben leerse del dispositivo y almacenarse en variables. Estos datos se programan individualmente en el dispositivo en la fábrica, por lo que diferentes dispositivos tienen diferentes valores, al menos para algunos de los parámetros. Un BME / P280 puede estar en uno de dos estados. En un estado está midiendo. En el otro estado está esperando (durmiendo).

Se puede comprobar en qué estado se encuentra mirando el bit 3 del registro 0xF3.

Los resultados de la medición más reciente se pueden obtener en cualquier momento leyendo el valor de datos correspondiente, independientemente de si el dispositivo está durmiendo o midiendo.

También hay dos formas de operar el BME / P280. Uno es el modo Continuo (llamado modo Normal en la hoja de datos) que alterna repetidamente entre los estados de Medición y Dormir. En este modo, el dispositivo realiza un conjunto de mediciones, luego se pone en reposo, luego se despierta para otro conjunto de mediciones, y así sucesivamente. El número de mediciones individuales y la duración de la parte de reposo del ciclo se pueden controlar a través de los registros de configuración.

La otra forma de operar el BME / P280 es el modo de disparo único (llamado modo forzado en la hoja de datos). En este modo, el dispositivo se despierta del estado de reposo mediante un comando para medir, realiza una serie de mediciones y luego vuelve al modo de reposo. El número de mediciones individuales en el conjunto se controla en el comando de configuración que activa el dispositivo.

En el BMP280, si se realiza una sola medición, se completan los 16 bits más significativos del valor y los cuatro bits menos significativos de la lectura del valor son todos ceros. El número de mediciones se puede establecer en 1, 2, 4, 8 o 16 y, a medida que aumenta el número de mediciones, aumenta el número de bits llenos de datos, de modo que con 16 mediciones, los 20 bits se completan con datos de medición. La hoja de datos se refiere a este proceso como sobremuestreo.

En la BME280, se aplica la misma disposición siempre que no se esté filtrando el resultado. Si se utiliza filtrado, los valores son siempre de 20 bits, independientemente de cuántas mediciones se tomen en cada ciclo de medición.

Cada medición individual tarda aproximadamente 2 milisegundos (valor típico; el valor máximo es 2,3 ms). Agregue a esto una sobrecarga fija de aproximadamente 2 ms (generalmente un poco menos) significa que una secuencia de medición, que puede constar de 1 a 32 mediciones individuales, puede tomar desde 4 ms hasta 66 ms.

La hoja de datos proporciona un conjunto de combinaciones recomendadas de sobremuestreo de temperatura y presión para diversas aplicaciones.

Registros de control de configuración

Los dos registros de control de configuración en el BMP280 están en las direcciones de registro 0xF4 y 0xF5, y están mapeados en 6 valores de control de configuración individuales. 0xF4 consta de:

  • 3 bits osrs_t (mide la temperatura 0, 1, 2, 4, 8 o 16 veces);
  • 3 bits osrs_p (medir la presión 0, 1, 2, 4, 8 o 16 veces); y
  • Modo de 2 bits (suspensión, forzado (es decir, disparo único), normal (es decir, continuo).

0xF5 consta de:

  • 3 bits t_sb (tiempo de espera, 0,5 ms a 4000 ms);
  • Filtro de 3 bits (ver más abajo); y
  • Spiw_en de 1 bit que selecciona SPI o I2C.

El parámetro de filtro controla un tipo de algoritmo de caída exponencial, o filtro de respuesta de impulso infinito (IIR), que se aplica a los valores de medición de temperatura y presión sin procesar (pero no a los valores de humedad). La ecuación se da en la hoja de datos. Otra presentación es:

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

donde (n) indica la medición y el valor de salida más recientes; y K es el parámetro de filtro. El parámetro de filtro K se puede establecer en 1, 2, 4, 8 o 16. Si K se establece en 1, la ecuación simplemente se convierte en Valor (n) = medición (n). La codificación del parámetro de filtro es:

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

El BME 280 agrega un registro de control de configuración adicional en la dirección 0xF2, "ctrl_hum" con un único parámetro osrs_h de 3 bits (medir la humedad 0, 1, 2, 4, 8 o 16 veces).

Paso 4: tiempo de medición y lectura

Planeo agregar esto más adelante, mostrando el tiempo de los comandos y las respuestas de medición.

Iddt: corriente en la medición de temperatura. Valor típico 325 uA

Iddp: corriente en la medición de presión. Valor típico 720 uA, máx. 1120 uA

Iddsb - actual en modo de espera. Valor típico 0,2 uA, máx. 0,5 uA

Iddsl: corriente en modo de suspensión. Valor típico 0,1 uA, máx. 0,3 uA

Paso 5: Pautas de software

Directrices de software
Directrices de software
Directrices de software
Directrices de software

Modo de ráfaga I2C

La hoja de datos del BMP280 proporciona orientación sobre la lectura de datos (sección 3.9). Dice que "se recomienda encarecidamente utilizar una lectura en ráfaga y no direccionar cada registro individualmente. Esto evitará una posible confusión de bytes pertenecientes a diferentes medidas y reducirá el tráfico de la interfaz". No se proporciona ninguna orientación con respecto a la lectura de los parámetros de compensación / calibración. Es de suponer que estos no son un problema porque son estáticos y no cambian.

Esta biblioteca lee todos los valores contiguos en una sola operación de lectura: 24 bytes en el caso de los parámetros de compensación de temperatura y presión, 6 bytes para temperatura y presión combinadas y 8 bytes para humedad, temperatura y presión combinadas. Cuando solo se comprueba la temperatura, solo se leen 3 bytes.

Uso de macros (#define etc.)

No hay macros en esta biblioteca que no sean la macro habitual "include guard" de la biblioteca que evita la duplicación.

Todas las constantes se definen mediante la palabra clave const, y la impresión de depuración se controla con funciones C estándar.

Ha sido la fuente de cierta incertidumbre para mí, pero el consejo que recibo al leer muchas publicaciones sobre este tema es que el uso de #define para la declaración de constantes (al menos) y (probablemente) el control de impresión de depuración es innecesario e indeseable.

El caso del uso de const en lugar de #define es bastante claro: const usa los mismos recursos que #define (es decir, nil) y los valores resultantes siguen las reglas de alcance, lo que reduce la posibilidad de errores.

El caso del control de impresión de depuración es un poco menos claro, porque la forma en que lo he hecho significa que el código final contiene la lógica para las declaraciones de impresión de depuración, aunque nunca se ejercen. Si la biblioteca se va a utilizar en un gran proyecto en un microcontrolador con memoria muy limitada, esto puede convertirse en un problema. Dado que mi desarrollo fue en un ESP8266 con una gran memoria flash, esto no pareció ser un problema para mí.

Paso 6: rendimiento de temperatura

Planeo agregar esto más tarde.

Paso 7: rendimiento de la presión

Planeo agregar esto más tarde.

Recomendado: