I2C interface of Bosch BMP085 pressure/temperature sensor.
bmp085.cpp@0:de9de5beb7af, 2013-04-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |