El sensor BMP180 está diseñado para leer la presión atmosférica, que es la fuerza que ejerce el aire (atmósfera) sobre la superficie de la tierra. En otras palabras se debe a la columna de aire que esta sobre determinada área, por esto, si medimos la presión atmosférica en puntos más altos la presión baja debido a que hay menos cantidad de aire sobre nosotros. 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, por lo que podemos discriminar la humedad y viento que también influyen en la presión.
Lo que mide el sensor BMP180 es la presión absoluta (Barométrica) y la temperatura, al sensar la temperatura podemos compensar la influencia de ésta en la presión, y con un valor más exacto de la presión podemos calcular la altitud.
Este sensor vine en diversos módulos que nos ayudan en su conexión, el que usaremos para este tutorial es el siguiente modulo:
Este módulo tiene un pequeño regulador de voltaje de 3.3V, por lo que podemos alimentarlo con los 5V de Arduino, las dimensiones del sensor son pequeños y es Ultra-bajo consumo de energía, pudiendo utilizar en muchas aplicaciones.
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, empecemos 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
|
Relazando 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, esta se hace tanto para la temperatura y presión.
A continuación se muestra el Sketch para realizar esta tarea:
#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:
Obteniendo la Altitud de nuestra posición.
En este caso calcularemos la altitud de nuestra posición, para esto necesitamos medir la con el BMP180 la presión y 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.
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:
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.
No hay comentarios.:
Publicar un comentario