viernes, 23 de diciembre de 2011

EST. METEO CON ARDUINO: EL BARÓMETRO

Buenas noches, aprovechando que hoy comienzo las vacaciones en el trabajo y que tengo los exámenes listos, voy a poder aprovechar unos días para meterme con el Arduino (y esperando que llegue mi nuevo pedido ;)
Pues nada, hoy vamos a meterle mano al barómetro, un sensor integrado en una pequeña placa, de la casa Sparkfun, el conodio BMP-085. Este sensor, según tengo entendido, es muy usado en robótica y en UAVs para determinar variaciones de altura por su extrema precisión. A nosotros nos hará otro habio....

El sensor se puede encontrar en varias web online de España, yo lo compre en http://www.bricogeek.com/shop/ y que decir, buen precio, trato esquisto, y al día siguiente de pedirlo lo tenia en casa.

El montaje de este sensor lo saqué de http://bildr.org/2011/06/bmp085-arduino/

Pues nada, poca explicación, com dije en su día, no quiero meterme en explicaciones de datos técnicos, ni en cosas raras, sino directamente en la esencia, en el funcionamiento del sensor.

El montaje realizado por mi es el siguiente:
Unicamente, voy a especificar las conexiones, puesto que en la fotografía no aparecen:

Detalle IMPORTANTE: LA ALIMENTACION DEL SENSOR ES A 3,3 VOLTIOS, NUNCA A 5 V!!

El pin analógico 4 va a SDA, el pin analógico 5 a SCL, GND a GND y VCC a 3,3 Voltios.

Aparte del sensor, tengo conectada una pantalla Sparkfun SerialLCD de 16x2 lineas, que solamente tiene tres conexiones: RX, que va conectada al pin TX de Arduino, GND a GND y VCC a los 5 Voltios de la placa. Se controla totalmente por software, así, le he podido poner la retroiluminacion al mínimo para poder usar el montaje con una pequeña batería Li-PO o Ni-MH, y hacer pruebas en la estación meteorológica.

A continuación una fotografía de como queda provisionalmente el montaje:


Aquí os dejo el código, tomado de la pagina anterior, Bildr, y modificado por mi para mostrar lo que me interesa en el LCD, y poder calibrar la presión a nivel del mar según la altura a la que me encuentro. Tengo que limpiar la parte que no se va a usar, para ahorrar espacio a la hora de cargarlo en el Arduino, y para dejar el código lo más limpio posible.



/*Based largely on code by  Jim Lindblom

  Get pressure, altitude, and temperature from the BMP085.
  Serial.print it out at 9600 baud to serial monitor.
*/

#include <Wire.h>

#define BMP085_ADDRESS 0x77  // I2C address of BMP085

const unsigned char OSS = 0;  // Oversampling Setting

// Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
long b5; 

void setup(){
  Serial.begin(9600);
  Wire.begin();

  bmp085Calibration();
}

void loop()
{  
  float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
  float pressure = bmp085GetPressure(bmp085ReadUP());
  float atm = pressure / 101325; // "standard atmosphere"
  float altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters 

  selectLineOne();
  Serial.print("Baro: ");
  Serial.print(pressure/100, 1); // correccion +1 milibatr y un decimal
  Serial.print(" mB");

  selectLineTwo();
  Serial.print("Temp:   ");
  Serial.print(temperature - 2, 1 ); //correccion (-2) y un decimal
  Serial.print(" ");
  Serial.print((char)223); // simbolo de grado celsius
  Serial.print("C");
  


  delay(15000);
}
void selectLineOne(){  //puts the cursor at line 0 char 0.
   Serial.print(0xFE, BYTE);   //command flag
   Serial.print(128, BYTE);    //position
   delay(10);
}
void selectLineTwo(){  //puts the cursor at line 0 char 0.
   Serial.print(0xFE, BYTE);   //command flag
   Serial.print(192, BYTE);    //position
   delay(10);
}
void backlightOn(){  //turns on the backlight
    Serial.print(0x7C, BYTE);   //command flag for backlight stuff
    Serial.print(130, BYTE);    //NIVEL DE ILUMINACION AL MINIMO
   delay(10);
}

// Stores all of the bmp085's calibration values into global variables
// Calibration values are required to calculate temp and pressure
// This function should be called at the beginning of the program
void bmp085Calibration()
{
  ac1 = bmp085ReadInt(0xAA);
  ac2 = bmp085ReadInt(0xAC);
  ac3 = bmp085ReadInt(0xAE);
  ac4 = bmp085ReadInt(0xB0);
  ac5 = bmp085ReadInt(0xB2);
  ac6 = bmp085ReadInt(0xB4);
  b1 = bmp085ReadInt(0xB6);
  b2 = bmp085ReadInt(0xB8);
  mb = bmp085ReadInt(0xBA);
  mc = bmp085ReadInt(0xBC);
  md = bmp085ReadInt(0xBE);
}

// Calculate temperature in deg C
float bmp085GetTemperature(unsigned int ut){
  long x1, x2;

  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  x2 = ((long)mc << 11)/(x1 + md);
  b5 = x1 + x2;

  float temp = ((b5 + 8)>>4);
  temp = temp /10 - 1.5;

  return temp;
}

// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up){
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;

  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;

  // Calculate B4
  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6 * b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;

  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
  p += (x1 + x2 + 3791)>>4;

  long temp = p;
  return temp;
}

// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
  unsigned char data;

  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(address);
  Wire.endTransmission();

  Wire.requestFrom(BMP085_ADDRESS, 1);
  while(!Wire.available())
    ;

  return Wire.receive();
}

// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;

  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(address);
  Wire.endTransmission();

  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2)
    ;
  msb = Wire.receive();
  lsb = Wire.receive();

  return (int) msb<<8 | lsb;
}

// Read the uncompensated temperature value
unsigned int bmp085ReadUT(){
  unsigned int ut;

  // Write 0x2E into Register 0xF4
  // This requests a temperature reading
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(0xF4);
  Wire.send(0x2E);
  Wire.endTransmission();

  // Wait at least 4.5ms
  delay(5);

  // Read two bytes from registers 0xF6 and 0xF7
  ut = bmp085ReadInt(0xF6);
  return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP(){

  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;

  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(0xF4);
  Wire.send(0x34 + (OSS<<6));
  Wire.endTransmission();

  // Wait for conversion, delay time dependent on OSS
  delay(2 + (3<<OSS));

  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  msb = bmp085Read(0xF6);
  lsb = bmp085Read(0xF7);
  xlsb = bmp085Read(0xF8);

  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);

  return up;
}

void writeRegister(int deviceAddress, byte address, byte val) {
    Wire.beginTransmission(deviceAddress); // start transmission to device 
    Wire.send(address);       // send register address
    Wire.send(val);         // send value to write
    Wire.endTransmission();     // end transmission
}

int readRegister(int deviceAddress, byte address){

    int v;
    Wire.beginTransmission(deviceAddress);
    Wire.send(address); // register to read
    Wire.endTransmission();

    Wire.requestFrom(deviceAddress, 1); // read a byte

    while(!Wire.available()) {
        // waiting
    }

    v = Wire.receive();
    return v;
}

float calcAltitude(float pressure){

  float A = pressure/101325;
  float B = 1/5.25588;
  float C = pow(A,B);
  C = 1 - C;
  C = C /0.0000225577;

  return C;
}




martes, 20 de diciembre de 2011

Primera mínima absoluta bajo cero del año Estación Almargen

Buenas!
Hoy día 20 de diciembre, se ha alcanzado una temperatura mínima de -1,9ºC , la temperatura mínima más baja (valga la redundancia), de lo que llevamos de año. Respecto a la mínima anterior de este año, en febrero, se ha superado en mas de medio grado, aunque no es mucho, si es significativo. También se ha superado, en 1,1ºC esta mínima, que el día 16 de diciembre de 2010 fué de 0,8ºC. Esperamos sea un buen fin de año con bastantes bajo cero, que para nosotros los aficionados, es sinónimo de "buen tiempo".


  • Gráfica de temperatura mínima (no oficial, est. meteorólogica automática) de DICIEMBRE-10



  • Gráfica de temperatura mínima (no oficial, est. meteorólogica automática) de DICIEMBRE-11



domingo, 18 de diciembre de 2011

ESTACION METEOROLOGICA DE ALMARGEN Parte 2, la Estación Automática

Buenas noches de nuevo. Pues vamos a seguir, al menos, mientras me dejen estos ratitos libres. Vamos a continuar con la estación meteorológica de aficionado, una Davis Vantage Pro 2, fabricada en Estados Unidos, y muy apreciada por nosotros los aficionados. En lineas generales, se compone de un conjunto de sensores integrado (ISS en Inglés), un anemómetro, una consola donde se muestran los datos y donde se conecta el datalogger, una pequeña pieza que tiene dos misiones, el almacenaje de datos, y la carga de estos a un ordenador. Básicamente hay dos modelos, el modelo inalámbrico, cuya consola está separada del conjunto de sensores, y la otra, cuyo modelo es el que yo tengo, es la cableada, cuyos sensores están unidos por un cable de tipo telefónico de 30 metros (ampliable, si mal no recuerdo, hasta 300), con la consola. Me decanté por este modelo, entre otras cosas, por ser mas económica, poderla colocar sin molestias del cable, y mayor fiabilidad en cuanto a interferencias. 
Pues vamos a ver una fotografía comercial de la estación:

Podemos ver, la consola (en este caso inalambrica), el ISS, que contiene al pluviometro y al sensor de temperatura y humedad en el protector de platos que se ve, y el anemometro y veleta, con 15 metros de cable tipo telefonico.
Os enseño a continuación alguna fotografía de mi estación, para que veáis como está instalada.

En esta primera fotografia, se muestra junto a los dos pluviómetros homologados. Se comparan diariamente los datos de lluvia de la estación con los dos pluviómetros, para que no haya datos raros ni nada extraño (siempre varían, nunca dos pluviómetros idénticos estando boca con boca, van a marcar lo mismo, nunca llueve uniformemente). La boca del pluviómetro, se encuentra a 1,50 metros de la superficie, y el sensor de temperatura y humedad, a 1,20, como marca el protocolo de la Organización Meteorologica Mundial. El terreno cubierto de hierba corta es para evitar la reflexión de radiación solar y aire recalentado, no nos interesa medir el aire caliente del suelo, sino la temperatura real del aire. Hay polémica entre los expertos en este aspecto, debido a que la hierba no es algo autóctono del lugar, no es lo mismo poner hierba en Holanda que hacerlo en el desierto del Sahara, donde poca hierba se puede encontrar, y esto puede falsear las medidas.
El sensor está encerrado en esa garita de platos, muy efectiva, y muy buscada entre los aficionados por su fiabilidad en todo tipo de condiciones.

 En esta otra foto anterior, vemos la puntera de la torre de anemómetros, que está situada a 10 metros sobre el suelo. El anemómetro superior es el de la estación automática, que esta conectado por cable con el ISS (visto en el anterior apartado). La estación toma un dato de viento cada 2,5 segundos. Un poco mas abajo está la veleta SEAC, solamente para uso visual, pero sensible con la mínima brisa, y un anemómetro de recorrido INSPEED, que nos dice el recorrido enkilometros diarios.




Por ultimo, este es el sensor de radiacion solar, colcado en un brazo sobre la torreta, con el fin de colocarlo lo mas al sur posible de toda la instalacion. Con esto se consigue que en todo el dia, no reciba ninguna sombra de ninngun objeto, como puede ser edificios, arboles, la prpia torreta. Este sensor mide en Watios por metro cuadrado, y es de especial interes para personas que quieren poner instalaciones solares, contabilizar las horas de luz anuales, estudios ambientales, medicion de la evaporacion....

Pues nada mas en este momento, hare en cuanto pueda unas fotos detalladas del resto de partes de la estacion, como la consola, el pc al cual esta conectada, imagenes del programa...

Gracias por vuestra atencion una vez mas!

viernes, 16 de diciembre de 2011

ESTACION METEOROLOGICA DE ALMARGEN, 6112-C AEMET. Parte 1, GENERALIDADES

Buenas noches, voy a proceder a publicar una serie de entradas, de como funciona una estación meteorológica, en mi caso, la que yo gestiono, una estación TERMO-PLUVIOMÉTRUCA, homologada por la AGENCIA ESTATAL DE METEOROLOGÍA (de ahora en adelante, AEMET). Intentaré ser claro, sin salirme de la senda del usuario normalito, nada de tecnicismos.

En esta primera parte, vamos a ver la composición exterior de la estación, sus datos, características, y algunas generalidades.

La estacion manual lleva en funcionamiento desde julio de 2009, en un terreno familiar conocido como Las Alvinas, a 1,5 kilómetros en linea recta de la localidad de Almargen. Al estar en tan cercana localización, y prácticamente a la misma altura, los datos son perfectamente extrapolables al pueblo.

Desde julio de 2009, hasta el día de hoy, no hemos fallado en ni una sola de las mediciones diarias que se realizan a las 08:00 hora UTC (universal time coordinated, que coincide con las 9 en horario de invierno y con las 10 de la mañana en horario de verano oficial en españa). Esto supone mas de mil registros por ahora en este corto tiempo, aun insuficientes para poder tener una serie meteorológica como las de muchas estaciones con 25 años de datos.

En mayo de 2010, dos técnicos de AEMET, de desplazaron al pueblo, midieron coordenadas de situación, altura, y realizando fotografías. Se le asigno el numero 6112-C

Vamos a ver una fotografía del exterior de la estacion.

Podemos apreciar, entre otros:
  • Garita meteorológica (abrigo): contiene en su interior los instrumentos encargados de medir la temperatura (máxima, mínima y actual), el psicrómetro (humedad relativa del aire), el Higro-Termografo (dibuja gráficamente la temperatura y humedad de forma continua durante 7 dias, se cambia semanalmente la banda), y el evaporímetro de Piché, para medir la evapotranspiración.
  • Pluviometro Homologado modelo Hellmann 200, con 200 litros por metro cuadrado (milimetros) de capacidad. Se mide mediante una probeta que guardo en la garita, graduada para el diametro de dicho pluviómetro.
  • Estacion Automatica: ISS (Integrated Sensor Suite, conjunto de sensores integrados) de la estación meteorologica automática de aficionado Davis Vantage Pro2. En este conjunto se encuentran los siguientes sensores. Pluviometro automático y sensor de temperatura y humedad (TH), protegido por un abrigo de platos. A este conjunto, se une el sensor de radiación solar y el anemómetro. Veremos detenidamente esta estación, puesto que es interesante, y es el encargado de subir los datos a la pagina web cada 5 minutos (www.meteoalmargen.es).
  • Termometro de minima de suelo: es un termometro homologado de mínimas, situado a 15 cm del suelo, sobre una placa protectora. Su misión es medir el enfriamiento de la capa mas baja de aire, responsable de formación de helada, rocio... a veces, en noches sin nubes de invierno, la diferencia con el termómetro de la garita puede ascender a varios grados, habiendo llegado a medir mas de -5ºC
  • Torreta de viento: Situado a un metro del recinto de la estación, es una torreta cuyo extremo está a 10 metros sobre el nivel del suelo. En este punto, esta situado el anemómetro de la estación automática, así como la veleta, la antena de enlace wifi para subir los datos, conectada con el Ayuntamiento de Almargen, agradeciendo a Francisco Capote Gaspar, Concejal y Amigo personal, su ayuda prestada (@fcapote). A una altura un poco inferior, hay una veleta y un anemómetro de precisión SEAC, pero solo para uso visual, sin estar conectado a nada. Un poco mas abajo, a 2,5 metros, esta el sensor de radiación solar de la estación Davis Vantage Pro2. 
El recinto donde está situada la estación, es un pequeño trozo de 4 x 6 metros, libre de obstáculos a los cuatro vientos, y cubierto con hierba corta, como marca las directrices de la Organización Meteorológica Mundial. La garita así como el sensor de la estación automática están situados a 1,20 metros de altura. Las bocas de los pluviómetros, a 1,5 metros, y el sensor de viento, anemómetro y veleta, a 10 metros. Asi se cumplen las recomendaciones dichas anteriormente.

jueves, 15 de diciembre de 2011

CREACION DE UNA ESTACION AUTOMATICA CON ARDUINO

Bueno, pues me propuse crear una estación meteorológica automática desde cero (relativamente, comprando los sensores :) , basada en el microcontrolador ARDUINO (www.arduino.cc), aprovechando la potencia de este, la cantidad de códigos y ejemplos que circulan por internet, la bestialidad de sensores de todo tipo que se le pueden conectar (meteorológicos, GPS, radiación, acelerometros, potenciometros, displays...), muchísimos medios de transmisión (radiofrecuencia, bluetooth, WiFi, Xbee....). En mi caso, he comenzado por conectar un anemómetro INSPEED, un sensor de temperatura LM335A, y un sensor de presión barométrica  (y temperatura) BMP-0085, para mostrar todo por un display (ahora mismo en uno de 16x2 caracteres, a la espera de implementarlo en uno gráfico de 128x64 píxeles).
He conseguido leer cada sensor por separado y mostrarlo, ahora, el siguiente paso es poder unificar todos los sensores para trabajar con ellos a la vez, y poder monitorizarlos en el mismo display.... Esto tiene futuro :)

Saludos

Buenas tardes. He creado este blog para publicar todo tipo de entradas relacionadas con una de mis aficiones, la meteorología, y sus múltiples variantes asociadas, electrónica, gestión de datos.....
iré añandiendo y modificando todo tipo de datos, fotografías, y demás cosas que considero de interés (en la medida que el poco tiempo libre que tengo me deje.....)

Gracias