bme280, nRF51822 internal temperature, oled ssd1306 128x64. Короче сборный тест.

Dependencies:   mbed SSD1306_128x64_I2C BLE_API nRF51822 Buzzer

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?

UserRevisionLine numberNew 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__*/