|
|
@@ -1,43 +1,42 @@
|
|
|
/*
|
|
|
- * Barometer.cpp
|
|
|
- * A library for barometer
|
|
|
- *
|
|
|
- * Copyright (c) 2012 seeed technology inc.
|
|
|
- * Website : www.seeed.cc
|
|
|
- * Author : LG
|
|
|
- * Create Time:
|
|
|
- * Change Log :
|
|
|
- *
|
|
|
- * loovee 9-24-2014
|
|
|
- * Change all int to short, all unsigned int to unsigned short to fit some 32bit system
|
|
|
- * The MIT License (MIT)
|
|
|
- *
|
|
|
- * Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
- * of this software and associated documentation files (the "Software"), to deal
|
|
|
- * in the Software without restriction, including without limitation the rights
|
|
|
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
- * copies of the Software, and to permit persons to whom the Software is
|
|
|
- * furnished to do so, subject to the following conditions:
|
|
|
- *
|
|
|
- * The above copyright notice and this permission notice shall be included in
|
|
|
- * all copies or substantial portions of the Software.
|
|
|
- *
|
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
- * THE SOFTWARE.
|
|
|
- */
|
|
|
+ Barometer.cpp
|
|
|
+ A library for barometer
|
|
|
+
|
|
|
+ Copyright (c) 2012 seeed technology inc.
|
|
|
+ Website : www.seeed.cc
|
|
|
+ Author : LG
|
|
|
+ Create Time:
|
|
|
+ Change Log :
|
|
|
+
|
|
|
+ loovee 9-24-2014
|
|
|
+ Change all int to short, all unsigned int to unsigned short to fit some 32bit system
|
|
|
+ The MIT License (MIT)
|
|
|
+
|
|
|
+ Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
+ of this software and associated documentation files (the "Software"), to deal
|
|
|
+ in the Software without restriction, including without limitation the rights
|
|
|
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
+ copies of the Software, and to permit persons to whom the Software is
|
|
|
+ furnished to do so, subject to the following conditions:
|
|
|
+
|
|
|
+ The above copyright notice and this permission notice shall be included in
|
|
|
+ all copies or substantial portions of the Software.
|
|
|
+
|
|
|
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
+ THE SOFTWARE.
|
|
|
+*/
|
|
|
|
|
|
#include "BMP085.h"
|
|
|
#include <Wire.h>
|
|
|
#include <Arduino.h>
|
|
|
#include <math.h>
|
|
|
|
|
|
-void BMP085::init(void)
|
|
|
-{
|
|
|
+void BMP085::init(void) {
|
|
|
Wire.begin();
|
|
|
ac1 = bmp085ReadInt(0xAA);
|
|
|
ac2 = bmp085ReadInt(0xAC);
|
|
|
@@ -54,36 +53,33 @@ void BMP085::init(void)
|
|
|
|
|
|
// Read 1 byte from the BMP085 at 'address'
|
|
|
// Return: the read byte;
|
|
|
-char BMP085::bmp085Read(unsigned char address)
|
|
|
-{
|
|
|
+char BMP085::bmp085Read(unsigned char address) {
|
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
|
Wire.write(address);
|
|
|
Wire.endTransmission();
|
|
|
|
|
|
Wire.requestFrom(BMP085_ADDRESS, 1);
|
|
|
- while(!Wire.available());
|
|
|
+ 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 BMP085::bmp085ReadInt(unsigned char address)
|
|
|
-{
|
|
|
+short BMP085::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);
|
|
|
+ while (Wire.available() < 2);
|
|
|
msb = Wire.read();
|
|
|
lsb = Wire.read();
|
|
|
- return (short) msb<<8 | lsb;
|
|
|
+ return (short) msb << 8 | lsb;
|
|
|
}
|
|
|
|
|
|
// Read the uncompensated temperature value
|
|
|
-unsigned short BMP085::bmp085ReadUT()
|
|
|
-{
|
|
|
+unsigned short BMP085::bmp085ReadUT() {
|
|
|
unsigned short ut;
|
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
|
Wire.write(0xF4);
|
|
|
@@ -94,34 +90,31 @@ unsigned short BMP085::bmp085ReadUT()
|
|
|
return ut;
|
|
|
}
|
|
|
// Read the uncompensated pressure value
|
|
|
-unsigned long BMP085::bmp085ReadUP()
|
|
|
-{
|
|
|
+unsigned long BMP085::bmp085ReadUP() {
|
|
|
unsigned char msb, lsb, xlsb;
|
|
|
unsigned long up = 0;
|
|
|
Wire.beginTransmission(BMP085_ADDRESS);
|
|
|
Wire.write(0xF4);
|
|
|
- Wire.write(0x34 + (OSS<<6));
|
|
|
+ Wire.write(0x34 + (OSS << 6));
|
|
|
Wire.endTransmission();
|
|
|
- delay(2 + (3<<OSS));
|
|
|
+ delay(2 + (3 << OSS));
|
|
|
|
|
|
// Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
|
|
|
msb = bmp085Read(0xF6);
|
|
|
lsb = bmp085Read(0xF7);
|
|
|
xlsb = bmp085Read(0xF8);
|
|
|
- up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
|
|
|
+ up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8 - OSS);
|
|
|
return up;
|
|
|
}
|
|
|
|
|
|
-void BMP085::writeRegister(short deviceAddress, byte address, byte val)
|
|
|
-{
|
|
|
+void BMP085::writeRegister(short deviceAddress, byte address, byte val) {
|
|
|
Wire.beginTransmission(deviceAddress); // start transmission to device
|
|
|
Wire.write(address); // send register address
|
|
|
Wire.write(val); // send value to write
|
|
|
Wire.endTransmission(); // end transmission
|
|
|
}
|
|
|
|
|
|
-short BMP085::readRegister(short deviceAddress, byte address)
|
|
|
-{
|
|
|
+short BMP085::readRegister(short deviceAddress, byte address) {
|
|
|
short v;
|
|
|
Wire.beginTransmission(deviceAddress);
|
|
|
Wire.write(address); // register to read
|
|
|
@@ -129,7 +122,7 @@ short BMP085::readRegister(short deviceAddress, byte address)
|
|
|
|
|
|
Wire.requestFrom(deviceAddress, 1); // read a byte
|
|
|
|
|
|
- while(!Wire.available()) {
|
|
|
+ while (!Wire.available()) {
|
|
|
// waiting
|
|
|
}
|
|
|
|
|
|
@@ -137,54 +130,52 @@ short BMP085::readRegister(short deviceAddress, byte address)
|
|
|
return v;
|
|
|
}
|
|
|
|
|
|
-float BMP085::calcAltitude(float seaLevelPressure)
|
|
|
-{
|
|
|
+float BMP085::calcAltitude(float seaLevelPressure) {
|
|
|
float pressure = bmp085GetPressure(bmp085ReadUP());//Get the temperature
|
|
|
float altitude = 44330.0 * (1.0 - pow(pressure / seaLevelPressure, 0.1903));
|
|
|
|
|
|
return altitude;
|
|
|
}
|
|
|
|
|
|
-float BMP085::bmp085GetTemperature(unsigned short ut)
|
|
|
-{
|
|
|
+float BMP085::bmp085GetTemperature(unsigned short ut) {
|
|
|
long x1, x2;
|
|
|
|
|
|
- x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
|
|
|
- x2 = ((long)mc << 11)/(x1 + md);
|
|
|
+ x1 = (((long)ut - (long)ac6) * (long)ac5) >> 15;
|
|
|
+ x2 = ((long)mc << 11) / (x1 + md);
|
|
|
PressureCompensate = x1 + x2;
|
|
|
|
|
|
- float temp = ((PressureCompensate + 8)>>4);
|
|
|
- temp = temp /10;
|
|
|
+ float temp = ((PressureCompensate + 8) >> 4);
|
|
|
+ temp = temp / 10;
|
|
|
|
|
|
return temp;
|
|
|
}
|
|
|
|
|
|
-long BMP085::bmp085GetPressure(unsigned long up)
|
|
|
-{
|
|
|
+long BMP085::bmp085GetPressure(unsigned long up) {
|
|
|
long x1, x2, x3, b3, b6, p;
|
|
|
unsigned long b4, b7;
|
|
|
b6 = PressureCompensate - 4000;
|
|
|
- x1 = (b2 * (b6 * b6)>>12)>>11;
|
|
|
- x2 = (ac2 * b6)>>11;
|
|
|
+ x1 = (b2 * (b6 * b6) >> 12) >> 11;
|
|
|
+ x2 = (ac2 * b6) >> 11;
|
|
|
x3 = x1 + x2;
|
|
|
- b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
|
|
|
+ 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;
|
|
|
+ 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;
|
|
|
|
|
|
long temp = p;
|
|
|
return temp;
|