10bme280_drv::bme280_drv(
i2c_interface & i2c, uint8_t i2c_addr) : _i2c(i2c), _i2c_addr(i2c_addr){
11 get_calibration_data();
14void bme280_drv::soft_reset(){
15 writeRegister(BME280::REG_RESET, BME280::RESET);
18float bme280_drv::get_temperature(){
20 int32_t adc_T =
static_cast<int32_t
>(read_u24(BME280::REG_TEMP_MSB));
22 if (adc_T == 0x800000){
28 var1 = ((((adc_T>>3) - ((int32_t)_calibration_data.dig_T1 <<1))) * ((int32_t)_calibration_data.dig_T2)) >> 11;
30 var2 = (((((adc_T>>4) - ((int32_t)_calibration_data.dig_T1)) *
31 ((adc_T>>4) - ((int32_t)_calibration_data.dig_T1))) >> 12) *
32 ((int32_t)_calibration_data.dig_T3)) >> 14;
36 float T = (t_fine * 5 + 128) >> 8;
74float bme280_drv::get_pressure(){
76 int32_t adc_P = read_u24(BME280::REG_PRESS_MSB);
82 var1 = (t_fine >> 1) - 64000;
83 var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) *
static_cast<int32_t
>(_calibration_data.dig_P6);
84 var2 = var2 + ((var1 *
static_cast<int32_t
>(_calibration_data.dig_P5)) << 1);
85 var2 = (var2 >> 2) + (
static_cast<int32_t
>(_calibration_data.dig_P4) << 16);
86 var1 = (((_calibration_data.dig_P3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3) + (((
static_cast<int32_t
>(_calibration_data.dig_P2)) * var1) >> 1)) >> 18;
87 var1 = ((((32768 + var1)) * (
static_cast<int32_t
>(_calibration_data.dig_P1))) >> 15);
91 p = ((
static_cast<uint32_t
>(((int32_t)1048576) - adc_P) - (var2 >> 12))) * 3125;
93 p = (p << 1) /
static_cast<uint32_t
>(var1);
95 p = (p /
static_cast<uint32_t
>(var1)) * 2;
98 var1 = (
static_cast<int32_t
>(_calibration_data.dig_P9) *
static_cast<int32_t
>(((p >> 3) * (p >> 3)) >> 13)) >> 12;
99 var2 = (
static_cast<int32_t
>(p >> 2) *
static_cast<int32_t
>(_calibration_data.dig_P8)) >> 13;
100 p =
static_cast<uint32_t
>(
static_cast<int32_t
>(p) + ((var1 + var2 + _calibration_data.dig_P7) >> 4));
106float bme280_drv::get_humidity(){
107 int32_t adc_H = read_u16(BME280::REG_HUM_MSB);
108 if (adc_H == 0x8000){
114 v_x1_u32r = (t_fine - ((int32_t)76800));
116 v_x1_u32r = (((((adc_H << 14) - (((int32_t)_calibration_data.dig_H4) << 20) -
117 (((int32_t)_calibration_data.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) *
118 (((((((v_x1_u32r * ((int32_t)_calibration_data.dig_H6)) >> 10) *
119 (((v_x1_u32r * ((int32_t)_calibration_data.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) +
120 ((int32_t)2097152)) * ((int32_t)_calibration_data.dig_H2) + 8192) >> 14));
122 v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) *
123 ((int32_t)_calibration_data.dig_H1)) >> 4));
125 v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r;
126 v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r;
127 float h = (v_x1_u32r>>12);
132void bme280_drv::set_sampling(BME280::MODE m,
134 BME280::STANDBY_TIME t,
135 BME280::SAMPLING s_temp,
136 BME280::SAMPLING s_press,
137 BME280::SAMPLING s_hum){
138 uint8_t reg_conf =
static_cast<uint8_t
>(t) << 5 |
static_cast<uint8_t
>(f) << 2;
139 uint8_t reg_ctrl_meas =
static_cast<uint8_t
>(s_temp) << 5 |
static_cast<uint8_t
>(s_press) << 2 |
static_cast<uint8_t
>(m);
140 uint8_t reg_ctrl_hum =
static_cast<uint8_t
>(s_hum);
142 writeRegister(BME280::REG_CTRL_HUM, reg_ctrl_hum);
143 writeRegister(BME280::REG_CTRL_MEAS, reg_ctrl_meas);
144 writeRegister(BME280::REG_CONFIG, reg_conf);
147void bme280_drv::get_calibration_data(){
148 _calibration_data.dig_T1 = read_u16_le(BME280::REG_DIG_T1);
149 _calibration_data.dig_T2 = read_s16_le(BME280::REG_DIG_T2);
150 _calibration_data.dig_T3 = read_s16_le(BME280::REG_DIG_T3);
152 _calibration_data.dig_P1 = read_u16_le(BME280::REG_DIG_P1);
153 _calibration_data.dig_P2 = read_s16_le(BME280::REG_DIG_P2);
154 _calibration_data.dig_P3 = read_s16_le(BME280::REG_DIG_P3);
155 _calibration_data.dig_P4 = read_s16_le(BME280::REG_DIG_P4);
156 _calibration_data.dig_P5 = read_s16_le(BME280::REG_DIG_P5);
157 _calibration_data.dig_P6 = read_s16_le(BME280::REG_DIG_P6);
158 _calibration_data.dig_P7 = read_s16_le(BME280::REG_DIG_P7);
159 _calibration_data.dig_P8 = read_s16_le(BME280::REG_DIG_P8);
160 _calibration_data.dig_P9 = read_s16_le(BME280::REG_DIG_P9);
162 _calibration_data.dig_H1 = readRegister(BME280::REG_DIG_H1);
163 _calibration_data.dig_H2 = read_s16_le(BME280::REG_DIG_H2);
164 _calibration_data.dig_H3 = readRegister(BME280::REG_DIG_H3);
165 _calibration_data.dig_H4 = readRegister(BME280::REG_DIG_H4) << 4 | (readRegister(BME280::REG_DIG_H4+1) & 0b00001111);
166 _calibration_data.dig_H5 = readRegister(BME280::REG_DIG_H5+1) << 4 | readRegister(BME280::REG_DIG_H5) >> 4;
167 _calibration_data.dig_H6 =
static_cast<int8_t
>(readRegister(BME280::REG_DIG_H6));
170bool bme280_drv::detect_sensor() {
171 return (readRegister(BME280::REG_ID) == 0x60);
174void bme280_drv::writeRegister(uint8_t reg, uint8_t value){
178 _i2c.i2cWrite(_i2c_addr, txbuf, 2);
181uint8_t bme280_drv::readRegister(uint8_t reg){
185 _i2c.i2cWrite(_i2c_addr, txbuf, 1);
186 _i2c.i2cRead (_i2c_addr, rxbuf, 1);
190uint32_t bme280_drv::read_u24(uint8_t reg){
195 _i2c.i2cWrite(_i2c_addr, txbuf, 1);
196 _i2c.i2cRead (_i2c_addr, rxbuf, 3);
197 val = rxbuf[0] << 16 | rxbuf[1] << 8 | rxbuf[2];
201uint16_t bme280_drv::read_u16_le(uint8_t reg){
206 _i2c.i2cWrite(_i2c_addr, txbuf, 1);
207 _i2c.i2cRead (_i2c_addr, rxbuf, 2);
208 val = (rxbuf[1] << 8) | rxbuf[0];
212uint16_t bme280_drv::read_u16(uint8_t reg){
217 _i2c.i2cWrite(_i2c_addr, txbuf, 1);
218 _i2c.i2cRead (_i2c_addr, rxbuf, 2);
219 val = (rxbuf[0] << 8) | rxbuf[1];
223uint16_t bme280_drv::read_s16_le(uint8_t reg){
224 uint16_t val = read_u16_le(reg);
225 return static_cast<int16_t
>(val);