Noticias:

Grupo en telegram, del foro de meteorología fácil: https://t.me/meteorologiafacil

Para mas detalles, puedes visitar el siguiente tema http://www.meteorologiafacil.com.ar/foros/index.php?topic=1608.0

Espero que les sea de mucha utilidad.

Menú Principal

Sensor BMP180

Iniciado por guillermoc, Octubre 06, 2018, 10:23:26 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

guillermoc

Hola a todos, hace un tiempo me había registrado pero no pude hacer nada sobre mi humilde estación meteo, en el medio partió mi padre jubilado meteorólogo de profesión, hoy quiero retomar lo hecho hasta acá, yo programo PIC´s en CCs y mi estación usa el DS18B20 y el DHT11 para medir temperatura y humedad respectivamente, quiero agregar un sensor de presión atmosférica BMP180 pero no logro encontrar por ningún lado las librerías que me permitan usarlo, existen para PIC? porque yo solo encuentro para Arduino y ya no se donde ni como buscar, vi que hay aquí un proyecto .jal que usa este sensor y comentan que lo comprobaron con CCs. podrían ayudarme a obtener esa librería o explicarme de que forma lo puedo usar. Agradezco enormemente vuestra ayuda. Yo vivo en General Pico, provincia de La Pampa. Saludos Cordiales.

Ricber

#1
Hola Marcelo, lamento lo de tu padre, te paso la libreria que yo usaba e ccs.
aqui estan las rutinas de calibracion y de comunicacion.
Aca no hay que tocar nada solo asignar los pines que vas a usar en la comunicacion
eso se hace en la linea #use i2c.......

// place a #use i2c statement in the main program and comment this out if not applicable
#use i2c(master, sda=PIN_C4, scl=PIN_C3, FAST, FORCE_HW)

#include <math.h>

const int8 OVS_S = 3; // Oversampling Setting (0,1,2,3 from ultra low power, to ultra hi-resolution)

#define BMP085_ADDRESS 0xEE          // I2C address of BMP085
#define P_CORRECTION   1.5           // in mBars - factor to adjust for elevation to match local weather station pressure
                                     // this value for 14' above sea level (in Boca Raton, Florida)


// Calibration values
signed int16 ac1;
signed int16 ac2;
signed int16 ac3;
int16 ac4;
int16 ac5;
int16 ac6;
signed int16 b1;
signed int16 b2;
signed int16 mb;
signed int16 mc;
signed int16 md;

// floating point cal factors
float _c3;
float _c4;
float _b1;
float _c5;
float _c6;
float _mc;
float _md;

// polynomomial constants
float _x0;
float _x1;
float _x2;
float _y0;
float _y1;
float _y2;
float _p0;
float _p1;
float _p2;

float _s;     // T-25, used in pressure calculation - must run temperature reading before pressure reading
float _Temp;  // set after every temperature or temperature/pressure reading


//----------------------------------------------
int8 BMP085ReadByte(int8 address)
//----------------------------------------------
{
int8 data;

   i2c_start();
   i2c_write(BMP085_ADDRESS);
   i2c_write(address);
   i2c_start();
   i2c_write(BMP085_ADDRESS | 0x01 );
   data=i2c_read(0);
   i2c_stop();
   return(data);
}


//----------------------------------------------
int16 BMP085ReadInt(int8 address)
//----------------------------------------------
{
int8 msb, lsb;
int16 temp;

   i2c_start();
   i2c_write(BMP085_ADDRESS);
   i2c_write(address);
   i2c_start();
   i2c_write(BMP085_ADDRESS | 0x01 );
   msb = i2c_read();
   lsb = i2c_read(0);
   i2c_stop();
   temp = make16(msb, lsb);
   return ( temp );
}


//----------------------------------------------
void BMP085WriteByte(int8 address, int8 data)
//----------------------------------------------
{
   i2c_start();
   i2c_write(BMP085_ADDRESS);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
}


//----------------------------------------------
void bmp085Calibration()
//----------------------------------------------
{
   // read BMP085 EEPROM cal factors
   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 floating point cal factors
   _c3 = 0.0048828125 * ac3;            // 160 * pow2(-15) * ac3;
   _c4 = 0.000000030517578125 * ac4;    // 1E-3 * pow2(-15) * ac4;
   _c5 = 0.00000019073486328125 * ac5;  // (pow2(-15)/160) * ac5;
   _c6 = (float)ac6;
   _b1 = 0.00002384185791015625 * b1;   // 25600 * pow2(-30) * b1;
   _mc = 0.08 * mc;                     // (pow2(11) / 25600) * mc;
   _md = (float)md / 160;
   
   // calculate polynomial constants
   _x0 = (float)ac1;
   _x1 = 0.01953125 * ac2;             // 160 * pow2(-13) * ac2;
   _x2 = 0.000762939453125 * b2;       // 25600 * pow2(-25) * b2;
   _y0 = _c4 * 32768;                  //_c4 * pow2(15);
   _y1 = _c4 * _c3;
   _y2 = _c4 * _b1;
   _p0 = 2.364375; 
   _p1 = 0.992984;
   _p2 = 0.000004421;   
}


// Read the uncompensated temperature value
//----------------------------------------------
int16 BMP085ReadUT()
//----------------------------------------------
{
int16 ut;
 
  // Write 0x2E into Register 0xF4
  BMP085WriteByte(0xF4, 0x2E);
  delay_ms(5); // Wait at least 4.5ms
  // Read two bytes from registers 0xF6 and 0xF7
  ut = BMP085ReadInt(0xF6);
  return((float)ut);
}


// Read the uncompensated pressure value
//----------------------------------------------
int32 bmp085ReadUP()
//----------------------------------------------
{
int8 msb, lsb, xlsb;
float p;
 
  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  BMP085WriteByte(0xF4, (0x34 + (OVS_S<<6)) );
 
  // Wait for conversion, delay time dependent on OSS
  switch (OVS_S)
  {
     case 0: delay_ms(5);  break;
     case 1: delay_ms(8);  break;
     case 2: delay_ms(14); break;
     case 3: delay_ms(26); break;
  }   
 
  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
   msb  = BMP085ReadByte(0xF6);
   lsb  = BMP085ReadByte(0xF7);
   xlsb = BMP085ReadByte(0xF8);
   p = (256*msb) + lsb + (xlsb/256);
   return(p);
}


//----------------------------------------------
float BMP085GetTemp(float _tu)
//----------------------------------------------
{
float alpha, T;

   alpha = _c5 * (_tu - _c6);
   T = alpha + (_mc/(alpha + _md));
   _s = T - 25;
   return(T);
}   


//----------------------------------------------
float BMP085GetPressure(float _pu)
//----------------------------------------------
{
float x, y, z;
float P;

   x = _x2*_s*_s + _x1*_s + _x0;
   y = _y2*_s*_s + _y1*_s + _y0;
   z = ((float)_pu - x) / y;
   P = _p2*z*z + _p1*z + _p0;
   P += P_CORRECTION;
   return(P);
}


//----------------------------------------------
float BMP085Pressure(boolean getTemp)
//----------------------------------------------
{
   if (getTemp)
      _Temp = BMP085GetTemp(BMP085ReadUT());  // creates _s required for pressure calculation
   return(BMP085GetPressure(BMP085ReadUP()));
}


//----------------------------------------------
float BMP085Temperature(void)
//----------------------------------------------
{
   _Temp = BMP085GetTemp(BMP085ReadUT());
   return(_Temp);
}



Ricber

Luego para saber la presion tenes que usar esta linea en el main.

   bmp085Calibration(); primero la caibracion
 

      T_Cent = BMP085Temperature();
      P_mBar = BMP085Pressure(false);   

para que pueda leer la presion primero hay que hacer una medicion de la temperatura
por eso van las dos lineas.
Bueno creo que eso es todo espero haberte podido ayudar.
cualquier problema avisanos que lo vamos viendo.
Mucha suerte y segui adelante con este proyecto que en algun momento
todo empieza a funcionar.
Un abarazo

David Met

Hola Guile.
Interrumpo solo para darte mi más sincero pésame.

Abrazos.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.