Advertisement
Electgpl

PIC - Medidor de Presion y Temperatura con BMP085

Jun 19th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. #include <16F883.h>
  2. #use delay(int=4000000)
  3. #use i2c(master,sda=PIN_C4,scl=PIN_C3,FAST,FORCE_HW)
  4. #include <lcd.c>
  5. signed int16 AC1, AC2, AC3, B1, B2, MC, MD, MB;
  6. int16 AC4, AC5, AC6;
  7. float xC3, xC4, xB1, xC5, xC6, xMc, xMd, xX0, xX1;
  8. float xY1, xY2, xP0, xP1, xP2, xS, xX2, xY0;
  9.  
  10. int8 DescargaByte_BMP085(int8 address){
  11.    int8 datos;
  12.    i2c_Start();
  13.    i2c_write(0xEE);
  14.    i2c_write(address);
  15.    i2c_Start();
  16.    i2c_write(0xEE|0x01);
  17.    datos=i2c_read(0);
  18.    i2c_Stop();
  19.    return(datos);
  20. }
  21. int16 DescargaEntero_BMP085(int8 address){
  22.    int16 ent;
  23.    i2c_Start();
  24.    i2c_write(0xEE);
  25.    i2c_write(address);
  26.    i2c_Start();
  27.    i2c_write(0xEE|0x01);
  28.    ent=make16(i2c_read(),i2c_read(0));
  29.    i2c_Stop();
  30.    return(ent);
  31. }
  32. void inicializa_BMP085(){
  33.    AC1 = DescargaEntero_BMP085(0xAA);
  34.    AC2 = DescargaEntero_BMP085(0xAC);
  35.    AC3 = DescargaEntero_BMP085(0xAE);
  36.    AC4 = DescargaEntero_BMP085(0xB0);
  37.    AC5 = DescargaEntero_BMP085(0xB2);
  38.    AC6 = DescargaEntero_BMP085(0xB4);
  39.    B1  = DescargaEntero_BMP085(0xB6);
  40.    B2  = DescargaEntero_BMP085(0xB8);
  41.    MB  = DescargaEntero_BMP085(0xBA);
  42.    MC  = DescargaEntero_BMP085(0xBC);
  43.    MD  = DescargaEntero_BMP085(0xBE);
  44.    xC3 = 0.00489*AC3;
  45.    xC4 = 0.0000000306*AC4;
  46.    xC5 = 0.000000191*AC5;
  47.    xC6 = (float)AC6;
  48.    xB1 = 0.0000238*B1;
  49.    xMc = 0.0812*MC;
  50.    xMd = (float)MD/160;  
  51.    xX0 = (float)AC1;
  52.    xX1 = 0.0195*AC2;
  53.    xX2 = 0.000763*B2;  
  54.    xY0 = xC4*32768;
  55.    xY1 = xC4*xC3;
  56.    xY2 = xC4*xB1;
  57. }  
  58. int16 DescargaTemp_BMP085(){
  59.    i2c_Start();
  60.    i2c_write(0xEE);
  61.    i2c_write(0xF4);
  62.    i2c_write(0x2E);
  63.    i2c_Stop();
  64.    delay_ms(5);
  65.    return((float)DescargaEntero_BMP085(0xF6));
  66. }
  67. int32 DescargaPres_BMP085(){
  68.    i2c_Start();
  69.    i2c_write(0xEE);
  70.    i2c_write(0xF4);
  71.    i2c_write(0x34+(3<<6));
  72.    i2c_Stop();  
  73.    delay_ms(26);
  74.    return((256*DescargaByte_BMP085(0xF6))+
  75.                DescargaByte_BMP085(0xF7)+
  76.           (DescargaByte_BMP085(0xF8)/256));
  77. }
  78. float LeeTemperatura_BMP085(float tempeAux){
  79.    float Conversor, Temperatura;
  80.    Conversor=xC5*(tempeAux-xC6);
  81.    Temperatura=Conversor+(xMc/(Conversor+xMd));
  82.    xS=Temperatura-25;
  83.    return(Temperatura);
  84. }  
  85. float LeePresion_BMP085(float presAux){
  86.    float auxA, auxB, auxC;
  87.    float Presion;
  88.    auxA=xX2*xS*xS+xX1*xS+xX0;
  89.    auxB=xY2*xS*xS+xY1*xS+xY0;
  90.    auxC=((float)presAux-auxA)/auxB;
  91.    Presion=0.0000045*auxC*auxC+0.994*auxC+2.37;
  92.    Presion+=4.58;
  93.    return(Presion);
  94. }
  95. void main(){
  96.    lcd_init();
  97.    inicializa_BMP085();
  98.    while(true){
  99.       lcd_gotoxy(1,1);
  100.       printf(lcd_putc,"T[c]: %.1g  \n",LeeTemperatura_BMP085(DescargaTemp_BMP085()));
  101.       lcd_gotoxy(1,2);
  102.       printf(lcd_putc,"P[mBar]: %0.2g  \n",LeePresion_BMP085(DescargaPres_BMP085()));
  103.       delay_ms(500);
  104.    }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement