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