PDA

View Full Version : [Question(s)] BMP085 code



KAYSHEHU
07-28-2012, 04:16 AM
Hello, please i used this code together with my MBED for my pressure sensor, the problem is that it keeps on giving constant values.

Please where did i go wrong, or if you have a better code you can assist me with that.
Thank you.


#include "mbed.h" #include "math.h" I2C i2c(p9, p10); Serial pc(USBTX, USBRX); // tx, rx int I2C_ADDRESS = 0xEE; // sensor address // oversampling setting // 0 = ultra low power // 1 = standard // 2 = high // 3 = ultra high resolution const unsigned char oversampling_setting = 3; //oversampling for measurement const unsigned char pressure_conversiontime[4] = { 4.5, 7.5, 13.5, 25.5 }; // delays for oversampling settings 0, 1, 2 and 3 // sensor registers from the BOSCH BMP085 datasheet short ac1; short ac2; short ac3; unsigned short ac4; unsigned short ac5; unsigned short ac6; short b1; short b2; short mb; short mc; short md; // variables to keep the values float temperature = 0; float pressure = 0; void writeRegister(unsigned char r, unsigned char v) { char cmd1[2]; cmd1[0] = r; cmd1[1] = v; i2c.write(I2C_ADDRESS,cmd1, 2); } // read a 16 bit register int readIntRegister(unsigned char r) { char cmd1[2]; char cmd2[1]; //unsigned char msb, lsb; cmd2[0] = r; i2c.write(I2C_ADDRESS,cmd2, 1); i2c.read(I2C_ADDRESS, cmd1, 2); return (((int)cmd1[0]<<8) | ((int)cmd1[1])); } // read uncompensated temperature value unsigned int readUT() { writeRegister(0xf4,0x2e); wait(0.0045); // the datasheet suggests 4.5 ms return readIntRegister(0xf6); } // read uncompensated pressure value long readUP() { writeRegister(0xf4,0x34+(oversampling_setting<<6)); wait(pressure_conversiontime[oversampling_setting]*0.001); //unsigned char msb, lsb, xlsb; char cmd1[3]; char cmd0[1]; cmd0[0] = 0xf6; i2c.write(I2C_ADDRESS,cmd0, 1); i2c.read(I2C_ADDRESS, cmd1, 3); return (((long)cmd1[0]<<16) | ((long)cmd1[1]<<8) | ((long)cmd1[2])) >>(8-oversampling_setting); } // Below there are the utility functions to get data from the sensor. // read temperature and pressure from sensor void readSensor() { long ut= readUT(); long up = readUP(); int x1, x2, x3, b3, b5, b6, p; unsigned int b4, b7; //calculate true temperature x1 = ((long)ut - ac6) * ac5 >> 15; x2 = ((long) mc << 11) / (x1 + md); b5 = x1 + x2; temperature = (b5 + 8) >> 4; //calculate true pressure b6 = b5 - 4000; x1 = (b2 * (b6 * b6 >> 12)) >> 11; x2 = ac2 * b6 >> 11; x3 = x1 + x2; if (oversampling_setting == 3) b3 = ((int32_t) ac1 * 4 + x3 + 2) << 1; if (oversampling_setting == 2) b3 = ((int32_t) ac1 * 4 + x3 + 2); if (oversampling_setting == 1) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 1; if (oversampling_setting == 0) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 2; x1 = ac3 * b6 >> 13; x2 = (b1 * (b6 * b6 >> 12)) >> 16; x3 = ((x1 + x2) + 2) >> 2; b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15; b7 = ((unsigned long) up - b3) * (50000 >> oversampling_setting); p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2; x1 = (p >> 8) * (p >> 8); x1 = (x1 * 3038) >> 16; x2 = (-7357 * p) >> 16; pressure = p + ((x1 + x2 + 3791) >> 4); } void getCalibrationData() { pc.printf("Reading Calibration Data"); ac1 = readIntRegister(0xAA); pc.printf("AC1: %d\r\n",ac1); ac2 = readIntRegister(0xAC); pc.printf("AC2: %d\r\n",ac2); ac3 = readIntRegister(0xAE); pc.printf("AC3: %d\r\n",ac3); ac4 = readIntRegister(0xB0); pc.printf("AC4: %d\r\n",ac4); ac5 = readIntRegister(0xB2); pc.printf("AC5: %d\r\n",ac5); ac6 = readIntRegister(0xB4); pc.printf("AC6: %d\r\n",ac6); b1 = readIntRegister(0xB6); pc.printf("B1: %d\r\n",b1); b2 = readIntRegister(0xB8); pc.printf("B2: %d\r\n",b2); mb = readIntRegister(0xBA); pc.printf("MB: %d\r\n",mb); mc = readIntRegister(0xBC); pc.printf("MC: %d\r\n",mc); md = readIntRegister(0xBE); pc.printf("MD: %d\r\n",md); } float altitud(float p) { float To=298; float ho=0; float Po=101325; //ecuacion float c=(To-0.0065*ho); float e=(p/Po); float d=exp(0.19082*log(e)); float b=c*d; float alt=153.84615*(To-b); return(alt); } int main(){ pc.baud(9600); getCalibrationData(); while(1) { readSensor(); pc.printf("Temperature: %.f Pressure: %.f Altitud: %.1f\r",temperature,pressure, altitud(pressure)); wait(1); } }

lnxfergy
07-29-2012, 02:39 AM
I suggest reposting your code inside a
.. block, as that wall of text is incomprehensible and it is likely nobody wants to go through and try to format it.

-Fergs