Mostrando entradas con la etiqueta GY-68. Mostrar todas las entradas
Mostrando entradas con la etiqueta GY-68. Mostrar todas las entradas

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

miércoles, 3 de febrero de 2016

Arduino Barómetro - Termómetro. GY-68 BMP-180 . Parte 1

Página principal


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

Parte 1


En este montaje utilizo el módulo GY-68  que está formado por el chip BMP-180 y el regulador de 3.3V para alimentar el chip.


GY-68
 Esquema del modulo GY-68 (BMP180 y regulador de 3.3V)
Existen otros módulos que llevan el BMP180 y no llevan regulador, por lo cual lo debemos alimentar a 3.3V. En este caso el módulo GY-68 lo podemos alimentar a 5V.

El BMP180 está fabricado por Bosch y en  su hoja de características explica lo siguiente:

3.2 General function and application schematics
The BMP180 consists of a piezo-resistive sensor, an analog to digital converter and a control unit
with E 2 PROM and a serial I 2 C interface. The BMP180 delivers the uncompensated value of pressure
and temperature. The E 2 PROM has stored 176 bit of individual calibration data. This is used to
compensate offset, temperature dependence and other parameters of the sensor.
    -UP = pressure data (16 to 19 bit)
    -UT = temperature data (16 bit)

Pressure range:  
     300 ... 1100hPa (+9000m ... -500m relating to sea level)
Storage temperature
    -40 +85 °C
Supply voltage:
    1.8 ... 3.6V (V DD )
    1.62V ... 3.6V (V DDIO )


De lo que podemos entender que tiene un sensor de presión  que mide presiones entre 300 y 1100 hPa.
Además tenemos un sensor de temperatura que puede medir entre -40 y +85 ºC.
Todo esto alimentado por una tensión entre 1.8 ... 3.6V.
El consumo es entre 3uA y 1mA dependiendo del modo en que trabaje.

En este montaje montaremos el arduino  junto con el GY-68, y visualizaremos los datos en un LCD Nokia 3310 además de por el terminal serie.


Esquema del circuito.

Montaje de circuito.
Montaje de circuito.

Como vemos el esquema está realizado en arduino uno y el montaje en arduino nano, se ha hecho por lo fácil que resulta montarlo con un arduino nano, pero la representación en esquema es mejor en arduino uno.
La alimentación del LCD se hace a 5V, aunque funciona también a 5V, pero no he querido forzar el LCD.
Todo el conjunto funciona también alimentado con 3.3V , pero en este caso conviene alimentar el LCD directamente a 3.3V.

Para el programa en arduino he utilizado la librería SFE_BMP180   https://github.com/LowPowerLab/SFE_BMP180 que ahorra considerablemente la programación del BMP180. En dicha librería hay dos ejemplos, uno de ellos he utilizado para mi programa , modificándolo a mi gusto.
He añadido al programa las rutinas para controlar el LCD Nokia 3310 donde se representan las diferentes medidas.
Para poder medir el cambio altitud, debemos introducir la altura donde se encuentra el circuito en ese momento.
En el programa se introduce en la línea:
// altura en Palencia
#define ALTURA 790

Cuando se inicia el programa se toma la presión de referencia a esa altura. Entonces cualquier variación de dicha presión la interpreta como variación de altura.
Debemos tener en cuenta que la presión varía en función del tiempo atmosférico, por lo cual no serviría la altitud si no se reinicia el programa para tomar la presión de referencia.
La prueba que he realizado para comprobar de que funciona la detección del cambio de altitud la he realizado en un ascensor, donde lo he verificado perfectamente como cambiaba. Desde la planta baja que me medía 755m hasta la planta 12 que me medía 790m de referencia.
Si por ejemplo no hubiese apagado el circuito y hubiese cambiado las condiciones atmosférica, nos hubiéramos dado cuenta que se subía o bajaba de altitud sin habernos movido.

En esta primera parte vemos como funciona el chip BMP180, en un próximo montaje quiero realizar un montaje que prediga el tiempo atmosférico por cambio de presión, además de un medidor de temperatura.

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