Device driver for the BMP180 Digital pressure and temperature sensor.

Dependents:   BMP180_example MAXWSNENV_sensors MAXWSNENV_sensors nRF51822_BMP180 ... more

BMP180 Device Driver

This is a device driver for the BMP180 Digital pressure sensor. It uses I2C to communicate pressure and temperature data.

BMP180 Product Page

180

Committer:
kgills
Date:
Fri Apr 17 09:31:09 2015 -0500
Revision:
0:b2219e6e444b
Adding BMP180 library files.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kgills 0:b2219e6e444b 1 /*******************************************************************************
kgills 0:b2219e6e444b 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
kgills 0:b2219e6e444b 3 *
kgills 0:b2219e6e444b 4 * Permission is hereby granted, free of charge, to any person obtaining a
kgills 0:b2219e6e444b 5 * copy of this software and associated documentation files (the "Software"),
kgills 0:b2219e6e444b 6 * to deal in the Software without restriction, including without limitation
kgills 0:b2219e6e444b 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
kgills 0:b2219e6e444b 8 * and/or sell copies of the Software, and to permit persons to whom the
kgills 0:b2219e6e444b 9 * Software is furnished to do so, subject to the following conditions:
kgills 0:b2219e6e444b 10 *
kgills 0:b2219e6e444b 11 * The above copyright notice and this permission notice shall be included
kgills 0:b2219e6e444b 12 * in all copies or substantial portions of the Software.
kgills 0:b2219e6e444b 13 *
kgills 0:b2219e6e444b 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
kgills 0:b2219e6e444b 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kgills 0:b2219e6e444b 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kgills 0:b2219e6e444b 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
kgills 0:b2219e6e444b 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
kgills 0:b2219e6e444b 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
kgills 0:b2219e6e444b 20 * OTHER DEALINGS IN THE SOFTWARE.
kgills 0:b2219e6e444b 21 *
kgills 0:b2219e6e444b 22 * Except as contained in this notice, the name of Maxim Integrated
kgills 0:b2219e6e444b 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
kgills 0:b2219e6e444b 24 * Products, Inc. Branding Policy.
kgills 0:b2219e6e444b 25 *
kgills 0:b2219e6e444b 26 * The mere transfer of this software does not imply any licenses
kgills 0:b2219e6e444b 27 * of trade secrets, proprietary technology, copyrights, patents,
kgills 0:b2219e6e444b 28 * trademarks, maskwork rights, or any other form of intellectual
kgills 0:b2219e6e444b 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
kgills 0:b2219e6e444b 30 * ownership rights.
kgills 0:b2219e6e444b 31 *******************************************************************************
kgills 0:b2219e6e444b 32 */
kgills 0:b2219e6e444b 33
kgills 0:b2219e6e444b 34 #ifndef _BMP180_H_
kgills 0:b2219e6e444b 35 #define _BMP180_H_
kgills 0:b2219e6e444b 36
kgills 0:b2219e6e444b 37 #include "mbed.h"
kgills 0:b2219e6e444b 38
kgills 0:b2219e6e444b 39 /**
kgills 0:b2219e6e444b 40 * Bosch BMP180 Digital Pressure Sensor
kgills 0:b2219e6e444b 41 *
kgills 0:b2219e6e444b 42 * @code
kgills 0:b2219e6e444b 43 * #include <stdio.h>
kgills 0:b2219e6e444b 44 * #include "mbed.h"
kgills 0:b2219e6e444b 45 * #include "BMP180.h"
kgills 0:b2219e6e444b 46 *
kgills 0:b2219e6e444b 47 * I2C i2c(I2C_SDA, I2C_SCL);
kgills 0:b2219e6e444b 48 * BMP180 bmp180(&i2c);
kgills 0:b2219e6e444b 49 *
kgills 0:b2219e6e444b 50 * int main(void) {
kgills 0:b2219e6e444b 51 *
kgills 0:b2219e6e444b 52 * while(1) {
kgills 0:b2219e6e444b 53 * if (bmp180.init() != 0) {
kgills 0:b2219e6e444b 54 * printf("Error communicating with BMP180\n");
kgills 0:b2219e6e444b 55 * } else {
kgills 0:b2219e6e444b 56 * printf("Initialized BMP180\n");
kgills 0:b2219e6e444b 57 * break;
kgills 0:b2219e6e444b 58 * }
kgills 0:b2219e6e444b 59 * wait(1);
kgills 0:b2219e6e444b 60 * }
kgills 0:b2219e6e444b 61 *
kgills 0:b2219e6e444b 62 * while(1) {
kgills 0:b2219e6e444b 63 * bmp180.startTemperature();
kgills 0:b2219e6e444b 64 * wait_ms(5); // Wait for conversion to complete
kgills 0:b2219e6e444b 65 * float temp;
kgills 0:b2219e6e444b 66 * if(bmp180.getTemperature(&temp) != 0) {
kgills 0:b2219e6e444b 67 * printf("Error getting temperature\n");
kgills 0:b2219e6e444b 68 * continue;
kgills 0:b2219e6e444b 69 * }
kgills 0:b2219e6e444b 70 *
kgills 0:b2219e6e444b 71 * bmp180.startPressure(BMP180::ULTRA_LOW_POWER);
kgills 0:b2219e6e444b 72 * wait_ms(10); // Wait for conversion to complete
kgills 0:b2219e6e444b 73 * int pressure;
kgills 0:b2219e6e444b 74 * if(bmp180.getPressure(&pressure) != 0) {
kgills 0:b2219e6e444b 75 * printf("Error getting pressure\n");
kgills 0:b2219e6e444b 76 * continue;
kgills 0:b2219e6e444b 77 * }
kgills 0:b2219e6e444b 78 *
kgills 0:b2219e6e444b 79 * printf("Pressure = %d Pa Temperature = %f C\n", pressure, temp);
kgills 0:b2219e6e444b 80 * wait(1);
kgills 0:b2219e6e444b 81 * }
kgills 0:b2219e6e444b 82 * }
kgills 0:b2219e6e444b 83 * @endcode
kgills 0:b2219e6e444b 84 */
kgills 0:b2219e6e444b 85 class BMP180
kgills 0:b2219e6e444b 86 {
kgills 0:b2219e6e444b 87
kgills 0:b2219e6e444b 88 public:
kgills 0:b2219e6e444b 89
kgills 0:b2219e6e444b 90 /**
kgills 0:b2219e6e444b 91 * @brief Oversampling ratio.
kgills 0:b2219e6e444b 92 * @details Dictates how many pressure samples to take. Conversion time varies
kgills 0:b2219e6e444b 93 * depending on the number of samples taken. Refer to data sheet
kgills 0:b2219e6e444b 94 * for timing specifications.
kgills 0:b2219e6e444b 95 */
kgills 0:b2219e6e444b 96 typedef enum {
kgills 0:b2219e6e444b 97 ULTRA_LOW_POWER = 0, ///< 1 pressure sample
kgills 0:b2219e6e444b 98 STANDARD = 1, ///< 2 pressure samples
kgills 0:b2219e6e444b 99 HIGH_RESOLUTION = 2, ///< 4 pressure samples
kgills 0:b2219e6e444b 100 ULTRA_HIGH_RESOLUTION = 3, ///< 8 pressure samples
kgills 0:b2219e6e444b 101 } oversampling_t;
kgills 0:b2219e6e444b 102
kgills 0:b2219e6e444b 103 /**
kgills 0:b2219e6e444b 104 * BMP180 constructor.
kgills 0:b2219e6e444b 105 *
kgills 0:b2219e6e444b 106 * @param sda mbed pin to use for SDA line of I2C interface.
kgills 0:b2219e6e444b 107 * @param scl mbed pin to use for SCL line of I2C interface.
kgills 0:b2219e6e444b 108 */
kgills 0:b2219e6e444b 109 BMP180(PinName sda, PinName scl);
kgills 0:b2219e6e444b 110
kgills 0:b2219e6e444b 111 /**
kgills 0:b2219e6e444b 112 * BMP180 constructor.
kgills 0:b2219e6e444b 113 *
kgills 0:b2219e6e444b 114 * @param i2c I2C object to use.
kgills 0:b2219e6e444b 115 */
kgills 0:b2219e6e444b 116 BMP180(I2C *i2c);
kgills 0:b2219e6e444b 117
kgills 0:b2219e6e444b 118 /**
kgills 0:b2219e6e444b 119 * BMP180 destructor.
kgills 0:b2219e6e444b 120 */
kgills 0:b2219e6e444b 121 ~BMP180();
kgills 0:b2219e6e444b 122
kgills 0:b2219e6e444b 123 /**
kgills 0:b2219e6e444b 124 * @brief Initialize BMP180.
kgills 0:b2219e6e444b 125 * @details Gets the device ID and saves the calibration values.
kgills 0:b2219e6e444b 126 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 127 */
kgills 0:b2219e6e444b 128 int init(void);
kgills 0:b2219e6e444b 129
kgills 0:b2219e6e444b 130 /**
kgills 0:b2219e6e444b 131 * @brief Reset BMP180.
kgills 0:b2219e6e444b 132 * @details Performs a soft reset of the device. Same sequence as power on reset.
kgills 0:b2219e6e444b 133 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 134 */
kgills 0:b2219e6e444b 135 int reset(void);
kgills 0:b2219e6e444b 136
kgills 0:b2219e6e444b 137 /**
kgills 0:b2219e6e444b 138 * @brief Check ID.
kgills 0:b2219e6e444b 139 * @details Checks the device ID, should be 0x55 on reset.
kgills 0:b2219e6e444b 140 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 141 */
kgills 0:b2219e6e444b 142 int checkId(void);
kgills 0:b2219e6e444b 143
kgills 0:b2219e6e444b 144 /**
kgills 0:b2219e6e444b 145 * @brief Start pressure conversion.
kgills 0:b2219e6e444b 146 * @details Initiates the pressure conversion sequence. Refer to data sheet
kgills 0:b2219e6e444b 147 * for timing specifications.
kgills 0:b2219e6e444b 148 *
kgills 0:b2219e6e444b 149 * @param oss Number of samples to take.
kgills 0:b2219e6e444b 150 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 151 */
kgills 0:b2219e6e444b 152 int startPressure(BMP180::oversampling_t oss);
kgills 0:b2219e6e444b 153
kgills 0:b2219e6e444b 154 /**
kgills 0:b2219e6e444b 155 * @brief Get pressure reading.
kgills 0:b2219e6e444b 156 * @details Calculates the pressure using the data calibration data and formula.
kgills 0:b2219e6e444b 157 * Pressure is reported in Pascals.
kgills 0:b2219e6e444b 158 * @note This function should be called after calling startPressure().
kgills 0:b2219e6e444b 159 * Refer to the data sheet for the timing requirements. Calling this
kgills 0:b2219e6e444b 160 * function too soon can result in oversampling.
kgills 0:b2219e6e444b 161 *
kgills 0:b2219e6e444b 162 * @param pressure Pointer to store pressure reading.
kgills 0:b2219e6e444b 163 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 164 */
kgills 0:b2219e6e444b 165 int getPressure(int *pressure);
kgills 0:b2219e6e444b 166
kgills 0:b2219e6e444b 167 /**
kgills 0:b2219e6e444b 168 * @brief Start temperature conversion.
kgills 0:b2219e6e444b 169 * @details Initiates the temperature conversion sequence. Refer to data
kgills 0:b2219e6e444b 170 * sheet for timing specifications.
kgills 0:b2219e6e444b 171 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 172 */
kgills 0:b2219e6e444b 173 int startTemperature(void);
kgills 0:b2219e6e444b 174
kgills 0:b2219e6e444b 175 /**
kgills 0:b2219e6e444b 176 * @brief Get temperature reading.
kgills 0:b2219e6e444b 177 * @details Calculates the temperature using the data calibration data and formula.
kgills 0:b2219e6e444b 178 * Temperature is reported in degrees Celcius.
kgills 0:b2219e6e444b 179 *
kgills 0:b2219e6e444b 180 * @note This function should be called after calling startTemperature().
kgills 0:b2219e6e444b 181 * Refer to the data sheet for the timing requirements. Calling this
kgills 0:b2219e6e444b 182 * function too soon can result in oversampling.
kgills 0:b2219e6e444b 183 *
kgills 0:b2219e6e444b 184 * @param tempC Pointer to store temperature reading.
kgills 0:b2219e6e444b 185 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 186 */
kgills 0:b2219e6e444b 187 int getTemperature(float *tempC);
kgills 0:b2219e6e444b 188
kgills 0:b2219e6e444b 189 /**
kgills 0:b2219e6e444b 190 * @brief Get temperature reading.
kgills 0:b2219e6e444b 191 * @details Calculates the temperature using the data calibration data and formula.
kgills 0:b2219e6e444b 192 * Temperature is reported in 1/10ths degrees Celcius.
kgills 0:b2219e6e444b 193 *
kgills 0:b2219e6e444b 194 * @note This function should be called after calling startTemperature().
kgills 0:b2219e6e444b 195 * Refer to the data sheet for the timing requirements. Calling this
kgills 0:b2219e6e444b 196 * function too soon can result in oversampling.
kgills 0:b2219e6e444b 197 *
kgills 0:b2219e6e444b 198 * @param tempCx10 Pointer to store temperature reading.
kgills 0:b2219e6e444b 199 * @returns 0 if no errors, -1 if error.
kgills 0:b2219e6e444b 200 */
kgills 0:b2219e6e444b 201 int getTemperature(int16_t *tempCx10);
kgills 0:b2219e6e444b 202
kgills 0:b2219e6e444b 203 private:
kgills 0:b2219e6e444b 204
kgills 0:b2219e6e444b 205 typedef union {
kgills 0:b2219e6e444b 206 uint16_t value[11];
kgills 0:b2219e6e444b 207 struct {
kgills 0:b2219e6e444b 208 int16_t ac1;
kgills 0:b2219e6e444b 209 int16_t ac2;
kgills 0:b2219e6e444b 210 int16_t ac3;
kgills 0:b2219e6e444b 211 uint16_t ac4;
kgills 0:b2219e6e444b 212 uint16_t ac5;
kgills 0:b2219e6e444b 213 uint16_t ac6;
kgills 0:b2219e6e444b 214 int16_t b1;
kgills 0:b2219e6e444b 215 int16_t b2;
kgills 0:b2219e6e444b 216 int16_t mb;
kgills 0:b2219e6e444b 217 int16_t mc;
kgills 0:b2219e6e444b 218 int16_t md;
kgills 0:b2219e6e444b 219 };
kgills 0:b2219e6e444b 220 } calibration_t;
kgills 0:b2219e6e444b 221
kgills 0:b2219e6e444b 222 I2C *i2c_;
kgills 0:b2219e6e444b 223 bool i2c_owner;
kgills 0:b2219e6e444b 224
kgills 0:b2219e6e444b 225 BMP180::calibration_t calib;
kgills 0:b2219e6e444b 226 int32_t b5;
kgills 0:b2219e6e444b 227 BMP180::oversampling_t oss_;
kgills 0:b2219e6e444b 228 };
kgills 0:b2219e6e444b 229
kgills 0:b2219e6e444b 230 #endif /* _BMP180_H_ */