I2C interface of Bosch BMP085 pressure/temperature sensor.

Committer:
davernm
Date:
Sat Apr 13 21:55:24 2013 +0000
Revision:
0:de9de5beb7af
Child:
1:30d98c558b29
A library for the Bosch BMP085 pressure/temperature sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davernm 0:de9de5beb7af 1 /*
davernm 0:de9de5beb7af 2 // Test code:
davernm 0:de9de5beb7af 3 //
davernm 0:de9de5beb7af 4 //
davernm 0:de9de5beb7af 5 //
davernm 0:de9de5beb7af 6 //
davernm 0:de9de5beb7af 7 //this program uses a ticker to read the BMP085 every 5 seconds and updates the lcd with
davernm 0:de9de5beb7af 8 //the pressure and temperature reading
davernm 0:de9de5beb7af 9
davernm 0:de9de5beb7af 10 #include "mbed.h"
davernm 0:de9de5beb7af 11 #include "TextLCD.h"
davernm 0:de9de5beb7af 12 #include "bmp085.h"
davernm 0:de9de5beb7af 13
davernm 0:de9de5beb7af 14
davernm 0:de9de5beb7af 15 void doConv(void);
davernm 0:de9de5beb7af 16 void dispVals(long T,long P);
davernm 0:de9de5beb7af 17
davernm 0:de9de5beb7af 18 //Three different constructors:
davernm 0:de9de5beb7af 19
davernm 0:de9de5beb7af 20 BMP085 X(p28,p27,p5,3);//create an instance,using an EOC pin and oss set to 3
davernm 0:de9de5beb7af 21 //BMP085 X(p28,p27,3);//create an instance without an EOC pin, oss 3
davernm 0:de9de5beb7af 22 //BMP085 X(p28,p27);//create an instance, no EOC, oss will default to 0
davernm 0:de9de5beb7af 23 TextLCD lcd(p7, p6, p8, p9, p10, p11);
davernm 0:de9de5beb7af 24
davernm 0:de9de5beb7af 25 Ticker myT;
davernm 0:de9de5beb7af 26
davernm 0:de9de5beb7af 27 int main() {
davernm 0:de9de5beb7af 28
davernm 0:de9de5beb7af 29 myT.attach(&doConv,5); //every 5 seconds
davernm 0:de9de5beb7af 30 X.readCal(); //read calibration data
davernm 0:de9de5beb7af 31 doConv(); //call once
davernm 0:de9de5beb7af 32 while(1)
davernm 0:de9de5beb7af 33 {
davernm 0:de9de5beb7af 34 //do something
davernm 0:de9de5beb7af 35 }
davernm 0:de9de5beb7af 36
davernm 0:de9de5beb7af 37
davernm 0:de9de5beb7af 38 }
davernm 0:de9de5beb7af 39
davernm 0:de9de5beb7af 40
davernm 0:de9de5beb7af 41 void dispVals(long T,long P)//display data on the lcd
davernm 0:de9de5beb7af 42 {
davernm 0:de9de5beb7af 43 lcd.locate(0,0); //lcd line 1
davernm 0:de9de5beb7af 44
davernm 0:de9de5beb7af 45 char buf[20],*P1="Temp:",*P2="Press:";
davernm 0:de9de5beb7af 46 lcd.printf(P2);
davernm 0:de9de5beb7af 47 lcd.locate(strlen(P2),0);
davernm 0:de9de5beb7af 48 float p=(float)P;
davernm 0:de9de5beb7af 49 p/=100;//convert to milli bar
davernm 0:de9de5beb7af 50 sprintf(buf,"%.2f",p);
davernm 0:de9de5beb7af 51 lcd.printf("%s",buf);
davernm 0:de9de5beb7af 52
davernm 0:de9de5beb7af 53 lcd.locate(0,1); // lcd line 2
davernm 0:de9de5beb7af 54 lcd.printf(P1);
davernm 0:de9de5beb7af 55 float t=(float)T;
davernm 0:de9de5beb7af 56 t/=10;//convert to deg C
davernm 0:de9de5beb7af 57 sprintf(buf,"%.2f",t);
davernm 0:de9de5beb7af 58 lcd.locate(strlen(P1),1);
davernm 0:de9de5beb7af 59 lcd.printf("%s",buf);
davernm 0:de9de5beb7af 60
davernm 0:de9de5beb7af 61
davernm 0:de9de5beb7af 62 }
davernm 0:de9de5beb7af 63 void doConv(void)
davernm 0:de9de5beb7af 64 {
davernm 0:de9de5beb7af 65 long UT,UP,T,P;
davernm 0:de9de5beb7af 66
davernm 0:de9de5beb7af 67
davernm 0:de9de5beb7af 68 UT=X.readUT(); //read uncompensated temperature
davernm 0:de9de5beb7af 69 UP= X.readUP(); //read uncompensated pressure
davernm 0:de9de5beb7af 70 X.calVals(UT,UP,&T,&P); //calculate temperature and pressure
davernm 0:de9de5beb7af 71 dispVals(T,P); //dsiplay resuls on lcd
davernm 0:de9de5beb7af 72 }
davernm 0:de9de5beb7af 73
davernm 0:de9de5beb7af 74 */
davernm 0:de9de5beb7af 75 #include "mbed.h"
davernm 0:de9de5beb7af 76 #include "bmp085.h"
davernm 0:de9de5beb7af 77
davernm 0:de9de5beb7af 78 BMP085:: BMP085(PinName pin1,PinName pin2,int Oss):i2c(pin1,pin2){
davernm 0:de9de5beb7af 79 //this constructor does not use an end of conversion pin
davernm 0:de9de5beb7af 80 i2c.frequency(50000);
davernm 0:de9de5beb7af 81 flag=false;
davernm 0:de9de5beb7af 82 oss=Oss;
davernm 0:de9de5beb7af 83 }
davernm 0:de9de5beb7af 84 BMP085::BMP085(PinName pin1,PinName pin2):i2c(pin1,pin2){
davernm 0:de9de5beb7af 85 //this version has no end of conversion, and has the oversampling
davernm 0:de9de5beb7af 86 //default to 0.
davernm 0:de9de5beb7af 87 i2c.frequency(50000);
davernm 0:de9de5beb7af 88 flag=false;
davernm 0:de9de5beb7af 89 oss=0;//default to 0
davernm 0:de9de5beb7af 90
davernm 0:de9de5beb7af 91 }
davernm 0:de9de5beb7af 92 BMP085::BMP085(PinName pin1,PinName pin2, PinName EOC,int Oss) : i2c(pin1,pin2) {
davernm 0:de9de5beb7af 93 //end of conversion pin is used as well as oss being set
davernm 0:de9de5beb7af 94 //
davernm 0:de9de5beb7af 95 EOCptr = new DigitalIn(EOC);
davernm 0:de9de5beb7af 96 i2c.frequency(50000);
davernm 0:de9de5beb7af 97 flag=true; //eoc pin is present
davernm 0:de9de5beb7af 98 oss=Oss;
davernm 0:de9de5beb7af 99
davernm 0:de9de5beb7af 100 }
davernm 0:de9de5beb7af 101
davernm 0:de9de5beb7af 102
davernm 0:de9de5beb7af 103
davernm 0:de9de5beb7af 104 void BMP085::calVals(long UT,long UP, long *Temp,long *Pre)//see data sheet for calculations
davernm 0:de9de5beb7af 105 {
davernm 0:de9de5beb7af 106
davernm 0:de9de5beb7af 107 long X1,X2,X3,B6,B3,B7,p,B5,T;
davernm 0:de9de5beb7af 108 unsigned long B4;
davernm 0:de9de5beb7af 109
davernm 0:de9de5beb7af 110 X1=((UT-AC6)*AC5)>>15;
davernm 0:de9de5beb7af 111 X2=(MC<<11)/(X1+MD);
davernm 0:de9de5beb7af 112 B5=X1+X2;
davernm 0:de9de5beb7af 113 T=(B5+8)>>4;
davernm 0:de9de5beb7af 114
davernm 0:de9de5beb7af 115 *Temp=T;
davernm 0:de9de5beb7af 116 B6=B5-4000;
davernm 0:de9de5beb7af 117 X1=(B6*B6)/4096;
davernm 0:de9de5beb7af 118 X1*=B2;
davernm 0:de9de5beb7af 119 X1>>=11;
davernm 0:de9de5beb7af 120 X2=(AC2*B6)/2048;
davernm 0:de9de5beb7af 121 X3=X1+X2;
davernm 0:de9de5beb7af 122 B3=(((AC1*4+X3)<<oss)+2)/4;
davernm 0:de9de5beb7af 123 X1=(AC3*B6)>>13;
davernm 0:de9de5beb7af 124 X2=(B6*B6)>>12;
davernm 0:de9de5beb7af 125 X2*=B1;
davernm 0:de9de5beb7af 126 X2>>=16;
davernm 0:de9de5beb7af 127 X3=((X1+X2)+2)>>2;
davernm 0:de9de5beb7af 128 B4=(AC4*(unsigned long)(X3+32768))/32768;
davernm 0:de9de5beb7af 129 B7=((unsigned long)(UP-B3)*(50000>>oss));
davernm 0:de9de5beb7af 130
davernm 0:de9de5beb7af 131 if (B7<0x80000000) p=(B7*2)/B4;
davernm 0:de9de5beb7af 132
davernm 0:de9de5beb7af 133 else p=(B7/B4)*2;
davernm 0:de9de5beb7af 134 X1=(p>>8)*(p>>8);
davernm 0:de9de5beb7af 135 X1=(X1*3038)>>16;
davernm 0:de9de5beb7af 136 X2=(-7357*p)>>16;
davernm 0:de9de5beb7af 137 p+=(X1+X2+3791)>>4;
davernm 0:de9de5beb7af 138 *Pre=p;
davernm 0:de9de5beb7af 139 //printf("Pressure is: %ld\n",p);
davernm 0:de9de5beb7af 140
davernm 0:de9de5beb7af 141
davernm 0:de9de5beb7af 142 }
davernm 0:de9de5beb7af 143
davernm 0:de9de5beb7af 144 long BMP085::readUT(void) //uncompensated temperature
davernm 0:de9de5beb7af 145 {
davernm 0:de9de5beb7af 146 float delVals[]={4.5,7.5,13.5,25.5}; //data sheet values
davernm 0:de9de5beb7af 147 char wReg[2]; // write 0x2e into reg 0xf4
davernm 0:de9de5beb7af 148 wReg[0] = 0xF4;
davernm 0:de9de5beb7af 149 wReg[1] = 0x2E;
davernm 0:de9de5beb7af 150 i2c.write(0xee, wReg, 2);
davernm 0:de9de5beb7af 151 if (!flag)wait_ms(delVals[oss]);
davernm 0:de9de5beb7af 152 //use EOC
davernm 0:de9de5beb7af 153 else while (EOCptr->read()==0); //wait for 1
davernm 0:de9de5beb7af 154 // uncompensated temperature
davernm 0:de9de5beb7af 155 char cmd = 0xF6;// read reg 0xf6
davernm 0:de9de5beb7af 156 i2c.write(0xee, &cmd, 1);
davernm 0:de9de5beb7af 157
davernm 0:de9de5beb7af 158 char Arr[2];
davernm 0:de9de5beb7af 159 i2c.read(0xef,Arr,2);
davernm 0:de9de5beb7af 160 long UT=(Arr[0]<<8)|Arr[1];
davernm 0:de9de5beb7af 161 return UT;
davernm 0:de9de5beb7af 162 }
davernm 0:de9de5beb7af 163
davernm 0:de9de5beb7af 164
davernm 0:de9de5beb7af 165
davernm 0:de9de5beb7af 166 long BMP085::readUP(void)//uncompensated pressure
davernm 0:de9de5beb7af 167 {
davernm 0:de9de5beb7af 168 float delVals[]={4.5,7.5,13.5,25.5}; //data sheet values
davernm 0:de9de5beb7af 169 char wReg[2]; // write 0x34 into reg 0xf4
davernm 0:de9de5beb7af 170 wReg[0] = 0xF4;
davernm 0:de9de5beb7af 171 wReg[1] = 0x34+(oss<<6);
davernm 0:de9de5beb7af 172 i2c.write(0xee, wReg, 2);
davernm 0:de9de5beb7af 173 if (!flag)wait_ms(delVals[oss]);
davernm 0:de9de5beb7af 174 else while (EOCptr->read()==0);
davernm 0:de9de5beb7af 175 char cmd=0xf6;
davernm 0:de9de5beb7af 176 i2c.write(0xee,&cmd,1);
davernm 0:de9de5beb7af 177 char Arr[3];
davernm 0:de9de5beb7af 178 i2c.read(0xef,Arr,3); //3 byte data
davernm 0:de9de5beb7af 179 long UP=((Arr[0]<<16)|(Arr[1]<<8)|Arr[2])>>(8-oss);
davernm 0:de9de5beb7af 180 // printf("Pressure is: %ld\n",UP);
davernm 0:de9de5beb7af 181
davernm 0:de9de5beb7af 182 return UP;
davernm 0:de9de5beb7af 183 }
davernm 0:de9de5beb7af 184
davernm 0:de9de5beb7af 185 void BMP085::readCal(void)//read the onboard calibration data
davernm 0:de9de5beb7af 186 {
davernm 0:de9de5beb7af 187 int i;
davernm 0:de9de5beb7af 188 char addr=0xaa;
davernm 0:de9de5beb7af 189 char dumArr[1];
davernm 0:de9de5beb7af 190
davernm 0:de9de5beb7af 191 for (i=0;i<22;i++)
davernm 0:de9de5beb7af 192 {
davernm 0:de9de5beb7af 193 i2c.write(0xee,&addr,1);
davernm 0:de9de5beb7af 194 i2c.read(0xef,dumArr,1);
davernm 0:de9de5beb7af 195 Vals[i]=dumArr[0];
davernm 0:de9de5beb7af 196 addr++;
davernm 0:de9de5beb7af 197 }
davernm 0:de9de5beb7af 198 AC1=(Vals[0]<<8)|Vals[1];
davernm 0:de9de5beb7af 199 AC2=(Vals[2]<<8)|Vals[3];
davernm 0:de9de5beb7af 200 AC3=(Vals[4]<<8)|Vals[5];
davernm 0:de9de5beb7af 201 AC4=(Vals[6]<<8)|Vals[7];
davernm 0:de9de5beb7af 202 AC5=(Vals[8]<<8)|Vals[9];
davernm 0:de9de5beb7af 203 AC6=(Vals[10]<<8)|Vals[11];
davernm 0:de9de5beb7af 204 B1=(Vals[12]<<8)|Vals[13];
davernm 0:de9de5beb7af 205 B2=(Vals[14]<<8)|Vals[15];
davernm 0:de9de5beb7af 206 MB=(Vals[16]<<8)|Vals[17];
davernm 0:de9de5beb7af 207 MC=(Vals[18]<<8)|Vals[19];
davernm 0:de9de5beb7af 208 MD=(Vals[20]<<8)|Vals[21]; //printf if needed
davernm 0:de9de5beb7af 209 // printf("Calibration data: ");
davernm 0:de9de5beb7af 210 // printf("%d %d %d %d %d %d %d\n",AC1,AC2,AC3,AC4,AC5,AC6,B1);
davernm 0:de9de5beb7af 211 // printf(" %d %d %d %d\n",B2,MB,MC,MD);
davernm 0:de9de5beb7af 212
davernm 0:de9de5beb7af 213
davernm 0:de9de5beb7af 214 }