Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Barometer Code for BMP085
- SCL: A5
- SDA: A4
- */
- #include <Wire.h>
- int BMP085_ADDRESS = 0x77;
- /* This is the oversampling rate which goes from 0 to basic to 3 of a high resolution */
- const unsigned char OSS = 0;
- /* Calibration data */
- int ac1;
- int ac2;
- int ac3;
- unsigned int ac4;
- unsigned int ac5;
- unsigned int ac6;
- int b1;
- int b2;
- int mb;
- int mc;
- int md;
- short Temperature = 0;
- long Pressure = 0;
- long b5;
- /* Standard Atmosphere */
- const float Po = 101325;
- float altitude;
- void setup() {
- Serial.begin(9600);
- Wire.begin();
- bmp085Calibration();
- }
- /* Calcs from data sheet */
- void loop()
- {
- float Temperature = bmp085GetTemperature(bmp085ReadUT());
- float Pressure = bmp085GetPressure(bmp085ReadUP());
- float atm = Pressure / 101325;
- float altitude = 44330 * (1- pow(((float) Pressure/Po), 0.190295));
- Serial.print("Temperature:");
- Serial.print(Temperature, 2);
- Serial.println("Degrees C");
- Serial.print("Pressure:");
- Serial.print(Pressure, 0);
- Serial.println("Pascals");
- Serial.print("Standard Atmosphere:");
- Serial.println(atm, 4);
- Serial.print("Altitude:");
- Serial.print(altitude, 2);
- Serial.println("Meters ASL");
- Serial.println();
- delay(1000);
- }
- 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);
- }
- short bmp085GetTemperature(unsigned int ut)
- {
- long x1, x2;
- x1 = ((long)ut - (long)ac6) * (long)ac5 / pow(2, 15);
- x2 = ((long)mc * pow(2, 11)) / ((long)x1 + (long)md);
- b5 = x1 + x2;
- return ((b5 + 8) / pow(2, 4));
- }
- long bmp085GetPressure(unsigned long up)
- {
- long b6, x1, x2, x3, b3, p;
- unsigned long b4, b7;
- b6 = b5 - 4000;
- x1 = (b2 * (b6 * b6 / pow(2, 12))) / pow(2, 11);
- x2 = (ac2 * b6) / pow(2, 11);
- x3 = x1 + x2;
- b3 = ((((long)ac1) * 4 + x3)<<OSS + 2) / 4;
- x1 = (ac3 * b6) / pow(2, 13);
- x2 = (b1 * (b6 * b6 / pow(2, 12))) / pow(2, 16);
- x3 = ((x1 + x2) + 2) / pow(2, 3);
- b4 = ac4 * ((unsigned long)(x3 + 32768)) / pow(2, 15);
- b7 = ((unsigned long)(up - b3) * (50000 >> OSS));
- if (b7 < 0x80000000)
- p = (b7 * 2) / b4;
- else
- p = (b7 / b4) * 2;
- x1 = (p/ pow(2, 8)) * (p/ pow(2, 8));
- x1 = (x1 * 3038) / pow(2, 16);
- x2 = (-7357 * p) / pow(2, 16);
- p = p + (x1 + x2 + 3791) / pow(2, 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
- int 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 (int) msb<<8 | lsb;
- }
- // Read the uncompensated temperature value
- unsigned int bmp085ReadUT()
- {
- unsigned int 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(5);
- // 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement