martes, 9 de febrero de 2016

Arduino Barómetro - Termómetro GY-68 BMP-180 Parte 2

Página principal


Arduino
Barómetro - Termómetro
GY-68    BMP-180

Parte 2


En esta segunda parte realizo mi propia librería para leer los datos del BMP-180.
Otra de las cosas que me he propuesto en el programa, es no utilizar los tipos de datos  double o float para los cálculos, de esta manera reduzco considerablemente el tamaño del programa, de 12,5K a 8,2K.
También he querido poner todo el conjunto del programa en un único fichero, de esta forma no se necesita ninguna librería aparte.



Para facilitar el programa he puesto el modo Oss controls the oversampling ratio of the pressure measurement (register F4h <7:6>): a modo 00b single. Esto repercute en la exactitud de la medida de la presión, de ser la lectura de 3 bytes a ser de 2 bytes. Aunque se lean 3 bytes para la presión, el último byte en este modo es 0.
Lo primero que se hace es leer 11 palabras de 16bit, es un coeficiente de calibración que se encuentra en una memoria EPROM del propio chip.
Con todos los datos leídos de la calibración del chip se realizan los cálculos.
En la página 15 del Data sheet del chip BMP180 se explica todos los cálculos.


  b6=b5-4000;
  x1=b6*b6;  x1=x1>>12;  x1=x1*VB2;  x1=x1>>11;
  x2=AC2;  x2=x2*b6; x2=x2>>11;
  x3=x2+x1;
  b3=AC1; b3=b3<<2; b3=b3+x3; b3=b3+2; b3=b3>>2;
  x1=AC3; x1*=b6;  x1=x1>>13;
  x2=b6*b6; x2=x2>>12; x2=x2*VB1; x2=x2>>16;
  x3=x1+x2;  x3=x3+2; x3=x3>>2;
  b4=x3;  b4=b4+32768;  b4=b4*AC4;  b4=b4>>15;
  b7=mpu-b3;  b7=b7*50000;
  if(b7<0x80000000)
    {
      p=b7; p=p<<1; p=p/b4;
    }
    else
    {
      p=b7/b4;  p=p<<1;
    }
  x1=p;  x1=x1>>8;  x1=x1*x1;
  x1=x1*3038;  x1=x1>>16;
  x2=-7357;  x2*=p;  x2=x2>>16;
  x1+=x2;  x1=x1+3791; x1=x1>>4;  p+=x1;
  Presion=p;
Ejemplo de como se realiza el cálculo de la presión.

Como podéis observar he troceado las fórmulas en cálculos sencillos, no empleando mas de dos operadores por operación. Ha sido una tarea un tanto trabajosa, pero creo que ha merecido la pena.

Una vez que tenemos la temperatura y la presión en la variables globales long Temperatura,Presion, nos toca representar los cálculos.
Para los cálculos de diferencia de altura, debemos haber realizado al inicio del programa un cálculo de la presión, para luego compararla con la presión nueva a diferente altura y hacer los cálculos.
Existe una formula que emplea números del tipo de coma flotante double, pero como mi intención es solo utilizar números enteros he tenido que emplear otra formula reducida pero que tiene margen de error.

 
 Fórmula para el cálculo de variación de altura a diferentes presiones.

A nivel del mar la variación de altura por 1hPa es de 8,43m , en lo cálculos que he hecho ami me salió 8,33m para obtener el menor error.
A  mayores altitudes como 790m la variación llega a 9 m por 1hPa, es el que he empleado yo.





Tablas de los diferentes cálculos a diferentes cambios de presión.

Para hacer las pruebas prácticas he tenido que recurrir a mi edificio de 12 plantas. La altura de cada planta es de 2,73 m, por lo que el total de altura es de 32,76 m.
En la prueba la medida obtenida fue de 33 m, aunque variaba constantemente arriba y abajo.

Espero que os haya gustado, y si os sirve para algo me comentéis vuestras  impresiones.


PROGRAMA


Saludos.
Juan Galaz

Bibliografía:

http://msrobotics.net/index.php/laboratorio-ard/110-sensor-de-presion-atmosferica-con-arduino-y-gy-68-bmp180
https://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
http://casanchi.com/fis/modeloteorico/modeloteorico.htm
https://es.answers.yahoo.com/question/index?qid=20100212141717AAJTMI4

2 comentarios:

  1. Hola Juan.

    Lo primero es felicitarte por el trabajo realizado, así como, el desarrollo del mismo.

    Ahora mismo estoy diseñando una estación METEO real para exterior y tu exposición me ha valido, entre otras cosas, para centrar el apartado de predicciones.

    Muchas gracias por compartir tu experiencia.

    Saludos,
    Manuel.

    ResponderEliminar