You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
5.0 KiB
181 lines
5.0 KiB
//----------------------------------------------------------------------------------------------------------
|
|
void bmp085()
|
|
{float temperature;
|
|
temperature = bmp085GetTemperature(bmp085ReadUT());
|
|
pressure = bmp085GetPressure(bmp085ReadUP())*10.023/1333;
|
|
// pressureNN = pressure / pressureCorrection;
|
|
|
|
|
|
// Serial.print("Temperature: ");
|
|
// Serial.print(temperature,1);
|
|
// Serial.print(" C, Pressure: ");
|
|
// Serial.print(pressure,1);
|
|
// Serial.print(" hPa in 103m height above sea level, Pressure-NN: ");
|
|
// Serial.print(pressureNN,1);
|
|
// Serial.println(" hPa");
|
|
delay(500);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
// Stores all of the bmp085's calibration values into global variables
|
|
// Calibration values are required to calculate temp and pressure
|
|
// This function should be called at the beginning of the program
|
|
void bmp085Calibration()
|
|
{
|
|
ac1 = bmp085ReadInt(0xAA);
|
|
ac2 = bmp085ReadInt(0xAC);
|
|
ac3 = bmp085ReadInt(0xAE);
|
|
ac4 = bmp085ReadInt(0xB0);
|
|
ac5 = bmp085ReadInt(0xB2);
|
|
ac6 = bmp085ReadInt(0xB4);
|
|
b1 = bmp085ReadInt(0xB6);
|
|
b2 = bmp085ReadInt(0xB8);
|
|
mb = bmp085ReadInt(0xBA);
|
|
mc = bmp085ReadInt(0xBC);
|
|
md = bmp085ReadInt(0xBE);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
// Calculate temperature given ut.
|
|
// Value returned will be in units of 0.1 deg C
|
|
short bmp085GetTemperature(unsigned short ut)
|
|
{
|
|
long x1, x2;
|
|
|
|
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
|
|
x2 = ((long)mc << 11)/(x1 + md);
|
|
b5 = x1 + x2;
|
|
|
|
return ((b5 + 8)>>4);
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
// Calculate pressure given up
|
|
// calibration values must be known
|
|
// b5 is also required so bmp085GetTemperature(...) must be called first.
|
|
// Value returned will be pressure in units of Pa.
|
|
long bmp085GetPressure(unsigned long up)
|
|
{
|
|
long x1, x2, x3, b3, b6, p;
|
|
unsigned long b4, b7;
|
|
|
|
b6 = b5 - 4000;
|
|
// Calculate B3
|
|
x1 = (b2 * (b6 * b6)>>12)>>11;
|
|
x2 = (ac2 * b6)>>11;
|
|
x3 = x1 + x2;
|
|
b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
|
|
|
|
// Calculate B4
|
|
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>>OSS));
|
|
if (b7 < 0x80000000)
|
|
p = (b7<<1)/b4;
|
|
else
|
|
p = (b7/b4)<<1;
|
|
|
|
x1 = (p>>8) * (p>>8);
|
|
x1 = (x1 * 3038)>>16;
|
|
x2 = (-7357 * p)>>16;
|
|
p += (x1 + x2 + 3791)>>4;
|
|
|
|
return p;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
// Read 1 byte from the BMP085 at 'address'
|
|
char bmp085Read(unsigned char address)
|
|
{
|
|
unsigned char data;
|
|
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
Wire.write(address);
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(BMP085_ADDRESS, 1);
|
|
while(!Wire.available())
|
|
;
|
|
|
|
return Wire.read();
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
// Read 2 bytes from the BMP085
|
|
// First byte will be from 'address'
|
|
// Second byte will be from 'address'+1
|
|
short bmp085ReadInt(unsigned char address)
|
|
{
|
|
unsigned char msb, lsb;
|
|
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
Wire.write(address);
|
|
Wire.endTransmission();
|
|
|
|
Wire.requestFrom(BMP085_ADDRESS, 2);
|
|
while(Wire.available()<2)
|
|
;
|
|
msb = Wire.read();
|
|
lsb = Wire.read();
|
|
|
|
return (short) msb<<8 | lsb;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
// Read the uncompensated temperature value
|
|
unsigned short bmp085ReadUT()
|
|
{
|
|
unsigned short ut;
|
|
|
|
// Write 0x2E into Register 0xF4
|
|
// This requests a temperature reading
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
Wire.write(0xF4);
|
|
Wire.write(0x2E);
|
|
Wire.endTransmission();
|
|
|
|
// Wait at least 4.5ms
|
|
delay(10);
|
|
|
|
// Read two bytes from registers 0xF6 and 0xF7
|
|
ut = bmp085ReadInt(0xF6);
|
|
return ut;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
// Read the uncompensated pressure value
|
|
unsigned long bmp085ReadUP()
|
|
{
|
|
unsigned char msb, lsb, xlsb;
|
|
unsigned long up = 0;
|
|
|
|
// Write 0x34+(OSS<<6) into register 0xF4
|
|
// Request a pressure reading w/ oversampling setting
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
Wire.write(0xF4);
|
|
Wire.write(0x34 + (OSS<<6));
|
|
Wire.endTransmission();
|
|
|
|
// Wait for conversion, delay time dependent on OSS
|
|
delay(2 + (3<<OSS));
|
|
|
|
// Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
Wire.write(0xF6);
|
|
Wire.endTransmission();
|
|
Wire.requestFrom(BMP085_ADDRESS, 3);
|
|
|
|
// Wait for data to become available
|
|
while(Wire.available() < 3) ;
|
|
msb = Wire.read();
|
|
lsb = Wire.read();
|
|
xlsb = Wire.read();
|
|
|
|
up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
|
|
|
|
return up;
|
|
}
|
|
//---------------------------------------------------------------------------------------------------------
|
|
|