Driver for Bosch Sensortec BME280 combined humidity and pressure sensor

Dependencies:   mbed

Committer:
Clemo
Date:
Tue Sep 06 15:17:20 2016 +0000
Revision:
0:b16a9b34fa4c
First version, works for me

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Clemo 0:b16a9b34fa4c 1 /*
Clemo 0:b16a9b34fa4c 2 bme280.h - driver for Bosch Sensortec BME280 combined humidity and pressure sensor.
Clemo 0:b16a9b34fa4c 3
Clemo 0:b16a9b34fa4c 4 Copyright (c) 2015 Elektor
Clemo 0:b16a9b34fa4c 5
Clemo 0:b16a9b34fa4c 6 26/11/2015 - CPV, Initial release.
Clemo 0:b16a9b34fa4c 7
Clemo 0:b16a9b34fa4c 8 This library is free software; you can redistribute it and/or
Clemo 0:b16a9b34fa4c 9 modify it under the terms of the GNU Lesser General Public
Clemo 0:b16a9b34fa4c 10 License as published by the Free Software Foundation; either
Clemo 0:b16a9b34fa4c 11 version 2.1 of the License, or (at your option) any later version.
Clemo 0:b16a9b34fa4c 12
Clemo 0:b16a9b34fa4c 13 This library is distributed in the hope that it will be useful,
Clemo 0:b16a9b34fa4c 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
Clemo 0:b16a9b34fa4c 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Clemo 0:b16a9b34fa4c 16 Lesser General Public License for more details.
Clemo 0:b16a9b34fa4c 17
Clemo 0:b16a9b34fa4c 18 You should have received a copy of the GNU Lesser General
Clemo 0:b16a9b34fa4c 19 Public License along with this library; if not, write to the
Clemo 0:b16a9b34fa4c 20 Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Clemo 0:b16a9b34fa4c 21 Boston, MA 02111-1307 USA
Clemo 0:b16a9b34fa4c 22
Clemo 0:b16a9b34fa4c 23 */
Clemo 0:b16a9b34fa4c 24
Clemo 0:b16a9b34fa4c 25 #ifndef __BME280_H__
Clemo 0:b16a9b34fa4c 26 #define __BME280_H__
Clemo 0:b16a9b34fa4c 27
Clemo 0:b16a9b34fa4c 28 #include <stdint.h>
Clemo 0:b16a9b34fa4c 29
Clemo 0:b16a9b34fa4c 30
Clemo 0:b16a9b34fa4c 31 #define BME280_ALLOW_FLOAT (1)
Clemo 0:b16a9b34fa4c 32
Clemo 0:b16a9b34fa4c 33 #if BME280_ALLOW_FLOAT!=0
Clemo 0:b16a9b34fa4c 34 typedef double temperature_t;
Clemo 0:b16a9b34fa4c 35 typedef double pressure_t;
Clemo 0:b16a9b34fa4c 36 typedef double humidity_t;
Clemo 0:b16a9b34fa4c 37 #else
Clemo 0:b16a9b34fa4c 38 typedef int32_t temperature_t;
Clemo 0:b16a9b34fa4c 39 typedef uint32_t pressure_t;
Clemo 0:b16a9b34fa4c 40 typedef uint32_t humidity_t;
Clemo 0:b16a9b34fa4c 41 #endif /* BME280_ALLOW_FLOAT */
Clemo 0:b16a9b34fa4c 42
Clemo 0:b16a9b34fa4c 43
Clemo 0:b16a9b34fa4c 44 // Two possible addresses, depending on level on SDO pin.
Clemo 0:b16a9b34fa4c 45 #define BME280_I2C_ADDRESS1 (0x76)
Clemo 0:b16a9b34fa4c 46 #define BME280_I2C_ADDRESS2 (0x77)
Clemo 0:b16a9b34fa4c 47
Clemo 0:b16a9b34fa4c 48 // Calibration registers.
Clemo 0:b16a9b34fa4c 49 #define BME280_CAL_T1 (0x88)
Clemo 0:b16a9b34fa4c 50 #define BME280_CAL_T2 (0x8a)
Clemo 0:b16a9b34fa4c 51 #define BME280_CAL_T3 (0x8c)
Clemo 0:b16a9b34fa4c 52 #define BME280_CAL_P1 (0x8e)
Clemo 0:b16a9b34fa4c 53 #define BME280_CAL_P2 (0x90)
Clemo 0:b16a9b34fa4c 54 #define BME280_CAL_P3 (0x92)
Clemo 0:b16a9b34fa4c 55 #define BME280_CAL_P4 (0x94)
Clemo 0:b16a9b34fa4c 56 #define BME280_CAL_P5 (0x96)
Clemo 0:b16a9b34fa4c 57 #define BME280_CAL_P6 (0x98)
Clemo 0:b16a9b34fa4c 58 #define BME280_CAL_P7 (0x9a)
Clemo 0:b16a9b34fa4c 59 #define BME280_CAL_P8 (0x9c)
Clemo 0:b16a9b34fa4c 60 #define BME280_CAL_P9 (0x9e)
Clemo 0:b16a9b34fa4c 61 #define BME280_CAL_H1 (0xa1) /* 8 bits */
Clemo 0:b16a9b34fa4c 62 #define BME280_CAL_H2 (0xe1)
Clemo 0:b16a9b34fa4c 63 #define BME280_CAL_H3 (0xe3) /* 8 bits */
Clemo 0:b16a9b34fa4c 64 #define BME280_CAL_H4 (0xe4) /* 12 bits, combined with H45 */
Clemo 0:b16a9b34fa4c 65 #define BME280_CAL_H45 (0xe5) /* 12 bits, combined with H5 */
Clemo 0:b16a9b34fa4c 66 #define BME280_CAL_H5 (0xe6) /* 8 bits */
Clemo 0:b16a9b34fa4c 67 #define BME280_CAL_H6 (0xe7) /* 8 bits */
Clemo 0:b16a9b34fa4c 68
Clemo 0:b16a9b34fa4c 69 // Control registers.
Clemo 0:b16a9b34fa4c 70 #define BME280_ID_REGISTER (0xd0) /* 8 bits */
Clemo 0:b16a9b34fa4c 71 #define BME280_RESET_REGISTER (0xe0) /* 8 bits */
Clemo 0:b16a9b34fa4c 72 #define BME280_CTRL_HUM_REGISTER (0xf2) /* 8 bits */
Clemo 0:b16a9b34fa4c 73 #define BME280_STATUS_REGISTER (0xf3) /* 8 bits */
Clemo 0:b16a9b34fa4c 74 #define BME280_CTRL_MEAS_REGISTER (0xf4) /* 8 bits */
Clemo 0:b16a9b34fa4c 75 #define BME280_CONFIG_REGISTER (0xf5) /* 8 bits */
Clemo 0:b16a9b34fa4c 76
Clemo 0:b16a9b34fa4c 77 // Measurement registers.
Clemo 0:b16a9b34fa4c 78 #define BME280_PRESSURE (0xf7) /* 20 bits */
Clemo 0:b16a9b34fa4c 79 #define BME280_PRESSURE_MSB (0xf7) /* 8 bits */
Clemo 0:b16a9b34fa4c 80 #define BME280_PRESSURE_LSB (0xf8) /* 8 bits */
Clemo 0:b16a9b34fa4c 81 #define BME280_PRESSURE_XLSB (0xf9) /* 8 bits */
Clemo 0:b16a9b34fa4c 82 #define BME280_TEMPERATURE (0xfa) /* 20 bits */
Clemo 0:b16a9b34fa4c 83 #define BME280_TEMPERATURE_MSB (0xfa) /* 8 bits */
Clemo 0:b16a9b34fa4c 84 #define BME280_TEMPERATURE_LSB (0xfb) /* 8 bits */
Clemo 0:b16a9b34fa4c 85 #define BME280_TEMPERATURE_XLSB (0xfc) /* 8 bits */
Clemo 0:b16a9b34fa4c 86 #define BME280_HUMIDITY (0xfd) /* 16 bits */
Clemo 0:b16a9b34fa4c 87 #define BME280_HUMIDITY_MSB (0xfd) /* 8 bits */
Clemo 0:b16a9b34fa4c 88 #define BME280_HUMIDITY_LSB (0xfe) /* 8 bits */
Clemo 0:b16a9b34fa4c 89
Clemo 0:b16a9b34fa4c 90 // It is recommended to read all the measurements in one go.
Clemo 0:b16a9b34fa4c 91 #define BME280_MEASUREMENT_REGISTER (BME280_PRESSURE)
Clemo 0:b16a9b34fa4c 92 #define BME280_MEASUREMENT_SIZE (8)
Clemo 0:b16a9b34fa4c 93
Clemo 0:b16a9b34fa4c 94 // Values for osrs_p & osrs_t fields of CTRL_MEAS register.
Clemo 0:b16a9b34fa4c 95 #define BME280_SKIP (0)
Clemo 0:b16a9b34fa4c 96 #define BME280_OVERSAMPLING_1X (1)
Clemo 0:b16a9b34fa4c 97 #define BME280_OVERSAMPLING_2X (2)
Clemo 0:b16a9b34fa4c 98 #define BME280_OVERSAMPLING_4X (3)
Clemo 0:b16a9b34fa4c 99 #define BME280_OVERSAMPLING_8X (4)
Clemo 0:b16a9b34fa4c 100 #define BME280_OVERSAMPLING_16X (5)
Clemo 0:b16a9b34fa4c 101
Clemo 0:b16a9b34fa4c 102 // Values for mode field of CTRL_MEAS register.
Clemo 0:b16a9b34fa4c 103 #define BME280_MODE_SLEEP (0)
Clemo 0:b16a9b34fa4c 104 #define BME280_MODE_FORCED (1)
Clemo 0:b16a9b34fa4c 105 #define BME280_MODE_NORMAL (3)
Clemo 0:b16a9b34fa4c 106
Clemo 0:b16a9b34fa4c 107 // Value for RESET register.
Clemo 0:b16a9b34fa4c 108 #define BME280_RESET (0xb6)
Clemo 0:b16a9b34fa4c 109
Clemo 0:b16a9b34fa4c 110 // Value of ID register.
Clemo 0:b16a9b34fa4c 111 #define BME280_ID (0x60)
Clemo 0:b16a9b34fa4c 112
Clemo 0:b16a9b34fa4c 113 // Values for t_sb field of CONFIG register
Clemo 0:b16a9b34fa4c 114 #define BME280_STANDBY_500_US (0)
Clemo 0:b16a9b34fa4c 115 #define BME280_STANDBY_10_MS (6)
Clemo 0:b16a9b34fa4c 116 #define BME280_STANDBY_20_MS (7)
Clemo 0:b16a9b34fa4c 117 #define BME280_STANDBY_63_MS (1)
Clemo 0:b16a9b34fa4c 118 #define BME280_STANDBY_125_MS (2)
Clemo 0:b16a9b34fa4c 119 #define BME280_STANDBY_250_MS (3)
Clemo 0:b16a9b34fa4c 120 #define BME280_STANDBY_500_MS (4)
Clemo 0:b16a9b34fa4c 121 #define BME280_STANDBY_1000_MS (5)
Clemo 0:b16a9b34fa4c 122
Clemo 0:b16a9b34fa4c 123 // Values for filter field of CONFIG register
Clemo 0:b16a9b34fa4c 124 #define BME280_FILTER_OFF (0)
Clemo 0:b16a9b34fa4c 125 #define BME280_FILTER_COEFF_2 (1)
Clemo 0:b16a9b34fa4c 126 #define BME280_FILTER_COEFF_4 (2)
Clemo 0:b16a9b34fa4c 127 #define BME280_FILTER_COEFF_8 (3)
Clemo 0:b16a9b34fa4c 128 #define BME280_FILTER_COEFF_16 (4)
Clemo 0:b16a9b34fa4c 129
Clemo 0:b16a9b34fa4c 130
Clemo 0:b16a9b34fa4c 131 // I2C write function must support repeated start to avoid interruption of transactions.
Clemo 0:b16a9b34fa4c 132 // User-provided function to write data_size bytes from buffer p_data to I2C device at bus address i2c_address.
Clemo 0:b16a9b34fa4c 133 // Provide empty function if not used.
Clemo 0:b16a9b34fa4c 134 extern void i2cWrite(uint8_t i2c_address, uint8_t *p_data, uint8_t data_size, uint8_t repeated_start);
Clemo 0:b16a9b34fa4c 135 // User-provided function to read data_size bytes from I2C device at bus address i2c_address to buffer p_data.
Clemo 0:b16a9b34fa4c 136 // Provide empty function if not used.
Clemo 0:b16a9b34fa4c 137 extern void i2cRead(uint8_t i2c_address, uint8_t *p_data, uint8_t data_size);
Clemo 0:b16a9b34fa4c 138
Clemo 0:b16a9b34fa4c 139 // SPI functions must activate (make low) BME280 CSB pin before doing a transfer
Clemo 0:b16a9b34fa4c 140 // and deactivate it (make high) when done.
Clemo 0:b16a9b34fa4c 141 // User-provided function to write data_size bytes from buffer p_data to SPI device.
Clemo 0:b16a9b34fa4c 142 // Provide empty function if not used.
Clemo 0:b16a9b34fa4c 143 extern void spiWrite(uint8_t *p_data, uint8_t data_size);
Clemo 0:b16a9b34fa4c 144 // User-provided function to read data_size bytes from SPI device to buffer p_data.
Clemo 0:b16a9b34fa4c 145 // Provide empty function if not used.
Clemo 0:b16a9b34fa4c 146 extern void spiRead(uint8_t *p_data, uint8_t data_size);
Clemo 0:b16a9b34fa4c 147
Clemo 0:b16a9b34fa4c 148
Clemo 0:b16a9b34fa4c 149 class BME280
Clemo 0:b16a9b34fa4c 150 {
Clemo 0:b16a9b34fa4c 151 public:
Clemo 0:b16a9b34fa4c 152 BME280(void);
Clemo 0:b16a9b34fa4c 153 uint8_t begin(uint8_t i2cAddress=0); // I2C address not set means SPI.
Clemo 0:b16a9b34fa4c 154
Clemo 0:b16a9b34fa4c 155 void readCalibrationData(void);
Clemo 0:b16a9b34fa4c 156 uint8_t readId(void);
Clemo 0:b16a9b34fa4c 157 uint8_t readFrom(uint8_t reg, uint8_t data_size, uint8_t *p_data);
Clemo 0:b16a9b34fa4c 158
Clemo 0:b16a9b34fa4c 159 void read(void);
Clemo 0:b16a9b34fa4c 160
Clemo 0:b16a9b34fa4c 161 // If using floating points, values are scaled, if not then
Clemo 0:b16a9b34fa4c 162 // temperature is 100*T, pressure is Pa en humidity is 1024*%RH
Clemo 0:b16a9b34fa4c 163 temperature_t temperature(void) { return _temperature; } // [degrees Celsius] or 100*[degrees Celsius]
Clemo 0:b16a9b34fa4c 164 pressure_t pressure(void) { return _pressure; } // [Pa]
Clemo 0:b16a9b34fa4c 165 humidity_t humidity(void) { return _humidity; } // [%RH] or 1024*[%RH]
Clemo 0:b16a9b34fa4c 166
Clemo 0:b16a9b34fa4c 167 void writeControlRegisters(uint8_t osrs_t, uint8_t osrs_p, uint8_t osrs_h, uint8_t mode);
Clemo 0:b16a9b34fa4c 168 void writeConfigRegister(uint8_t t_sb, uint8_t filter, uint8_t spi);
Clemo 0:b16a9b34fa4c 169
Clemo 0:b16a9b34fa4c 170 void reset(void);
Clemo 0:b16a9b34fa4c 171
Clemo 0:b16a9b34fa4c 172 private:
Clemo 0:b16a9b34fa4c 173 uint8_t _i2c_address;
Clemo 0:b16a9b34fa4c 174
Clemo 0:b16a9b34fa4c 175 void busWrite(uint8_t *p_data, uint8_t data_size, uint8_t repeated_start);
Clemo 0:b16a9b34fa4c 176 void busRead(uint8_t *p_data, uint8_t data_size);
Clemo 0:b16a9b34fa4c 177
Clemo 0:b16a9b34fa4c 178 // Calibration data.
Clemo 0:b16a9b34fa4c 179 uint16_t _dig_T1;
Clemo 0:b16a9b34fa4c 180 int16_t _dig_T2;
Clemo 0:b16a9b34fa4c 181 int16_t _dig_T3;
Clemo 0:b16a9b34fa4c 182 uint16_t _dig_P1;
Clemo 0:b16a9b34fa4c 183 int16_t _dig_P2;
Clemo 0:b16a9b34fa4c 184 int16_t _dig_P3;
Clemo 0:b16a9b34fa4c 185 int16_t _dig_P4;
Clemo 0:b16a9b34fa4c 186 int16_t _dig_P5;
Clemo 0:b16a9b34fa4c 187 int16_t _dig_P6;
Clemo 0:b16a9b34fa4c 188 int16_t _dig_P7;
Clemo 0:b16a9b34fa4c 189 int16_t _dig_P8;
Clemo 0:b16a9b34fa4c 190 int16_t _dig_P9;
Clemo 0:b16a9b34fa4c 191 uint8_t _dig_H1;
Clemo 0:b16a9b34fa4c 192 int16_t _dig_H2;
Clemo 0:b16a9b34fa4c 193 uint8_t _dig_H3;
Clemo 0:b16a9b34fa4c 194 int16_t _dig_H4;
Clemo 0:b16a9b34fa4c 195 int16_t _dig_H5;
Clemo 0:b16a9b34fa4c 196 int8_t _dig_H6;
Clemo 0:b16a9b34fa4c 197 void clearCalibrationData(void);
Clemo 0:b16a9b34fa4c 198
Clemo 0:b16a9b34fa4c 199 uint8_t readUint8(uint8_t reg);
Clemo 0:b16a9b34fa4c 200 uint16_t readUint16(uint8_t reg);
Clemo 0:b16a9b34fa4c 201
Clemo 0:b16a9b34fa4c 202 int32_t assembleRawValue(uint8_t *p_data, uint8_t has_xlsb);
Clemo 0:b16a9b34fa4c 203
Clemo 0:b16a9b34fa4c 204 int32_t _t_fine;
Clemo 0:b16a9b34fa4c 205
Clemo 0:b16a9b34fa4c 206 temperature_t compensateTemperature(int32_t adc_T);
Clemo 0:b16a9b34fa4c 207 pressure_t compensatePressure(int32_t adc_P);
Clemo 0:b16a9b34fa4c 208 humidity_t compensateHumidity(int32_t adc_H);
Clemo 0:b16a9b34fa4c 209
Clemo 0:b16a9b34fa4c 210 temperature_t _temperature;
Clemo 0:b16a9b34fa4c 211 pressure_t _pressure;
Clemo 0:b16a9b34fa4c 212 humidity_t _humidity;
Clemo 0:b16a9b34fa4c 213 };
Clemo 0:b16a9b34fa4c 214
Clemo 0:b16a9b34fa4c 215
Clemo 0:b16a9b34fa4c 216 #endif /* __BME280_H__*/