Clemens Valens
/
bme280
Driver for Bosch Sensortec BME280 combined humidity and pressure sensor
bme280.h@0:b16a9b34fa4c, 2016-09-06 (annotated)
- 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?
User | Revision | Line number | New 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__*/ |