Publicidad

miércoles, 7 de diciembre de 2016

Tutorial sensor de presión barométrica BMP180

Tutorial sensor de presión barométrica BMP180
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:
Módulo Barómetro BMP180
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
   
Conexion de Modulo BMP180
  

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:
Lectura de presion y temperatura con BMP180
  

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.
Lectura presion, temperatura y altitud con BMP180

  

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.
 Altura entre dos puntos con BMP180
  
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

Publicidad