| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- /*
- 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) {
- Wire.begin();
- 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);
- }
- // Read 1 byte from the BMP085 at 'address'
- // Return: the read byte;
- char BMP085::bmp085Read(unsigned char address) {
- 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 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);
- msb = Wire.read();
- lsb = Wire.read();
- return (short) msb << 8 | lsb;
- }
- // Read the uncompensated temperature value
- unsigned short BMP085::bmp085ReadUT() {
- unsigned short ut;
- Wire.beginTransmission(BMP085_ADDRESS);
- Wire.write(0xF4);
- Wire.write(0x2E);
- Wire.endTransmission();
- delay(5);
- ut = bmp085ReadInt(0xF6);
- return ut;
- }
- // Read the uncompensated pressure value
- 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.endTransmission();
- 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);
- return up;
- }
- 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 v;
- Wire.beginTransmission(deviceAddress);
- Wire.write(address); // register to read
- Wire.endTransmission();
- Wire.requestFrom(deviceAddress, 1); // read a byte
- while (!Wire.available()) {
- // waiting
- }
- v = Wire.read();
- return v;
- }
- 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) {
- long x1, x2;
- 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;
- return temp;
- }
- 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;
- 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;
- long temp = p;
- return temp;
- }
|