Micropython: Midiendo variables ambientales con el BME280

Al momento de medir variables ambientales, como la temperatura o humedad del aire, tenemos varios sensores a nuestra disposición, como los conocidos DHT11 y DHT22. En este artículo les presento al BME280, un sensor de la firma alemana BOSCH que además de tener mayor precisión que los anteriores, le agrega la posibilidad de medir la presión atmosférica.

El sensor BME280

El BME280 es un sensor digital de temperatura, humedad y presión atmosferica fabricado por BOSCH en un encapsulado metálico de apenas 2.5 × 2.5 mm y una altura de 0.93 mm.

Fig. 1. El BME280 (Fuente: BOSCH)

El sensor puede funcionar con una alimentación de entre 1.71V y 3.6V y tiene un consumo muy bajo de corriente, del orden de 3.6 uA (micro amper) cuando mide las tres variables a una frecuencia de 1Hz y puede bajar a 0.1 uA en modo sleep, lo que lo hace ideal para aplicaciones alimentadas a baterías.

El sensor de humedad provee una respuesta sumamente rápida y gran exactitud en un rango amplio de valores, pudiendo medir desde 0 hasta 100% de humedad relativa con un error de +/-3%.

El sensor de presión es un sensor de presión barométrica absoluta, esto es mide la presión del aire en un punto determinado comparada con la presión del vacío (cero) y trabaja en el rango de 300 a 1100 hPa (hecto Pascales).

El sensor de temperatura , además de entregarnos la temperatura del aire, se usa para compensar las mediciones de presión y humedad, que se pueden ver afectadas por este valor. Es capaz de operar entre -40 y +85 °C.

Para su conexión, el BME280 cuenta con interfaces I2C y SPI, lo que simplifica su conexión a distintos microcontroladores.

Módulos con BME280

Hay muchos módulos o placas que incorporan el BME280 y alguna circuitería auxiliar. Algunos incluyen un regulador de tensión de 3.3V, lo que nos permite alimentarlo con 5V, otros tienen una cantidad reducida de pines, con lo que disponemos sólo de la interfaz I2C y algunos incluyen los pines para las dos interfaces, tanto I2C como SPI. Como siempre les recomiendo, antes de comenzar a realizar pruebas con su módulo asegúrense de sus características particulares.

Fig. 2. Distintos módulos con el BME280

No se debe confundir el BME280 con el BMP280. El primero mide las tres variables ambientales, de allí la letra E (Environment = Ambiente), mientras que el segundo mide sólo la presión y la temperatura (la P es de Pressure = Presión).

El módulo que usaré para este tutorial tiene 6 pines, porque tiene las señales disponibles tanto para I2C como SPI y no tiene regulador de tensión, así que funciona directamente con microcontroladores de 3.3V como el ESP32 que usaré para programarlo.

Esta placa en particular a veces puede dar lugar a confusión porque su fabricante utiliza la misma PCB para montar el BME280 y el BMP280 y (en el mejor de los casos) lo marca en la serigrafía con un punto cerca de las letras E o P.

Fig. 3. Módulo BME/BMP280

Desafortunadamente mi placa no tenía dicha marca, pero gracias al artículo de lui_gough en Techzone pude confirmar que correspondía al BME280 (les sugiero que la consulten si tienen dudas).

Conexión al ESP32

La conexión al ESP32 es muy sencilla. Como usaremos la interfaz I2C debemos conectar los pines SDA y SCL a los pines del mismo nombre en el ESP32 (SDA = GPIO21, SCL = GPIO22) y proveer de alimentación al módulo desde la salida 3V3 y GND, como se ve en el siguiente circuito.

Fig. 4. Circuito con ESP32
Fig. 5. Conexiones con el ESP32

El programa

Micropython no tiene un módulo estandard para utilizar el BME280, pero podemos encontrar varios en Internet. En este tutorial utilizaré el del usuario robert-hh que se puede descargar desde su repositorio en Github para luego copiar en la memoria del ESP32.

Los pasos son los siguientes:

  • Acceder al repositorio
  • Hacer click en el botón verde Code y luego en Download ZIP
Fig. 6. Repositorio
  • Descomprimir el archivo ZIP (BME-280 master.zip)

Veremos que dentro del ZIP hay varios archivos, entre ellos BME280float.py, BME280int.py y bmetest.py. El primero es una versión de la librería que usa números flotantes (con coma), el segundo una versión que usa sólo números enteros y el último un programa de prueba.

  • Copiar la librería a la memoria del ESP32 (en mi caso usaré la versión con punto flotante). Para ello la abrimos en Thonny y la guardamos en el ESP32 con FicheroGuardar como
Fig. 7. Guardando la librería en el ESP32

Con eso ya hemos terminado y tenemos la librería lista para usar.

Comprobaremos su funcionamiento con un programa de pruebas:

from machine import I2C, Pin
from bme280_float import *
from utime import sleep

i2c = I2C(1, scl = Pin(22), sda = Pin(21), freq = 400000)
bme280 = BME280(i2c=i2c)

while True:

     print(bme280.values)
     sleep(1)

Tiene que entregar una salida en la consola como la siguiente:

Fig. 8. Salida del programa de prueba

Analicemos el funcionamiento del programa:

En la línea 1 importamos las clases I2C y Pin del módulo machine, para la interfaz I2C.

En la línea 2 importamos todo el contenido del módulo BME280_float.

En la línea 3 importamos la función sleep desde el módulo utime.

Luego, en la línea 5 instanciamos o creamos un objeto llamado i2c de la clase I2C. Como parámetros en el constructor le pasamos el valor “1” que indica que debe usar la interfaz I2C por hardware y no implementarlo por software, los pines GPIO de scl y sda y la frecuencia de trabajo).

A continuación en la línea 6 creamos el objeto bme280 para el sensor, de la clase BME280 y como parámetro le pasamos el objeto i2c creado en la línea anterior.

Para finalizar hacemos un bucle sin fin dentro del cual imprimimos la propiedad values del objeto del sensor, lo que hace que el mismo mida y nos devuelva los tres valores medidos en la forma de una tupla (si no recuerdan lo que es una tupla les recomiendo leer este otro artículo).

El formato del constructor empleado en la línea 6 para crear el objeto del sensor tienen este formato:

bme= BME280 (i2c=i2c, mode=Modo, address=Direccion)

Donde:

Modo indica el Oversampling que se realiza en las mediciones de humedad. El oversampling consiste en tomar varias mediciones y promediarlas para reducir el efecto del ruido. Puede tomar los siguientes valores, que indican la cantidad de mediciones a promediar (asume BME280_OSAMPLE_8 si no se especifica):

BME280_OSAMPLE_1, BME280_OSAMPLE_2, BME280_OSAMPLE_4, BME280_OSAMPLE_8, BME280_OSAMPLE_16

Dirección es la dirección I2C del sensor. Si se conecta el pin SDO a GND (o se lo deja desconectado) la dirección es 0x76 (que es la dirección por defecto de la librería). Si se conecta SDO a Vcc, la dirección es 0x77, que es la misma del BMP280 (por si es necesaria la compatibilidad).

La propiedad values contiene una tupla de cadenas de texto que incluyen la unidad. Si necesitamos trabajar con sólo los valores numéricos debemos hacer uso del método read_compensated_data () que nos devuelve un array de números enteros o de punto flotante según la versión de la librería que usemos. Por ejemplo:

valores = bme280.read_compensated_data ()  

temp = valores [0]
pres = valores [1]
hum  = valores [2]

Otras variables ambientales

Una función interesante de esta librería es que a partir de los datos de humedad, temperatura y presión es capaz de calcular otras variables de interés, como el Punto de rocío (Dew point) y la Altitud.

El punto de rocío se define como el valor al que debe descender la temperatura del aire para que el vapor de agua que contiene comience a condensarse en rocío, neblina o escarcha.

Para obtenerlo debemos leer la propiedad dew_point del objeto creado para el sensor.

La altitud se calcula a partir de la presión. Como la presión del aire disminuye a medida que aumenta la altitud, podemos calcular ésta comparando la presión actual con un valor de referencia. Podemos calcular la diferencia de altitud entre dos puntos, o la altura sobre el nivel del mar. El valor de referencia que usa la librería es la propiedad sealevel y podemos cargarle cualquier valor o el de la presión al nivel del mar que es de 101.325 Pascales (si no lo cambiamos, este es valor que tiene por defecto). La altitud calculada puede leerse en la propiedad altitude.

Un ejemplo aclarará esto:

from machine import I2C, Pin
from bme280_float import *
from utime import sleep

i2c = I2C(1, scl = Pin(22), sda = Pin(21), freq = 400000)
bme280 = BME280(i2c=i2c)

while True:

     print ("Referencia: ", bme280.sealevel, " Pa")
     print ("Mi altitud: ", bme280.altitude, " metros s.n.m") 
     print ("Punto de rocío: ", bme280.dew_point, " grados")
     sleep(1)

Conclusión

Vimos las características principales del sensor BME280 y los distintos módulos en los que puede estar incluido. Analizamos las características de un módulo en particular y vimos como conectarlo a un ESP32 a través de la interfaz I2C. También analizamos un programa mínimo en Micropython para leer los valores medidos empleando una librería que instalamos en nuestra placa. Finalmente, analizamos características adicionales de la librería, como son el calculo de la altitud y del punto de rocío.

En próximos artículos veremos otras apliaciones de este sensor y cómo enviar los datos medidos a un sitio de Internet.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias