Tutorial sensor de presión barométrica BMP180
El sensor de presión barométrica BMP180 está diseñado para leer la presión atmosférica y de esta forma estimar indirectamente la Altura sobre el nivel del mar. La presión atmosférica es la fuerza que ejerce el aire (atmósfera) sobre la superficie de la tierra. La presión atmosférica se debe al peso de la columna de aire sobre determinada área, es por esta razón que al medir la presión atmosférica en puntos con mayor altitud, el valor de la presión es menor por ser menor la cantidad de aire. La presión atmosférica también varía con el clima, principalmente con la temperatura, pues esta hace cambiar la densidad del aire, que se ve reflejado en un cambio en el peso y por consiguiente en un cambio de presión.
Entonces, la presión atmosférica varía con la temperatura y la altitud, estas dos variables son las más representativas para el cambio de presión. Factores como la humedad relativa y la velocidad del viento también influyen en la presión atmosférica en menor forma y pueden ser obviados.
Lo que mide el sensor BMP180 es la presión absoluta (Barométrica) y la temperatura, al sensar la temperatura podemos compensar su influencia en la presión y asi determinar con mayor exactitud la altitud.
Nuestro módulo BMP180 incluye además del sensor BMP180, un regulador de voltaje (5V a 3.3V), resistencias pull-up y capacitores by-pass. El Modulo puede alimentarse directamente de la salida de 5V de Arduino. Posee un formato pequeño y de bajo consumo de corriente.
Librería para el sensor de presión BMP180
Para este tutorial utilizaremos la librería desarrollada por Sparkfun, dicha librería lo pueden descargar en: https://github.com/sparkfun/BMP180_Breakout/...
Es necesario descargar e importar la librería a nuestro IDE de Arduino, antes de empezar con los ejemplos explicaremos las funciones que utilizaremos:
begin()
Inicializa el sensor BMP180, nos retorna 1 si la inicialización es correcta o 0 si ha fallado
startTemperature()
Función para iniciar una medición de temperatura y nos retorna el tiempo en milisegundos que necesitamos esperar antes de obtener la lectura. Si nos retorna un 0, es porque ha fallado el inicio de la medición de temperatura
getTemperature(T)
Obtener la temperatura en la variable T, antes de usar esta función es necesario llamar a la función startTemperature() y que haya transcurrido el tiempo adecuado para la lectura; retorna 1 o 0 si la lectura se ha realizado con éxito o no respectivamente
startPressure(Sobremuetreo);
Función para iniciar una medición de presión, hay que indicar la cantidad de muestras adicionales (de 0 a 3) que el sensor debe tomar para la lectura de la presión y nos retorna el tiempo en milisegundos que necesitamos esperar antes de obtener la lectura. Si nos retorna un 0, es porque ha fallado el inicio de la medición de presión
getPressure(P, T);
Obtener el valor de la medición iniciado previamente con startPressure(); es necesario darle como parámetro la temperatura T el cual servirá para compensar la influencia de la temperatura en el cálculo de la presión, el valor de la presión absoluta se guarda en la variable P. Retorna 1 o 0 si la lectura se ha realizado con éxito o no respectivamente
altitude(P, Po);
Calcula la altitud entre el punto donde se ha tomado la lectura de presión P (en mbar) con respecto a un punto de referencia con presión Po (en mbar). Nos retorna el valor de la altitud en metros
sealevel(P, A);
Esta función realiza el cálculo inverso a altitude(P, Po) , Dado una presión P (en mbar) y una altitud A (en metros) calcula la presión al nivel del mar o punto desde donde se mide la altura. Retorna el valor de la presión en mbar
Explicado esto procedemos a realizar nuestros ejemplos:
Conexiones entre Arduino y módulo BMP180
Las conexiones son como cualquier conexión I2C:
Adaptador LCD a I2C |
Arduino Uno, Nano, Mini. |
Arduino Mega , DUE |
Arduino Leonardo |
---|---|---|---|
VCC |
5V |
5V |
5V |
GND |
GND |
GND |
GND |
SCL |
A5 |
21 |
3 |
SDA |
A4 |
20 |
2 |
1. Realizar lecturas de presión y temperatura con el BMP180
Realizar esta tarea es sumamente sencillo, basta con iniciar la lectura, esperar el tiempo que dura la lectura y obtener dicho valor. Realizaremos el mismo procedimiento tanto para temperatura y presión.
A continuación se muestra el Sketch correspondiente:
#include <SFE_BMP180.h> #include <Wire.h> SFE_BMP180 bmp180; void setup() { Serial.begin(9600); if (bmp180.begin()) Serial.println("BMP180 iniciado correctamenten"); else { Serial.println("Error al iniciar el BMP180"); while(1); // bucle infinito } } void loop() { char status; double T,P; status = bmp180.startTemperature();//Inicio de lectura de temperatura if (status != 0) { delay(status); //Pausa para que finalice la lectura status = bmp180.getTemperature(T); //Obtener la temperatura if (status != 0) { status = bmp180.startPressure(3); //Inicio lectura de presión if (status != 0) { delay(status);//Pausa para que finalice la lectura status = bmp180.getPressure(P,T); //Obtenemos la presión if (status != 0) { Serial.print("Temperatura: "); Serial.print(T,2); Serial.print(" *C , "); Serial.print("Presion: "); Serial.print(P,2); Serial.println(" mb"); } } } } delay(1000); }
El resultado que obtenemos por el monitor serial es el siguiente:
2. Estimar la Altitud con el BMP180
En este caso calcularemos la altitud de nuestra posición sobre el nivel del mar, para esto es necesario medir tanto la presión como la temperatura de nuestra posición, además como dato necesitamos la presión atmosférica sobre el nivel del mar.
EL sketch para obtener la altura es el siguiente:
#include <SFE_BMP180.h> #include <Wire.h> SFE_BMP180 bmp180; double PresionNivelMar=1013.25; //presion sobre el nibel del mar en mbar void setup() { Serial.begin(9600); if (bmp180.begin()) Serial.println("BMP180 iniciado correctamenten"); else { Serial.println("Error al iniciar el BMP180"); while(1); // bucle infinito } } void loop() { char status; double T,P,A; status = bmp180.startTemperature();//Inicio de lectura de temperatura if (status != 0) { delay(status); //Pausa para que finalice la lectura status = bmp180.getTemperature(T); //Obtener la temperatura if (status != 0) { status = bmp180.startPressure(3);//Inicio lectura de presión if (status != 0) { delay(status);//Pausa para que finalice la lectura status = bmp180.getPressure(P,T);//Obtenemos la presión if (status != 0) { Serial.print("Temperatura: "); Serial.print(T); Serial.print(" *C , "); Serial.print("Presion: "); Serial.print(P); Serial.print(" mb , "); //-------Calculamos la altitud-------- A= bmp180.altitude(P,PresionNivelMar); Serial.print("Altitud: "); Serial.print(A); Serial.println(" m s.n.m."); } } } } delay(1000); }
A continuación se muestra los datos recibidos por el monitor serial.
3. Calculando la altura entre dos puntos
Para este caso tomaremos un punto inicial, para nuestra altura h=0, y a partir de aquí, conforme nos desplazamos verticalmente mediremos la altura, en este caso la precisión es de aproximadamente 0,5m. Para esto necesitamos medir tanta presión y temperatura en el punto de la posición inicial, como en los demás posiciones:
EL sketch para realizar esto es:
#include <SFE_BMP180.h> #include <Wire.h> SFE_BMP180 bmp180; double Po; //presion del punto inicial para h=0; char status; double T,P,A; void setup() { Serial.begin(9600); if (bmp180.begin()) { Serial.println("BMP180 iniciado correctamentenTomando medidadas del punto de referncia...n"); status = bmp180.startTemperature();//Inicio de lectura de temperatura if (status != 0) { delay(status); //Pausa para que finalice la lectura status = bmp180.getTemperature(T);//Obtener la temperatura if (status != 0) { status = bmp180.startPressure(3);//Inicio lectura de presió if (status != 0) { delay(status);//Pausa para que finalice la lectura status = bmp180.getPressure(P,T);//Obtenemos la presión if (status != 0) { Po=P; //Asignamos el valor de presión como punto de referencia Serial.println("Punto de referncia establecido: h=0"); } } } } } else { Serial.println("Error al iniciar el BMP180"); while(1); // bucle infinito } } void loop() { status = bmp180.startTemperature();//Inicio de lectura de temperatura if (status != 0) { delay(status); //Pausa para que finalice la lectura status = bmp180.getTemperature(T);//Obtener la temperatura if (status != 0) { status = bmp180.startPressure(3);//Inicio lectura de presión if (status != 0) { delay(status);//Pausa para que finalice la lectura status = bmp180.getPressure(P,T);//Obtenemos la presión if (status != 0) { //-------Calculamos la altura con respecto al punto de referencia-------- A= bmp180.altitude(P,Po); Serial.print("h="); Serial.print(A); Serial.println(" metros"); } } } } delay(1000); }
A continuación mostramos la salida del monitor serial, en la primera imagen lecturas de nuestro punto de referencia y en la segunda imagen lecturas después de subir dos pisos.
En este caso nuestro punto de referencia es la posición inicial en donde encendemos o reiniciamos nuestro Arduino. Pero podemos trabajarlo como un punto fijo en caso sea necesario, para esto tenemos que tener como dato la presión de dicho punto.
Ma******* 21/02/2021 Responder
Hola, tengo una consulta. ¿En qué parte del programa se especifican los pines donde va conectado el sensor? necesito cambiar los pines analógicos 4 y 5. GraciasBe*** *** ******ch 17/09/2021 Responder
Los pines A4 y A5 están definidos fijos para los señales SDA y SCL del bus I2C y no se pueden cambiar en el Arduino UNOtu **ki 11/11/2021 Responder
Pero puedes utilizar otros pines si los defines por software, iran mas lentos, pero funcionarajo*** 28/04/2019 Responder
Hola, conecte el sensor bmp 180, pero no varia mucho la presion y si varia la altura, y estoy en un punto fijo, se puede asignarle una altura fija para que funcione mejor el sensor de presion.Saludos
Ma**** 12/02/2019 Responder
Tengo una honda elwmwnt 2003 y marca en codigo al escaner ob2 el codigo p2227..e preguntado y me dise que es el sensor barometrico de precion no se en que parte se encuentra podrian decirme por favor en que parte del motor esta por favorJo*** 23/11/2018 Responder
Hola. alguien sabe si hay algún sensor que pueda medir altas presiones, del orden de 30000hPa?? Es para una aplicación relacionada con aires acondicionados. Muchas gracias!Ch****** 28/05/2018 Responder
Hola,Tengo dos preguntas:
1.- ¿En que medida me da la presion?
2.- ¿Donde encuentro las librerías para este sensor?
jo** 29/03/2018 Responder
Hola, Buenas tardes, un gusto saludarte, disculpa de casualidad podrias indicarme como puedo conectar dos sensores mbp180, debido a que al parecer la libreria ya trae configurada los puertos A4 y A5 pra este caso, te lo agradeceria.Má***** 05/11/2017 Responder
Hola.Antes de nada, agradecerte esta página por la información tan importante que aportas sobre el sensor BMP180.
Estoy usando este sensor con la placa Wemos y no va bien. Quiero decir que las medidas no son lógicas, por ejemplo más de cien grados de temperatura y presiones negativas. El Sketch que he usado es el ejemplo de la librería.
Mi pregunta es si has usado este sensor con una placa Wemos.
Muchas gracias.
Má***** 04/11/2017 Responder
Hola.Antes de nada, agradecerte esta página por la información tan importante que aportas sobre el sensor BMP180.
Estoy usando este sensor con la placa Wemos y no va bien. Quiero decir que las medidas no son lógicas, por ejemplo más de cien grados de temperatura y presiones negativas. El Sketch que he usado es el ejemplo de la librería.
Mi pregunta es si has usado este sensor con una placa Wemos.
Muchas gracias.
Ja*** 02/11/2017 Responder
Si la interfaz I2C del sensor trabaja a 3.3V porque se conecta directamente al arduino si este tiene niveles logicos de 5v?Iv*** 30/10/2017 Responder
Me pueden explicar el "chat status"ge**** 09/09/2017 Responder
Hola, quisiera conectar 2 sensores al mismo puerto serie. como debería hacerlo? por otro lado, puedo conectar varios sensores en diferentes patas que no sean solamente la A4 y A5?Lu** ***** 13/06/2017 Responder
En el datasheet del BMP180, indica que trabaja con 3.3V.Na***** 29/07/2017 Responder
Hola Luis, el módulo usado tiene un regulador de 3.3VDa*** **** ***** ***as 22/05/2017 Responder
una pregunta porque lo ponen 3 al status = bmp180.startPressure(3) y como pudeo ponerlo como punto fijo, como dice al final.Na***** 30/05/2017 Responder
Hola David, el valor 3 es para especificar el modo de medición, 3 es para la máxima precisión (mayor número de muestras), Puedes cambiar a 0 para disminuir el tiempo de lectura y consumo de corriente. En el último ejemplo, con punto fijo nos referimos a no medir la presión de la posición inicial, sino en tener dicho valor como dato, similar al ejemplo 2.