Hoy traemos para ustedes un sencillo tutorial sobre el uso del sensor BMP180, que nos permite medir presión atmosférica/barométrica y diferencias de alturas entre dos puntos.
Antes de empezar a explicar el funcionamiento del sensor BMP180, me gustaría introducir el concepto de presión atmosférica o barométrica. Citaré un artículo de Wikipedia con algunos conceptos sobre este tema.
La presión atmosférica es la fuerza por unidad de superficie que ejerce el aire sobre la superficie terrestre.
La presión atmosférica en un punto coincide numéricamente con el peso de una columna estática de aire de sección recta unitaria que se extiende desde ese punto hasta el límite superior de la atmósfera. Como la densidad del aire disminuye conforme aumenta la altura, no se puede calcular ese peso a menos que seamos capaces de expresar la variación de la densidad del aire ρ en función de la altitud z o de la presión p. Por ello, no resulta fácil hacer un cálculo exacto de la presión atmosférica sobre un lugar de la superficie terrestre. Además tanto la temperatura como la presión del aire están variando continuamente, en una escala temporal como espacial, dificultando el cálculo. Podemos obtener una medida de la presión atmosférica en un lugar determinado pero con ella no se pueden obtener muchas conclusiones: es la variación de dicha presión a lo largo del tiempo lo que nos permite obtener una información útil que, unida a otros datos meteorológicos (temperatura atmosférica, humedad y vientos) nos da una imagen bastante acertada del tiempo atmosférico en dicho lugar e incluso un pronóstico a corto plazo del mismo.
En pocas palabras, la presión atmosférica se da por la columna de aire que existe sobre nosotros. La misma está en función de la altura y relacionada con las condiciones meteorológicas de determinado lugar en determinado momento.
El sensor BMP180 es un sensor de presión atmosférica de alta precisión. En la hoja de datos del dispositivo se detalla esta información.
Se utiliza la interfaz I2C para comunicación. Las conexiones de este sensor son muy sencillas:
Para el uso de este sensor existe una librería llamada BMP180, la cual podemos descargar aquí. También podemos consultar los archivos de la librería en Github.
Vamos a probar nuestro sensor. Primero hacemos las conexiones siguiendo la tabla de la parte superior.
El sensor BMP180 es capaz de leer presión barométrica (absoluta) y temperatura. Por medio de cálculos matemáticos es capaz de detectar diferencias de alturas. ¿Cómo? Pues como ya mencionamos la Presión Atmosférica o Barométrica es inversamente proporcional a la altura sobre el nivel del mar, es decir, a medida que nos elevamos decrece la presión. Por eso es que cuando viajamos por carreteras que atraviesan colinas o montañas sentimos que nuestros oídos se tapan al descender. Esto se debe a que la presión atmosférica aumenta y sentimos el efecto del aumento en la presión. En el código que presentaré se hará una lectura inicial de la presión barométrica, expresada en milibares. A medida que nos desplacemos hacia un punto más alto o más bajo el sensor medirá la diferencia en la presión y la expresará como una variación en la altitud a la cual se encuentra el sensor con respecto a la medición inicial que será considerada como 0.
Conectemos nuestro sensor al Arduino.
Ahora el código que vamos a utilizar es el siguiente.
Nota: este código está basado en uno de los ejemplos que vienen con la librería; lo he simplificado y las instrucciones están en español. El ejemplo original está en la carpeta «Examples» dentro del archivo de la librería y ha sido adaptado a las condiciones locales del almacén de Sparkfun en Colorado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
// Se importan las librerías #include <SFE_BMP180.h> #include <Wire.h> //Se declara una instancia de la librería SFE_BMP180 pressure; //Se declaran las variables. Es necesario tomar en cuenta una presión inicial //esta será la presión que se tome en cuenta en el cálculo de la diferencia de altura double PresionBase; //Leeremos presión y temperatura. Calcularemos la diferencia de altura double Presion = 0; double Altura = 0; double Temperatura = 0; char status; void setup() { Serial.begin(9600); //Se inicia el sensor y se hace una lectura inicial SensorStart(); } void loop() { //Se hace lectura del sensor ReadSensor(); //Se imprimen las variables Serial.println(" ////// "); Serial.print("Temperatura: "); Serial.print(Temperatura); Serial.println(" grados C"); Serial.print("Presion: "); Serial.print(Presion); Serial.println(" milibares"); Serial.print("Altura relativa: "); Serial.print(Altura); Serial.println(" metros"); delay(2000); } void SensorStart() { //Secuencia de inicio del sensor if (pressure.begin()) Serial.println("BMP180 init success"); else { Serial.println("BMP180 init fail (disconnected?)\n\n"); while (1); } //Se inicia la lectura de temperatura status = pressure.startTemperature(); if (status != 0) { delay(status); //Se lee una temperatura inicial status = pressure.getTemperature(Temperatura); if (status != 0) { //Se inicia la lectura de presiones status = pressure.startPressure(3); if (status != 0) { delay(status); //Se lee la presión inicial incidente sobre el sensor en la primera ejecución status = pressure.getPressure(PresionBase, Temperatura); } } } } void ReadSensor() { //En este método se hacen las lecturas de presión y temperatura y se calcula la altura //Se inicia la lectura de temperatura status = pressure.startTemperature(); if (status != 0) { delay(status); //Se realiza la lectura de temperatura status = pressure.getTemperature(Temperatura); if (status != 0) { //Se inicia la lectura de presión status = pressure.startPressure(3); if (status != 0) { delay(status); //Se lleva a cabo la lectura de presión, //considerando la temperatura que afecta el desempeño del sensor status = pressure.getPressure(Presion, Temperatura); if (status != 0) { //Se hace el cálculo de la altura en base a la presión leída en el Setup Altura = pressure.altitude(Presion, PresionBase); } else Serial.println("error en la lectura de presion\n"); } else Serial.println("error iniciando la lectura de presion\n"); } else Serial.println("error en la lectura de temperatura\n"); } else Serial.println("error iniciando la lectura de temperatura\n"); } |
El resultado que obtendremos en el Monitor Serial, cada 2 segundos es el siguiente.
Espero que la información suministrada sea de mucha utilidad para todos y todas. Los invito a seguirnos en Facebook, Twitter y a suscribirse a nuestro Canal de Youtube.
Saludos.
buenas tardes son tan amables y me pueden compartir la ficha técnica de este sensor muchas gracias.
necesito hacerte una pequeña propuesta de trabajo. pero no quiero que sea publica. me contactas ?
351 6327562 tambien whatsApp
Mi whatsapp es +50767347398
Buenas tardes, disculpa, las variaciones en la altitud son normales? No hay forma de compensarlas?
Sí son normales. No es un sensor taan preciso, por lo cual tendrías que hallar la manera de compensar las variaciones.