Library for getting temperature and pressure values from Bosch BMP180 barometer.

Dependents:   WeatherStation WeatherStation1 ProjectD Weather_Station ... more

Committer:
eencae
Date:
Sat Mar 14 12:57:44 2015 +0000
Revision:
3:0e92710a46f9
Parent:
2:79d0d565c3af
Added DEBUG mode to check algorithm and compare to data sheet value.; Uncomment #define DEBUG in header file.; Confirmed agreement with data sheet values.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:70d1d5ec30c8 1 /**
eencae 0:70d1d5ec30c8 2 @file BMP180.h
eencae 0:70d1d5ec30c8 3
eencae 0:70d1d5ec30c8 4 @brief Header file containing member functions and variables
eencae 0:70d1d5ec30c8 5
eencae 0:70d1d5ec30c8 6 */
eencae 0:70d1d5ec30c8 7
eencae 0:70d1d5ec30c8 8 #ifndef BMP180_H
eencae 0:70d1d5ec30c8 9 #define BMP180_H
eencae 0:70d1d5ec30c8 10
eencae 0:70d1d5ec30c8 11 // BMP180 address (5.2 datasheet)
eencae 0:70d1d5ec30c8 12 #define BMP180_W_ADDRESS 0xEE
eencae 0:70d1d5ec30c8 13 #define BMP180_R_ADDRESS 0xEF
eencae 0:70d1d5ec30c8 14 // Register Descriptions (4 datasheet)
eencae 0:70d1d5ec30c8 15 #define ID_REG 0xD0
eencae 0:70d1d5ec30c8 16 #define EEPROM_REG_ADD 0xAA
eencae 0:70d1d5ec30c8 17
eencae 3:0e92710a46f9 18 // uncomment line below to run in debug mode and compare to datasheet values
eencae 3:0e92710a46f9 19 //#define DEBUG
eencae 3:0e92710a46f9 20
eencae 0:70d1d5ec30c8 21 // Struct to store calibration data
eencae 0:70d1d5ec30c8 22 typedef struct Calibration Calibration;
eencae 0:70d1d5ec30c8 23 struct Calibration {
eencae 0:70d1d5ec30c8 24 int16_t AC1;
eencae 0:70d1d5ec30c8 25 int16_t AC2;
eencae 0:70d1d5ec30c8 26 int16_t AC3;
eencae 0:70d1d5ec30c8 27 uint16_t AC4;
eencae 0:70d1d5ec30c8 28 uint16_t AC5;
eencae 0:70d1d5ec30c8 29 uint16_t AC6;
eencae 0:70d1d5ec30c8 30 int16_t B1;
eencae 0:70d1d5ec30c8 31 int16_t B2;
eencae 0:70d1d5ec30c8 32 int16_t MB;
eencae 0:70d1d5ec30c8 33 int16_t MC;
eencae 0:70d1d5ec30c8 34 int16_t MD;
eencae 0:70d1d5ec30c8 35 };
eencae 0:70d1d5ec30c8 36
eencae 0:70d1d5ec30c8 37 // Struct for measurement (temperature and pressure)
eencae 0:70d1d5ec30c8 38 typedef struct Measurement Measurement;
eencae 0:70d1d5ec30c8 39 struct Measurement {
eencae 0:70d1d5ec30c8 40 float temperature;
eencae 0:70d1d5ec30c8 41 float pressure;
eencae 0:70d1d5ec30c8 42 };
eencae 0:70d1d5ec30c8 43
eencae 0:70d1d5ec30c8 44 #include "mbed.h"
eencae 0:70d1d5ec30c8 45
eencae 0:70d1d5ec30c8 46 /**
eencae 0:70d1d5ec30c8 47 @brief Library for interfacing with BMP180 Barometer
eencae 0:70d1d5ec30c8 48 @see https://www.bosch-sensortec.com/en/homepage/products_3/environmental_sensors_1/bmp180_1/bmp180
eencae 0:70d1d5ec30c8 49 @see https://www.sparkfun.com/products/11824
eencae 0:70d1d5ec30c8 50
eencae 0:70d1d5ec30c8 51 @brief Revision 1.0
eencae 0:70d1d5ec30c8 52
eencae 0:70d1d5ec30c8 53 @author Craig A. Evans
eencae 0:70d1d5ec30c8 54 @date March 2015
eencae 0:70d1d5ec30c8 55 *
eencae 0:70d1d5ec30c8 56 * Example:
eencae 0:70d1d5ec30c8 57 * @code
eencae 0:70d1d5ec30c8 58
eencae 1:e6c317e0f3a4 59 #include "mbed.h"
eencae 1:e6c317e0f3a4 60 #include "BMP180.h"
eencae 1:e6c317e0f3a4 61
eencae 1:e6c317e0f3a4 62 BMP180 bmp180(p28,p27); // SDA, SCL
eencae 1:e6c317e0f3a4 63 Serial serial(USBTX,USBRX);
eencae 1:e6c317e0f3a4 64
eencae 1:e6c317e0f3a4 65 int main() {
eencae 1:e6c317e0f3a4 66
eencae 1:e6c317e0f3a4 67 // initiliase barometer
eencae 1:e6c317e0f3a4 68 bmp180.init();
eencae 1:e6c317e0f3a4 69
eencae 1:e6c317e0f3a4 70 Measurement measurement; // measurement structure declared in BMP180 class
eencae 1:e6c317e0f3a4 71
eencae 1:e6c317e0f3a4 72 while(1) {
eencae 1:e6c317e0f3a4 73
eencae 1:e6c317e0f3a4 74 // read values (T in Celsius and P in mb) and print over serial port
eencae 1:e6c317e0f3a4 75 measurement = bmp180.readValues();
eencae 1:e6c317e0f3a4 76 serial.printf("T = %.2f C P = %.2f mb\n",measurement.temperature,measurement.pressure);
eencae 1:e6c317e0f3a4 77 wait(1.0); // short delau until next reading
eencae 1:e6c317e0f3a4 78
eencae 1:e6c317e0f3a4 79 }
eencae 1:e6c317e0f3a4 80 }
eencae 1:e6c317e0f3a4 81
eencae 1:e6c317e0f3a4 82
eencae 0:70d1d5ec30c8 83 * @endcode
eencae 0:70d1d5ec30c8 84 */
eencae 0:70d1d5ec30c8 85
eencae 0:70d1d5ec30c8 86 class BMP180
eencae 0:70d1d5ec30c8 87 {
eencae 0:70d1d5ec30c8 88 public:
eencae 0:70d1d5ec30c8 89
eencae 0:70d1d5ec30c8 90 /** Create a BMP180 object connected to the specified I2C pins
eencae 0:70d1d5ec30c8 91 *
eencae 0:70d1d5ec30c8 92 * @param sdaPin - mbed SDA pin
eencae 0:70d1d5ec30c8 93 * @param sclPin - mbed SCL pin
eencae 0:70d1d5ec30c8 94 *
eencae 0:70d1d5ec30c8 95 */
eencae 0:70d1d5ec30c8 96 BMP180(PinName sdaPin, PinName sclPin);
eencae 1:e6c317e0f3a4 97
eencae 0:70d1d5ec30c8 98 /** Initialise barometer - reads factory calibration data
eencae 0:70d1d5ec30c8 99 *
eencae 0:70d1d5ec30c8 100 */
eencae 0:70d1d5ec30c8 101 void init();
eencae 0:70d1d5ec30c8 102
eencae 0:70d1d5ec30c8 103 /** Read current temperature and pressure values
eencae 0:70d1d5ec30c8 104 *
eencae 0:70d1d5ec30c8 105 * @returns Measurement structure. Memebers are temperature in C (float) and pressure in mbar (float)
eencae 0:70d1d5ec30c8 106 *
eencae 0:70d1d5ec30c8 107 */
eencae 0:70d1d5ec30c8 108 Measurement readValues();
eencae 0:70d1d5ec30c8 109
eencae 0:70d1d5ec30c8 110 private:
eencae 0:70d1d5ec30c8 111 void error();
eencae 2:79d0d565c3af 112 int32_t readUncompensatedTemperatureValue();
eencae 2:79d0d565c3af 113 int32_t readUncompensatedPressureValue();
eencae 2:79d0d565c3af 114 int32_t calcTrueTemperature(int32_t UT);
eencae 2:79d0d565c3af 115 int32_t calcTruePressure(int32_t UP);
eencae 0:70d1d5ec30c8 116 void sendByteToRegister(char byte,char reg);
eencae 0:70d1d5ec30c8 117 char readByteFromRegister(char reg);
eencae 0:70d1d5ec30c8 118 void readBytesFromRegister(char reg,int numberOfBytes,char bytes[]);
eencae 0:70d1d5ec30c8 119 void readCalibrationData();
eencae 0:70d1d5ec30c8 120
eencae 0:70d1d5ec30c8 121
eencae 0:70d1d5ec30c8 122 private: // private variables
eencae 0:70d1d5ec30c8 123 I2C* i2c;
eencae 0:70d1d5ec30c8 124 BusOut* leds;
eencae 0:70d1d5ec30c8 125 Calibration calibration; // variable to store calibration data
eencae 0:70d1d5ec30c8 126 // variables for calculation
eencae 2:79d0d565c3af 127 int32_t X1,X2,X3,B3,B5,B6;
eencae 2:79d0d565c3af 128 uint32_t B4,B7;
eencae 0:70d1d5ec30c8 129 int oss; // oversampling setting
eencae 0:70d1d5ec30c8 130 };
eencae 0:70d1d5ec30c8 131
eencae 0:70d1d5ec30c8 132 #endif