Objetivos
Material requerido.
Sensor BMP280 |
Sensor BMP280
El sensor BMP280 es el sucesor del muy conocido BMP180 con una puesta al día y mejora de prestaciones que le convierten en un elemento muy interesante para nuestros proyectos con Arduino y similares.
Básicamente mide presión atmosférica y temperatura (Y opcionalmente humedad) y como tiene una magnífica precisión puede convertir la presión barométrica a altitud con un error de± 1m. Unido a su pequeño tamaño y bajo consumo se convierte en un elemento ideal para drones y similares o simplemente como estación meteorológica de bajo costo.
Especificaciones generales:
Una cosa buena de este sensor es que además se puede leer mediante I2C o SPI lo que lo vuelve muy versátil para usar con nuestros micros y como últimamente todo el mundo parece querer medir temperatura y presión vamos a ver si hacemos un pequeño ejemplo de como usar el BMP280 con nuestro Arduino.
Diagrama de conexión
Para este ejemplo vamos a usar el puerto I2C por comodidad, pero conviene decir antes de empezar que, a pesar de su bondadoso aspecto, este pequeño sensor me ha estado mareando unos cuantos días por la cuestión de la dirección I2C y porque tiene un par de manías que conviene que destaquemos aquí para evitar dolores de cabeza innecesarios.
Normalmente, todos los diagramas de conexión que he ido viendo por ahí muestran un esquema como este de conexión:
Pero en la práctica si usas este esquema y descargas las librerías de Adafruit, la respuesta (Al menos con mi modelo de BMP280) el resultado ha sido invariablemente un mensaje de que no hay sensor a la vista y que revises cables.
Me había estado mareando tanto que decidí usar el programa que ya vimos en otras ocasiones I2C scanner que te informa de la dirección de los elementos tienes en el bus y tranquilamente te dice que hay algo en la 0x76, pero la librería de Adafruit no lo veía.
Al parecer la librería de Adafruit espera que el sensor este en la dirección 0x77 y no en la 0x76 por lo que parece que hay que ir a la librería a tocar a mano esta dirección, y como cada vez que tenemos que modificar la librería las deserciones aumentan en masa, he preferido buscar otra solución.
Intenté instanciar el objeto pasándole la dirección 0x76, pero ni caso. Hay que cambiar la dirección por defecto en la propia librería. perfo leyendo por ahí encontré que podemos cambiar la dirección de base I2c del módulo con el pin SDO:
Pin BMP280 | Arduino | Dirección I2C |
---|---|---|
SD0 | GND | 0x76 |
SD0 | 3,3V | 0x77 |
SD0 | Flotando | No está muy claro |
Por ese motivo vamos a probar a conectar nuestro modulo, con el pin SD0 a GND así:
Con este esquema seguimos manteniendo la dirección por defecto del sensor en 0x76, y aunque podríamos cambiar la dirección del módulo para que funcionara con las librerías de Adafruit, eso sería demasiado fácil y para entonces ya había encontrado otra librería que me funcionó a la primera y tenía listos los programas ( Y además podemos usar la librería de Adafruit en el próximo tuto que tengo una idea para hacerlo con el ESP32) , Así que enseguida volveremos a ello.
Programa Arduino y BMP280
Como es habitual, empecemos descargando la librería que me gustó para maneja el BMP280: BMP280_DEV , La instalamos como siempre y empezamos con el programa:
#include <BMP280_DEV.h> float temperature, pressure, altitude; BMP280_DEV bmp280;
Empezamos con un include de la librería y después definimos 3 variables globales para presión, temperatura y altitud. Y en el setup, tampoco hay mucha miga:
void setup() { Serial.begin(115200); bmp280.begin(BMP280_I2C_ALT_ADDR); bmp280.setTimeStandby(TIME_STANDBY_2000MS); // Medir cada 2 segs }
La primera línea fija la velocidad de comunicación con la consola a 115.200 y la segunda crea una instancia del sensor en la dirección alterna de 0x76 (La nuestra, y problema arreglado). La siguiente línea programa una lectura del sensor cada 2 segundos (2000MS), pero opcionalmente podemos variar el tiempo de muestreo a valores prefijados por la librería. Las opciones son:
TIME_STANDBY_XXX, donde los valores de XXX pueden ser 05MS, 62MS,125MS, 250MS, 500MS, 1000MS, 2000MS y 400MS dependiendo de cada cuanto tiempo queramos hacer la medida. Por último:
bmp280.startNormalConversion();
Inicia las lecturas en modo continuo con la cadencia indicada en la línea anterior. También aquí hay varias opciones:
Función | Descripcion |
---|---|
bmp280.startNormalConversion() | Inicia las lecturas en modo continuo con la cadencia indicada en setTimeStandby() |
bmp280.startForcedConversion() | Hace una única lectura y espera hasta la próxima orden de leer datos |
bmp280.stopConversion() | Detiene las lecturas y vuelve al modo Sleep |
El resto es ya gimnasia de programación:
if (bmp280.getMeasurements(temperature, pressure, altitude)) { Serial.print(temperature); Serial.print(F("*C ")); Serial.print(pressure); Serial.print(F("hPa ")); Serial.print(altitude); Serial.println(F("m")); }
El resultado es poco más o menos así en mi caso:
Como veras, la presión atmosférica se mide en hecto Pascales, que si bien es la norma en el sistema métrico europeo, es muy probable que no hayas oído hablar de ello porque en España es mucho más frecuente que en la tele den la presión en bares y milibares.
1 Bar = 100.000 Pascales
Recuerda que la definición de 1 bar, es la presión barométrica a nivel del mar y como yo vivo en Bilbao (Cuatro que podemos) la presión ambiente es más o menos la del nivel del mar.
Los que vienen a por nota podrían argumentar, que dado que en mis lecturas estoy a 64 m sobre el mar, la presion debería ser inferior 1.000 hPa y no ligeramente superior como se muestra. Pero también hay que tener en cuenta que la presión ambiente depende sensiblemente de la humedad relativa y que por tanto si quieres utilizarlo con una cierta seguridad deberías calibrar tu sensor dependiendo de la humedad ambiente, contra un dato de referencia , como una altitud por GPS.
Podeis descargar el programa entero de los ejemplos de la librería, en el menú:
\\Archivo\Ejemplos\BMP280_DEV\BMP280_I2C_Alt_Normal
Un saludo y hasta pronto