InicioCiencia EducacionBarómetro y Termómetro con BMP085 y PIC

Barómetro y Termómetro con BMP085 y PIC



Modulo sensor de presión y temperatura BMP085 de la firma BOSCH.
Este es un sensor de prestaciones hogareñas, ya que los límites de presión y temperatura son estándar como para una estación meteorológica.
La presión a medir va de 30kPa a 110kPa
La altura (por conversión) es de -500m a 9000m
Bueno son algunos datos, la realidad es que si se quiere ver en detalle pueden descargar el datasheet donde encontraran una extensa cantidad de datos sobre este sensor.
El protocolo de comunicación es I2C, en este caso se aprovecha el puerto I2C del microcontrolador de forma nativa.
En nuestro ejemplo se ha utilizado un display de LCD pero es posible usar cualquier otra interfase de visualización.
El diagrama de bloques del programa esta detallado en el Datasheet del sensor, para aquellos que no les gusta programar van a tener un poco de problemas ya que Bosch decidió utilizar 11 variables de calibración, que deben calcularse en tiempo real para lograr una representación de la presión.
De todas formas esta todo escrito en el datasheet, las variables, los cálculos, la forma de leer este sensor, los bytes a enviar para accederlo y demás.

Circuito:



Calibración:



Algoritmo y Cálculos:



Programa:
Nótese que en la rutina de inicialización las variables que poseen una x minúscula son los resultados de los cálculos que se piden en el cuadro de arriba, pero los mismos están directamente como constante, esto se debe a que el hardware del microcontrolador utilizado queda corto para la cantidad de memoria necesaria para realizar todos los cálculos, por ende se han puesto solo los resultados, esto quita exactitud.
Si se utiliza un microcontrolador más potente sería recomendable utilizar los cálculos para que la exactitud sea óptima.

Para ampliar la exactitud debe reemplazar el bloque:


   xC3 = 0.00489*AC3;
   xC4 = 0.0000000306*AC4;
   xC5 = 0.000000191*AC5;
   xC6 = (float)AC6;
   xB1 = 0.0000238*B1;
   xMc = 0.0812*MC;
   xMd = (float)MD/160;  
   xX1 = (float)AC1;
   xX2 = 0.0195*AC2;
   xX3 = 0.000763*B2;  
   xY1 = xC4*32768;
   xY2 = xC4*xC3;
   xY3 = xC4*xB1;


por el bloque:


   xC3 = 160*pow(2,-15)*AC3;
   xC4 = pow(1,-3)*pow(2,-15)*AC4;
   xC5 = (pow(2,-15)/160)*AC5;
   xC6 = (float)AC6;
   xB1 = pow(160,2)*pow(2,-30)*B1;
   xMc = (pow(2,11)/25600)*MC;
   xMd = (float)MD/160;  
   xX1 = (float)AC1;
   xX2 = 160*pow(2,-13)*AC2;
   xX3 = pow(160,2)*pow(2,-25)*B2;  
   xY1 = xC4*pow(2,15);
   xY2 = xC4*xC3;
   xY3 = xC4*xB1;


y debe incluir la librería math.h, esto requiere de un microcontrolador mas potente.


#include <16F883.h>
#use delay(int=4000000)
#use i2c(master,sda=PIN_C4,scl=PIN_C3,FAST,FORCE_HW)
#include <lcd.c>
signed int16 AC1, AC2, AC3, B1, B2, MC, MD, MB;
int16 AC4, AC5, AC6;
float xC3, xC4, xB1, xC5, xC6, xMc, xMd, xX1, xX2;
float xY2, xY3, xS, xX3, xY1;
int8 DescargaByte_BMP085(int8 address){
   int8 datos;
   i2c_Start();
   i2c_write(0xEE);
   i2c_write(address);
   i2c_Start();
   i2c_write(0xEE|0x01);
   datos=i2c_read(0);
   i2c_Stop();
   return(datos);
}
int16 DescargaEntero_BMP085(int8 address){
   int16 ent;
   i2c_Start();
   i2c_write(0xEE);
   i2c_write(address);
   i2c_Start();
   i2c_write(0xEE|0x01);
   ent=make16(i2c_read(),i2c_read(0));
   i2c_Stop();
   return(ent);
}
void inicializa_BMP085(){
   AC1 = DescargaEntero_BMP085(0xAA);
   AC2 = DescargaEntero_BMP085(0xAC);
   AC3 = DescargaEntero_BMP085(0xAE);
   AC4 = DescargaEntero_BMP085(0xB0);
   AC5 = DescargaEntero_BMP085(0xB2);
   AC6 = DescargaEntero_BMP085(0xB4);
   B1  = DescargaEntero_BMP085(0xB6);
   B2  = DescargaEntero_BMP085(0xB8);
   MB  = DescargaEntero_BMP085(0xBA);
   MC  = DescargaEntero_BMP085(0xBC);
   MD  = DescargaEntero_BMP085(0xBE);
   xC3 = 0.00489*AC3;
   xC4 = 0.0000000306*AC4;
   xC5 = 0.000000191*AC5;
   xC6 = (float)AC6;
   xB1 = 0.0000238*B1;
   xMc = 0.0812*MC;
   xMd = (float)MD/160;  
   xX1 = (float)AC1;
   xX2 = 0.0195*AC2;
   xX3 = 0.000763*B2;  
   xY1 = xC4*32768;
   xY2 = xC4*xC3;
   xY3 = xC4*xB1;

int16 DescargaTemp_BMP085(){
   i2c_Start();
   i2c_write(0xEE);
   i2c_write(0xF4);
   i2c_write(0x2E);
   i2c_Stop();
   delay_ms(5);
   return((float)DescargaEntero_BMP085(0xF6));
}
int32 DescargaPres_BMP085(){
   i2c_Start();
   i2c_write(0xEE);
   i2c_write(0xF4);
   i2c_write(0x34+(3<<6));
   i2c_Stop(); 
   delay_ms(26);
   return((256*DescargaByte_BMP085(0xF6))+
               DescargaByte_BMP085(0xF7)+
          (DescargaByte_BMP085(0xF8)/256));
}
float LeeTemperatura_BMP085(float tempeAux){
   float Conversor, Temperatura;
   Conversor=xC5*(tempeAux-xC6);
   Temperatura=Conversor+(xMc/(Conversor+xMd));
   xS=Temperatura-25;
   return(Temperatura);
}  
float LeePresion_BMP085(float presAux){
   float auxA, auxB, auxC;
   float Presion;
   auxA=xX3*xS*xS+xX2*xS+xX1;
   auxB=xY3*xS*xS+xY2*xS+xY1;
   auxC=((float)presAux-auxA)/auxB;
   Presion=0.0000045*auxC*auxC+0.994*auxC+2.37;
   Presion+=4.58;
   return(Presion);
}
void main(){
   lcd_init();
   inicializa_BMP085();
   while(true){
      lcd_gotoxy(1,1);
      printf(lcd_putc,"T[c]: %.1g  n",LeeTemperatura_BMP085(DescargaTemp_BMP085()));
      lcd_gotoxy(1,2);
      printf(lcd_putc,"P[mBar]: %0.2g  n",LeePresion_BMP085(DescargaPres_BMP085()));
      delay_ms(500);
   }
}
Datos archivados del Taringa! original
15puntos
65visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
3visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

s
sebabjt84🇦🇷
Usuario
Puntos0
Posts60
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.