domingo, 28 de febrero de 2016

Arduino-Predicción del tiempo - BMP180

Arduino
Barómetro - Termómetro
Predicción del tiempo
GY-68    BMP-180
Parte 3


Para terminar con esta serie de artículos sobre el BMP-180, voy a intentar realizar un aparato de predicción del tiempo tomando como referencia la variación de la presión.
En este montaje mostramos la presión y la temperatura actual, y una gráfica de variación de la presión atmosférica.
En esta gráfica de la variación de la presión atmosférica se muestran 84 valores, tomados cada 15 minutos, que corresponden a 21 horas.
Para predecir el tiempo debemos interpretar la gráfica. Como yo no tengo los suficientes conocimientos, he tenido que buscar en internet información. Unas explicaciones sencillas que he encontrado son las siguientes:

Reglas de predicción casera

Si la presión desciende lentamente, por debajo del nivel normal de referencia (  unos 6 mm. cada 24 horas), la borrasca pasa lejos.
Si la presión desciende rápida ( 1 mm. cada hora), se acerca una profunda borrasca.
Si el barómetro sube lentamente por encima del valor normal, se afianza buen tiempo seco y encalmado, de anticiclón.
Si el barómetro sube muy bruscamente, la mejoría puede ser pasajera, por tratarse del paso de una dorsal anticiclónica entre dos borrascas.
En general, los cambios bruscos de presión -subida o bajada- son bastante indecisos para asegurar persistencia del tiempo. Habrá que seguir observando.
Las subidas de presión en zonas costeras o valles, donde el aire tiene mucha densidad incorporada, no siempre dan buen tiempo de cielo despejado y seco, ya que pueden formarse persistentes bancos de niebla. De ésto saben mucho ciudades como Zaragoza, Lérida, Valladolid, Salamanca… o bien Pontevedra, Bilbao, Barcelona…
El refranero popular  recoge el comportamiento del barómetro en expresiones como
    "Cuando sube la presión, te puedes ir de excursión"
    "Si la presión baja y viene mezquino, mejor quedarse en el casino"
    "Si baja y viene borrasca, puedes quedarte en la tasca"

Ya hemos indicado que no siempre es seguro  el asociar a la subida de la presión el buen tiempo, ni a su bajada el mal tiempo,  nubes, viento o lluvia … De ahí que los rótulos del barómetro no sean fiables. ¡ Si fuese todo tan fácil!


Donde 1 mm. = 4/3 mb. = 1,3 mb

Fuente:  http://www.tiempo.com/ram/150/adecuado-uso-del-barometro/#more-150



La regla general es:

-Si observamos una bajada de presión de menos de 1 milibar (o hectopascal) cada hora la borrasca pasará lejos y el viento será flojo o moderado.
-Si el descenso de presión es de 1 mb por hora, el tiempo irá empeorando a un ritmo mayor y el frente que se descuelga de la borrasca nos llegará a afectar. Viento moderado.
-Descensos de 1,5 a 2  mb por hora ya nos avisan de que el viento será fuerte y la mar empeorará rápido.
-Descensos de más de 2 mb por hora indican algo serio. Borrascas fuertes, galernas o ciclogénesis explosivas. Hay que tener cuidado en la mar.


Fuente: http://isocero.blogspot.com.es/2012/09/el-barometro.html

En nuestra gráfica muestra variaciones de presión respecto a la presión actual de 1 mb por unidad del eje Y , con un máximo de mas-menos 12 mb. En el eje X hay 84 unidades tomada cada 15 minutos, 21 horas.

Esquema del 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 3.3V, aunque funciona también a 5V, pero no he querido forzar el LCD.


Circuito montado.



Gráfica de lluvia.
Gráfica de mejora de tiempo.

Para el cálculo de la predicción utilizo los 16 últimos valores (4 horas), y según la variación de presión determino una predicción. No siempre es seguro  el asociar a la subida de la presión el buen tiempo, ni a su bajada el mal tiempo,  nubes, viento o lluvia. Para un mejor previsión  se debería tener en cuenta la temperatura y humedad, pero eso es tema de otro montaje.

Me acuerdo cuando mi madre me comentaba que iba a cambiar el tiempo cuando una escalera de piedra se humedecía.
Tenía mucha razón, el aumento de temperatura y humedad en contraste con la temperatura de la piedra, hacía que se condensara agua sobre la piedra. Esto casi siempre adelantaba un frente de agua.
También mi madre me comentaba que los cambios de luna traían un cambio de tiempo. Mi padre sobre esta cuestión tenía dudas, decía que si la luna cambiaba cada 7 días, alguna vez se tenía que acertar.

Hay muchos indicios sobre el cambio de tiempo en la naturaleza, y el que tengo como más fiable son las hormigas. Cuando el hormiguero se pone alborotado, y salen las hormigas voladoras, es un preludio de lluvias.



PROGRAMA


Saludos.
Juan Galaz

Bibliografía:

http://www.tiempo.com/ram/150/adecuado-uso-del-barometro/#more-150
https://prezi.com/2imcmqrc0mhk/como-se-predice-el-estado-del-tiempo/
http://isocero.blogspot.com.es/2012/09/el-barometro.html
http://www.eldiario.es/hojaderouter/ciencia/meteorologia-moviles-aplicaciones-tiempo-prediccion_0_284522231.html
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

domingo, 21 de febrero de 2016

Arduino power low. Termómetro máximos y mínimos con gráfica DS18B20 LCD Nokia PCD8544.

Página principal


Arduino
Termómetro máximos y mínimos con gráfica
DS18B20
LCD Nokia PCD8544
Atmega328 power low

Estaba realizando otro montaje para predecir el tiempo atmosférico y me salio este montaje, un termómetro con máximos y mínimos con gráficos. Debía crear una gráfica en un LCD PCD8544 para determinar la probabilidad de lluvia, y como sabeis me gusta realizar mis propias rutinas, y evitar cálculo con comas flotantes, además de intentar reducir lo máximo el tamaño del programa. Lo de reducir el tamaño del programa viene de lejos, cuando programaba micros y había que exprimir la poca memoria que había. La tendencia de la programación  de este tiempo, es utilizar librerías donde no se entiende lo que hacen, pero por lo contraría reducen el tiempo de desarrollo del proyecto aumentando considerablemente el tamaño del programa.
También he querido reducir lo máximo el consumo del circuito, para poder alimentarlo mediante pilas o baterías. Para esto he revisado dos de mis anteriores montajes , http://seta43.duckdns.org/ardurab.html  y  http://seta43.duckdns.org/arduraa.html  ,donde explico formas para poner en bajo consumo al arduino.
Como en muchos de mis montajes he querido poner todo el conjunto del programa en un único fichero, de esta forma no se necesita ninguna librería aparte.

El programa funciona de la siguiente manera:
  • Al iniciar el programa se realiza una toma de temperatura, colocando la temperatura máxima y mínima a dicho valor.
  • Se ponen a cero todos los valores de la gráfica.

En el bucle principal:
  • Se toma una temperatura, se muestra en el LCD.
  • Se compara con las temperaturas de máximos y mínimos par cambiar si es el caso.
  • Se calcula la diferencia  con el anterior valor de temperatura para añadirse a los valores de la gráfica.
  • El arduino se pone en modo de dormir hasta el próximo despertar, que está puesto a 1S.


Esquema del circuito.


Montaje de circuito. Fig. 1


Montaje de circuito. Fig. 2

void watchdogOn()

MCUSR = MCUSR & B11110111;
WDTCSR = WDTCSR | B00011000;
//WDTCSR = B00000101; //0.5S
WDTCSR = B00000110; //1S
//WDTCSR = B00100001; //8S

// Activa the watchdog timer interupt.
WDTCSR = WDTCSR | B01000000;
MCUSR = MCUSR & B11110111;
}
Si queremos modificar el tiempo en el cual el arduino se despierta para realizar una toma de temperatura,
modificamos la rutina watchdogOn() , donde existe 3 posibilidades 0,5mS , 1S y 8 Segundos.


Modelo
Voltios
Consumo
Arduino nano
3,31V
4,31mA
Arduino mini
2,4V
1mA
Arduino mini 3,3V
1,67mA(picos 8mA)
Arduino mini 5V
3,3mA(picos de 17mA)
Arduino mini 3V
1,4mA

Podemos observar que el consumo del arduino mini a 2,4V es de 1mA , aunque creo que podría ser menor si se quitan todos lo componentes que tiene el propio arduino.
Aún así alimentado el montaje con dos pilas de 1,5V y 1500mA, y haciendo una media de 1.2 mA, la autonomía es de alrededor de 52 días.

PROGRAMA

Saludos.
Juan Galaz


Bibliografía:
http://seta43.duckdns.org/ardurab.html
http://seta43.duckdns.org/arduraa.html
http://www.gammon.com.au/forum/?id=11497
http://www.surprisingedge.com/low-power-atmegatiny-with-watchdog-timer/
http://blog.dosbotones.com/2011/09/reducir-el-consumo-de-arduino.html
http://www.sparkfun.com/tutorials/309
http://interface.khm.de/index.php/lab/experiments/sleep_watchdog_battery/
http://www.engblaze.com/hush-little-microprocessor-avr-and-arduino-sleep-mode-basics/
http://www.fiz-ix.com/2012/11/low-power-arduino-using-the-watchdog-timer/
http://jeelabs.org/2009/05/16/power-consumption-more-savings/

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