BME680 is an integrated environmental sensor developed specifically for mobile applications and wearables where size and low power consumption are key requirements.

Dependents:   Example_DS3231_test

Committer:
yangcq88517
Date:
Wed Aug 03 15:07:42 2016 +0000
Revision:
1:85088a918342
Parent:
0:c70b7ececf93
add three different mod

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yangcq88517 0:c70b7ececf93 1 #include "BME680.h"
yangcq88517 0:c70b7ececf93 2
yangcq88517 0:c70b7ececf93 3 // no idea why this is not the same as the PDF
yangcq88517 0:c70b7ececf93 4 //const double BME680::const_array1[16] = {1,1,1,1,1,0.99,1,0.992,1,1,0.998,0.995,1,0.99,1,1};
yangcq88517 0:c70b7ececf93 5 //const double BME680::const_array2[16] = {8000000,4000000,2000000,1000000,499500.4995,248262.1648,125000,63004.03226,31281.28128,15625,7812.5,3906.25,1953.125,976.5625,488.28125,244.140625};
yangcq88517 0:c70b7ececf93 6
yangcq88517 0:c70b7ececf93 7 const uint64_t BME680::lookup_k1_range[16] = {
yangcq88517 1:85088a918342 8 2147483647UL, 2147483647UL, 2147483647UL, 2147483647UL, 2147483647UL,
yangcq88517 1:85088a918342 9 2126008810UL, 2147483647UL, 2130303777UL, 2147483647UL, 2147483647UL,
yangcq88517 1:85088a918342 10 2143188679UL, 2136746228UL, 2147483647UL, 2126008810UL, 2147483647UL,
yangcq88517 1:85088a918342 11 2147483647UL
yangcq88517 1:85088a918342 12 };
yangcq88517 0:c70b7ececf93 13
yangcq88517 0:c70b7ececf93 14 const uint64_t BME680::lookup_k2_range[16] = {
yangcq88517 1:85088a918342 15 4096000000UL, 2048000000UL, 1024000000UL, 512000000UL,
yangcq88517 1:85088a918342 16 255744255UL, 127110228UL, 64000000UL, 32258064UL, 16016016UL,
yangcq88517 1:85088a918342 17 8000000UL, 4000000UL, 2000000UL, 1000000UL, 500000UL, 250000UL,
yangcq88517 1:85088a918342 18 125000UL
yangcq88517 1:85088a918342 19 };
yangcq88517 0:c70b7ececf93 20
yangcq88517 0:c70b7ececf93 21 const double BME680::_lookup_k1_range[BME680_GAS_RANGE_RL_LENGTH] = {
yangcq88517 0:c70b7ececf93 22 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -0.8,
yangcq88517 0:c70b7ececf93 23 0.0, 0.0, -0.2, -0.5, 0.0, -1.0, 0.0, 0.0
yangcq88517 0:c70b7ececf93 24 };
yangcq88517 1:85088a918342 25
yangcq88517 0:c70b7ececf93 26 const double BME680::_lookup_k2_range[BME680_GAS_RANGE_RL_LENGTH] = {
yangcq88517 0:c70b7ececf93 27 0.0, 0.0, 0.0, 0.0, 0.1, 0.7, 0.0, -0.8,
yangcq88517 0:c70b7ececf93 28 -0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
yangcq88517 0:c70b7ececf93 29 };
yangcq88517 0:c70b7ececf93 30
yangcq88517 1:85088a918342 31 void BME680::setParallelMode()
yangcq88517 1:85088a918342 32 {
yangcq88517 1:85088a918342 33 //Select oversampling for T, P, H
yangcq88517 1:85088a918342 34 setOversamplingTemperature(2);
yangcq88517 1:85088a918342 35 setOversamplingPressure(5);
yangcq88517 1:85088a918342 36 setOversamplingHumidity(1);
yangcq88517 1:85088a918342 37
yangcq88517 1:85088a918342 38 //Select IIR filter for pressure & temperature
yangcq88517 1:85088a918342 39 setIIRfilterCoefficient(0);
yangcq88517 1:85088a918342 40
yangcq88517 1:85088a918342 41 //Enable gas coversion
yangcq88517 1:85088a918342 42 runGasConversion();
yangcq88517 1:85088a918342 43
yangcq88517 1:85088a918342 44 //Select heater set-points to be used
yangcq88517 1:85088a918342 45 setHeaterProfile(1);
yangcq88517 1:85088a918342 46
yangcq88517 1:85088a918342 47 //Set wait time between TPHG submeasurements
yangcq88517 1:85088a918342 48 //Set gas_wait_shared<7:0> (time base unit is 0.477ms)
yangcq88517 1:85088a918342 49 setGasWaitShared(32, 1);
yangcq88517 1:85088a918342 50
yangcq88517 1:85088a918342 51 //Define heater-on times
yangcq88517 1:85088a918342 52 //Convert durations to register codes
yangcq88517 1:85088a918342 53 //Set gas_wait_x<7:0> (time base unit is ms)
yangcq88517 1:85088a918342 54 setGasWaitTime(0,25,4);
yangcq88517 1:85088a918342 55
yangcq88517 1:85088a918342 56 #ifdef FIXED_POINT_COMPENSATION
yangcq88517 1:85088a918342 57 setTargetHeaterResistance(0, convertTemperatureResistanceInt(350,30));
yangcq88517 1:85088a918342 58 #else
yangcq88517 1:85088a918342 59 setTargetHeaterResistance(0, convertTemperatureResistanceDouble(350,30));
yangcq88517 1:85088a918342 60 #endif
yangcq88517 1:85088a918342 61
yangcq88517 1:85088a918342 62 setMode(2);
yangcq88517 1:85088a918342 63 }
yangcq88517 1:85088a918342 64
yangcq88517 1:85088a918342 65 void BME680::setForcedMode()
yangcq88517 1:85088a918342 66 {
yangcq88517 1:85088a918342 67 //Select oversampling for T, P, H
yangcq88517 1:85088a918342 68 setOversamplingTemperature(2);
yangcq88517 1:85088a918342 69 setOversamplingPressure(5);
yangcq88517 1:85088a918342 70 setOversamplingHumidity(1);
yangcq88517 1:85088a918342 71
yangcq88517 1:85088a918342 72 //Select IIR filter for pressure & temperature
yangcq88517 1:85088a918342 73 setIIRfilterCoefficient(0);
yangcq88517 1:85088a918342 74
yangcq88517 1:85088a918342 75 //Enable gas coversion
yangcq88517 1:85088a918342 76 runGasConversion();
yangcq88517 1:85088a918342 77
yangcq88517 1:85088a918342 78 //Select heater set-points to be used
yangcq88517 1:85088a918342 79 setHeaterProfile(1);
yangcq88517 1:85088a918342 80
yangcq88517 1:85088a918342 81 //Define heater-on times
yangcq88517 1:85088a918342 82 //Convert durations to register codes
yangcq88517 1:85088a918342 83 //Set gas_wait_x<7:0> (time base unit is ms)
yangcq88517 1:85088a918342 84 setGasWaitTime(0,25,4);
yangcq88517 1:85088a918342 85
yangcq88517 1:85088a918342 86 #ifdef FIXED_POINT_COMPENSATION
yangcq88517 1:85088a918342 87 setTargetHeaterResistance(0, convertTemperatureResistanceInt(350,30));
yangcq88517 1:85088a918342 88 #else
yangcq88517 1:85088a918342 89 setTargetHeaterResistance(0, convertTemperatureResistanceDouble(350,30));
yangcq88517 1:85088a918342 90 #endif
yangcq88517 1:85088a918342 91
yangcq88517 1:85088a918342 92 //Set mode to sequential mode
yangcq88517 1:85088a918342 93 //Set mode<1:0> to 0b01
yangcq88517 1:85088a918342 94 setMode(1);
yangcq88517 1:85088a918342 95 }
yangcq88517 1:85088a918342 96
yangcq88517 1:85088a918342 97 void BME680::setSequentialMode()
yangcq88517 1:85088a918342 98 {
yangcq88517 1:85088a918342 99 //Select stand-by time between measurements
yangcq88517 1:85088a918342 100 setWakePeriod(1);
yangcq88517 1:85088a918342 101
yangcq88517 1:85088a918342 102 //Select oversampling for T, P, H
yangcq88517 1:85088a918342 103 setOversamplingTemperature(2);
yangcq88517 1:85088a918342 104 setOversamplingPressure(5);
yangcq88517 1:85088a918342 105 setOversamplingHumidity(1);
yangcq88517 1:85088a918342 106
yangcq88517 1:85088a918342 107 //Select IIR filter for pressure & temperature
yangcq88517 1:85088a918342 108 setIIRfilterCoefficient(0);
yangcq88517 1:85088a918342 109
yangcq88517 1:85088a918342 110 //Enable gas coversion
yangcq88517 1:85088a918342 111 runGasConversion();
yangcq88517 1:85088a918342 112
yangcq88517 1:85088a918342 113 //Select heater set-points to be used
yangcq88517 1:85088a918342 114 setHeaterProfile(1);
yangcq88517 1:85088a918342 115
yangcq88517 1:85088a918342 116 //Define heater-on times
yangcq88517 1:85088a918342 117 //Convert durations to register codes
yangcq88517 1:85088a918342 118 //Set gas_wait_x<7:0> (time base unit is ms)
yangcq88517 1:85088a918342 119 setGasWaitTime(0,25,4);
yangcq88517 1:85088a918342 120
yangcq88517 1:85088a918342 121 //Set heater temperatures
yangcq88517 1:85088a918342 122 //Convert temperature to register code
yangcq88517 1:85088a918342 123 //Set res_heat_x<7:0>
yangcq88517 1:85088a918342 124
yangcq88517 1:85088a918342 125 #ifdef FIXED_POINT_COMPENSATION
yangcq88517 1:85088a918342 126 setTargetHeaterResistance(0, convertTemperatureResistanceInt(350,30));
yangcq88517 1:85088a918342 127 #else
yangcq88517 1:85088a918342 128 setTargetHeaterResistance(0, convertTemperatureResistanceDouble(350,30));
yangcq88517 1:85088a918342 129 #endif
yangcq88517 1:85088a918342 130
yangcq88517 1:85088a918342 131 //Set mode to sequential mode
yangcq88517 1:85088a918342 132 //Set mode<1:0> to 0b11
yangcq88517 1:85088a918342 133 setMode(3);
yangcq88517 1:85088a918342 134 }
yangcq88517 0:c70b7ececf93 135
yangcq88517 0:c70b7ececf93 136 #ifdef FIXED_POINT_COMPENSATION
yangcq88517 0:c70b7ececf93 137 int32_t BME680::getCompensatedTemperature(int field)
yangcq88517 0:c70b7ececf93 138 {
yangcq88517 1:85088a918342 139 uint32_t v_uncomp_temperature_u32 = getUncompensatedTemp1Data(field);
yangcq88517 0:c70b7ececf93 140
yangcq88517 0:c70b7ececf93 141 int32_t var1 = ((int32_t)v_uncomp_temperature_u32 >> 3) - ((int32_t)(par_T1 << 1));
yangcq88517 0:c70b7ececf93 142 int32_t var2 = (var1 * (int32_t) par_T2) >> 11;
yangcq88517 0:c70b7ececf93 143 int32_t var3 = ((((var1 >> 1) * (var1 >> 1)) >> 12) * ((int32_t)(par_T3 << 4))) >> 14;
yangcq88517 0:c70b7ececf93 144 t_fine = var2 + var3;
yangcq88517 0:c70b7ececf93 145 return ((t_fine * 5) + 128) >> 8;
yangcq88517 0:c70b7ececf93 146 }
yangcq88517 0:c70b7ececf93 147
yangcq88517 0:c70b7ececf93 148 int16_t BME680::getTemperatureInt(int field)
yangcq88517 0:c70b7ececf93 149 {
yangcq88517 0:c70b7ececf93 150 getCompensatedTemperature(field);
yangcq88517 0:c70b7ececf93 151 return (((t_fine - 122880) * 25) + 128) >> 8;
yangcq88517 0:c70b7ececf93 152 }
yangcq88517 0:c70b7ececf93 153
yangcq88517 0:c70b7ececf93 154 int32_t BME680::getCompensateHumidity(int field)
yangcq88517 0:c70b7ececf93 155 {
yangcq88517 1:85088a918342 156 uint32_t v_uncomp_humidity_u32 = getUncompensatedHumidityData(field);
yangcq88517 0:c70b7ececf93 157
yangcq88517 0:c70b7ececf93 158 int32_t temp_scaled = (t_fine * 5 + 128) >> 8;
yangcq88517 0:c70b7ececf93 159 int32_t var1 = (int32_t)v_uncomp_humidity_u32 -
yangcq88517 0:c70b7ececf93 160 ((int32_t)((int32_t)par_H1 << 4)) -
yangcq88517 0:c70b7ececf93 161 (((temp_scaled * (int32_t)par_H3) /
yangcq88517 0:c70b7ececf93 162 ((int32_t)100)) >> 1);
yangcq88517 0:c70b7ececf93 163
yangcq88517 0:c70b7ececf93 164 int32_t var2 = ((int32_t)par_H2 *
yangcq88517 0:c70b7ececf93 165 (((temp_scaled * (int32_t)par_H4) /
yangcq88517 0:c70b7ececf93 166 ((int32_t)100)) + (((temp_scaled *
yangcq88517 0:c70b7ececf93 167 ((temp_scaled * (int32_t)par_H5) /
yangcq88517 0:c70b7ececf93 168 ((int32_t)100))) >> 6) / ((int32_t)100)) + (int32_t)(1 << 14))) >> 10;
yangcq88517 0:c70b7ececf93 169
yangcq88517 0:c70b7ececf93 170 int32_t var3 = var1 * var2;
yangcq88517 0:c70b7ececf93 171
yangcq88517 0:c70b7ececf93 172 int32_t var4 = ((((int32_t)par_H6) << 7) +
yangcq88517 0:c70b7ececf93 173 ((temp_scaled * (int32_t)par_H7) /
yangcq88517 0:c70b7ececf93 174 ((int32_t)100))) >> 4;
yangcq88517 0:c70b7ececf93 175
yangcq88517 0:c70b7ececf93 176 int32_t var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
yangcq88517 0:c70b7ececf93 177 int32_t var6 = (var4 * var5) >> 1;
yangcq88517 0:c70b7ececf93 178
yangcq88517 0:c70b7ececf93 179 int32_t humidity_comp = (var3 + var6) >> 12;
yangcq88517 0:c70b7ececf93 180 if (humidity_comp > BME680_MAX_HUMIDITY_VALUE)
yangcq88517 0:c70b7ececf93 181 humidity_comp = BME680_MAX_HUMIDITY_VALUE;
yangcq88517 0:c70b7ececf93 182 else if (humidity_comp < BME680_MIN_HUMIDITY_VALUE)
yangcq88517 0:c70b7ececf93 183 humidity_comp = BME680_MIN_HUMIDITY_VALUE;
yangcq88517 0:c70b7ececf93 184
yangcq88517 0:c70b7ececf93 185 return humidity_comp;
yangcq88517 0:c70b7ececf93 186 }
yangcq88517 0:c70b7ececf93 187
yangcq88517 0:c70b7ececf93 188 uint16_t BME680::getHumidityInt(int field)
yangcq88517 0:c70b7ececf93 189 {
yangcq88517 0:c70b7ececf93 190 uint32_t v_x1_u32 = (uint32_t) getCompensateHumidity(field);
yangcq88517 0:c70b7ececf93 191 uint16_t v_x2_u32 = (uint16_t)(v_x1_u32 >> 1);
yangcq88517 0:c70b7ececf93 192 return v_x2_u32;
yangcq88517 0:c70b7ececf93 193 }
yangcq88517 0:c70b7ececf93 194
yangcq88517 0:c70b7ececf93 195 int32_t BME680::getCompensatePressure(int field)
yangcq88517 0:c70b7ececf93 196 {
yangcq88517 1:85088a918342 197 uint32_t v_uncomp_pressure_u32 = getUncompensatedPressureData(field);
yangcq88517 0:c70b7ececf93 198
yangcq88517 0:c70b7ececf93 199 int32_t var1 = (((int32_t)t_fine) >> 1) - 64000;
yangcq88517 0:c70b7ececf93 200 int32_t var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * (int32_t)par_P6) >> 2;
yangcq88517 0:c70b7ececf93 201 var2 = var2 + ((var1 * (int32_t)par_P5) << 1);
yangcq88517 0:c70b7ececf93 202 var2 = (var2 >> 2) + ((int32_t)par_P4 << 16);
yangcq88517 0:c70b7ececf93 203 var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
yangcq88517 0:c70b7ececf93 204 ((int32_t)par_P3 << 5)) >> 3) +
yangcq88517 0:c70b7ececf93 205 (((int32_t)par_P2 * var1) >> 1);
yangcq88517 0:c70b7ececf93 206 var1 = var1 >> 18;
yangcq88517 0:c70b7ececf93 207 var1 = ((32768 + var1) * (int32_t)par_P1) >> 15;
yangcq88517 0:c70b7ececf93 208 int32_t pressure_comp = 1048576 - v_uncomp_pressure_u32;
yangcq88517 0:c70b7ececf93 209 pressure_comp = (int32_t)((pressure_comp - (var2 >> 12)) * ((int32_t)3125));
yangcq88517 0:c70b7ececf93 210 int32_t var4 = (1 << 31);
yangcq88517 0:c70b7ececf93 211 if (pressure_comp >= var4)
yangcq88517 0:c70b7ececf93 212 pressure_comp = ((pressure_comp / (int32_t)var1) << 1);
yangcq88517 0:c70b7ececf93 213 else
yangcq88517 0:c70b7ececf93 214 pressure_comp = ((pressure_comp << 1) / (int32_t)var1);
yangcq88517 0:c70b7ececf93 215 var1 = ((int32_t)par_P9 * (int32_t)(((pressure_comp >> 3) *
yangcq88517 0:c70b7ececf93 216 (pressure_comp >> 3)) >> 13)) >> 12;
yangcq88517 0:c70b7ececf93 217 var2 = ((int32_t)(pressure_comp >> 2) *
yangcq88517 0:c70b7ececf93 218 (int32_t)par_P8) >> 13;
yangcq88517 0:c70b7ececf93 219 int32_t var3 = ((int32_t)(pressure_comp >> 8) * (int32_t)(pressure_comp >> 8) *
yangcq88517 0:c70b7ececf93 220 (int32_t)(pressure_comp >> 8) *
yangcq88517 0:c70b7ececf93 221 (int32_t)par_P10) >> 17;
yangcq88517 0:c70b7ececf93 222
yangcq88517 0:c70b7ececf93 223 pressure_comp = (int32_t)(pressure_comp) + ((var1 + var2 + var3 +
yangcq88517 0:c70b7ececf93 224 ((int32_t)par_P7 << 7)) >> 4);
yangcq88517 0:c70b7ececf93 225
yangcq88517 0:c70b7ececf93 226 return pressure_comp;
yangcq88517 0:c70b7ececf93 227 }
yangcq88517 0:c70b7ececf93 228
yangcq88517 0:c70b7ececf93 229 uint32_t BME680::getPressureInt(int field)
yangcq88517 0:c70b7ececf93 230 {
yangcq88517 0:c70b7ececf93 231 uint32_t pressure = (uint32_t)getCompensatePressure(field);
yangcq88517 0:c70b7ececf93 232 pressure = (uint32_t)(pressure >> 1);
yangcq88517 0:c70b7ececf93 233 return pressure;
yangcq88517 0:c70b7ececf93 234 }
yangcq88517 0:c70b7ececf93 235
yangcq88517 0:c70b7ececf93 236 uint8_t BME680::convertTemperatureResistanceInt(uint16_t heater, int16_t ambient)
yangcq88517 0:c70b7ececf93 237 {
yangcq88517 0:c70b7ececf93 238 uint8_t res_heat = 0;
yangcq88517 0:c70b7ececf93 239
yangcq88517 0:c70b7ececf93 240
yangcq88517 0:c70b7ececf93 241 if ((heater >= BME680_GAS_PROFILE_TEMPERATURE_MIN)
yangcq88517 0:c70b7ececf93 242 && (heater <= BME680_GAS_PROFILE_TEMPERATURE_MAX)) {
yangcq88517 0:c70b7ececf93 243
yangcq88517 0:c70b7ececf93 244 int32_t var1 = (((int32_t)ambient * par_GH3) / 10) << 8;
yangcq88517 0:c70b7ececf93 245 int32_t var2 = (par_GH1 + 784) *
yangcq88517 0:c70b7ececf93 246 (((((par_GH2 + 154009) *
yangcq88517 0:c70b7ececf93 247 heater * 5) / 100) + 3276800) / 10);
yangcq88517 0:c70b7ececf93 248 int32_t var3 = var1 + (var2 >> 1);
yangcq88517 0:c70b7ececf93 249 int32_t var4 = (var3 / (res_heat_range + 4));
yangcq88517 0:c70b7ececf93 250
yangcq88517 0:c70b7ececf93 251 int32_t var5 = (131 * res_heat_val) + 65536;
yangcq88517 0:c70b7ececf93 252
yangcq88517 0:c70b7ececf93 253 int32_t res_heat_x100 = (int32_t)(((var4 / var5) - 250) * 34);
yangcq88517 0:c70b7ececf93 254 res_heat = (uint8_t) ((res_heat_x100 + 50) / 100);
yangcq88517 0:c70b7ececf93 255
yangcq88517 0:c70b7ececf93 256 }
yangcq88517 0:c70b7ececf93 257 return res_heat;
yangcq88517 0:c70b7ececf93 258 }
yangcq88517 0:c70b7ececf93 259
yangcq88517 0:c70b7ececf93 260 int32_t BME680::getCalculateGasInt(int field)
yangcq88517 0:c70b7ececf93 261 {
yangcq88517 0:c70b7ececf93 262 uint8_t gas_range_u8 = getGasResistanceRange(field);
yangcq88517 1:85088a918342 263 uint16_t gas_adc_u16 = getUncompensatedGasResistanceData(field);
yangcq88517 0:c70b7ececf93 264
yangcq88517 0:c70b7ececf93 265 int64_t var1 = (int64_t)((1340 + (5 * (int64_t)range_switching_error)) *
yangcq88517 0:c70b7ececf93 266 ((int64_t)lookup_k1_range[gas_range_u8])) >> 16;
yangcq88517 0:c70b7ececf93 267 int64_t var2 = (int64_t)((int64_t)gas_adc_u16 << 15) - (int64_t)(1 << 24) + var1;
yangcq88517 0:c70b7ececf93 268 int32_t gas_res = (int32_t)(((((int64_t)lookup_k2_range[gas_range_u8] *
yangcq88517 0:c70b7ececf93 269 (int64_t)var1) >> 9) + (var2 >> 1)) / var2);
yangcq88517 0:c70b7ececf93 270 return gas_res;
yangcq88517 0:c70b7ececf93 271 }
yangcq88517 0:c70b7ececf93 272
yangcq88517 0:c70b7ececf93 273 #else
yangcq88517 0:c70b7ececf93 274 double BME680::getTemperatureDouble(int field)
yangcq88517 0:c70b7ececf93 275 {
yangcq88517 0:c70b7ececf93 276 uint32_t uncom_temperature_u32 = getTemp1Data(field);
yangcq88517 0:c70b7ececf93 277
yangcq88517 0:c70b7ececf93 278 double data1_d = ((((double)uncom_temperature_u32 / 16384.0)
yangcq88517 0:c70b7ececf93 279 - ((double)par_T1 / 1024.0))
yangcq88517 0:c70b7ececf93 280 * ((double)par_T2));
yangcq88517 0:c70b7ececf93 281 /* calculate x2 data */
yangcq88517 0:c70b7ececf93 282 double data2_d = (((((double)uncom_temperature_u32 / 131072.0) -
yangcq88517 0:c70b7ececf93 283 ((double)par_T1 / 8192.0)) *
yangcq88517 0:c70b7ececf93 284 (((double)uncom_temperature_u32 / 131072.0) -
yangcq88517 0:c70b7ececf93 285 ((double)par_T1 / 8192.0))) *
yangcq88517 0:c70b7ececf93 286 ((double)par_T3 * 16.0));
yangcq88517 0:c70b7ececf93 287 /* t fine value*/
yangcq88517 0:c70b7ececf93 288 t_fine = (int32_t)(data1_d + data2_d);
yangcq88517 0:c70b7ececf93 289 /* compensated temperature data*/
yangcq88517 0:c70b7ececf93 290 return (data1_d + data2_d) / 5120.0;
yangcq88517 0:c70b7ececf93 291 }
yangcq88517 0:c70b7ececf93 292
yangcq88517 0:c70b7ececf93 293 double BME680::getHumidityDouble(int field)
yangcq88517 0:c70b7ececf93 294 {
yangcq88517 0:c70b7ececf93 295 double comp_temperature = getTemperatureDouble(field);
yangcq88517 0:c70b7ececf93 296 uint16_t uncom_humidity_u16 = getHumidityData(field);
yangcq88517 0:c70b7ececf93 297
yangcq88517 0:c70b7ececf93 298 double var1 = (double)((double)uncom_humidity_u16) - (((double)
yangcq88517 0:c70b7ececf93 299 par_H1 * 16.0) +
yangcq88517 0:c70b7ececf93 300 (((double)par_H3 / 2.0)
yangcq88517 0:c70b7ececf93 301 * comp_temperature));
yangcq88517 0:c70b7ececf93 302
yangcq88517 0:c70b7ececf93 303 double var2 = var1 * ((double)(
yangcq88517 0:c70b7ececf93 304 ((double) par_H2 / 262144.0)
yangcq88517 0:c70b7ececf93 305 *(1.0 + (((double)par_H4 / 16384.0)
yangcq88517 0:c70b7ececf93 306 * comp_temperature) + (((double)par_H5
yangcq88517 0:c70b7ececf93 307 / 1048576.0) * comp_temperature
yangcq88517 0:c70b7ececf93 308 * comp_temperature))));
yangcq88517 0:c70b7ececf93 309 double var3 = (double) par_H6 / 16384.0;
yangcq88517 0:c70b7ececf93 310 double var4 = (double) par_H7 / 2097152.0;
yangcq88517 0:c70b7ececf93 311
yangcq88517 0:c70b7ececf93 312 double humidity_comp = var2 +
yangcq88517 0:c70b7ececf93 313 ((var3 + (var4 * comp_temperature)) * var2 * var2);
yangcq88517 0:c70b7ececf93 314 if (humidity_comp > BME680_MAX_HUMIDITY_VALUE)
yangcq88517 0:c70b7ececf93 315 humidity_comp = BME680_MAX_HUMIDITY_VALUE;
yangcq88517 0:c70b7ececf93 316 else if (humidity_comp < BME680_MIN_HUMIDITY_VALUE)
yangcq88517 0:c70b7ececf93 317 humidity_comp = BME680_MIN_HUMIDITY_VALUE;
yangcq88517 0:c70b7ececf93 318 return humidity_comp;
yangcq88517 0:c70b7ececf93 319 }
yangcq88517 0:c70b7ececf93 320
yangcq88517 0:c70b7ececf93 321 double BME680::getPressureDouble(int field)
yangcq88517 0:c70b7ececf93 322 {
yangcq88517 0:c70b7ececf93 323 uint32_t uncom_pressure_u32 = getPressureData(field);
yangcq88517 0:c70b7ececf93 324
yangcq88517 0:c70b7ececf93 325 double data1_d = (((double)t_fine / 2.0) - 64000.0);
yangcq88517 0:c70b7ececf93 326 double data2_d = data1_d * data1_d * (((double)par_P6) / (131072.0));
yangcq88517 0:c70b7ececf93 327 data2_d = data2_d + (data1_d * ((double)par_P5) * 2.0);
yangcq88517 0:c70b7ececf93 328 data2_d = (data2_d / 4.0) + (((double)par_P4) * 65536.0);
yangcq88517 0:c70b7ececf93 329 data1_d = (((((double)par_P3 * data1_d * data1_d) / 16384.0) + ((double)par_P2 * data1_d)) / 524288.0);
yangcq88517 0:c70b7ececf93 330 data1_d = ((1.0 + (data1_d / 32768.0)) * ((double)par_P1));
yangcq88517 0:c70b7ececf93 331 double pressure_comp = (1048576.0 - ((double)uncom_pressure_u32));
yangcq88517 0:c70b7ececf93 332 /* Avoid exception caused by division by zero */
yangcq88517 0:c70b7ececf93 333 if ((int)data1_d != 0) {
yangcq88517 0:c70b7ececf93 334 pressure_comp = (((pressure_comp - (data2_d / 4096.0)) * 6250.0) / data1_d);
yangcq88517 0:c70b7ececf93 335 data1_d = (((double)par_P9) * pressure_comp * pressure_comp) / 2147483648.0;
yangcq88517 0:c70b7ececf93 336 data2_d = pressure_comp * (((double)par_P8) / 32768.0);
yangcq88517 0:c70b7ececf93 337 double data3_d = ((pressure_comp / 256.0) * (pressure_comp / 256.0) * (pressure_comp / 256.0) * (par_P10 / 131072.0));
yangcq88517 0:c70b7ececf93 338 pressure_comp = (pressure_comp + (data1_d + data2_d + data3_d + ((double)par_P7 * 128.0)) / 16.0);
yangcq88517 0:c70b7ececf93 339 return pressure_comp;
yangcq88517 0:c70b7ececf93 340 } else
yangcq88517 0:c70b7ececf93 341 return 0;
yangcq88517 0:c70b7ececf93 342 }
yangcq88517 0:c70b7ececf93 343
yangcq88517 0:c70b7ececf93 344 double BME680::convertTemperatureResistanceDouble(uint16_t heater, int16_t ambient)
yangcq88517 0:c70b7ececf93 345 {
yangcq88517 0:c70b7ececf93 346 double var1 = 0;
yangcq88517 0:c70b7ececf93 347 double var2 = 0;
yangcq88517 0:c70b7ececf93 348 double var3 = 0;
yangcq88517 0:c70b7ececf93 349 double var4 = 0;
yangcq88517 0:c70b7ececf93 350 double var5 = 0;
yangcq88517 0:c70b7ececf93 351 double res_heat = 0;
yangcq88517 0:c70b7ececf93 352
yangcq88517 0:c70b7ececf93 353 if ((heater >= BME680_GAS_PROFILE_TEMPERATURE_MIN)
yangcq88517 0:c70b7ececf93 354 && (heater <= BME680_GAS_PROFILE_TEMPERATURE_MAX)) {
yangcq88517 0:c70b7ececf93 355 #ifdef HEATER_C1_ENABLE
yangcq88517 0:c70b7ececf93 356 var1 = (((double)par_GH1 / (16.0)) + 49.0);
yangcq88517 0:c70b7ececf93 357 var2 = ((((double)par_GH2 / (32768.0)) * (0.0005)) + 0.00235);
yangcq88517 0:c70b7ececf93 358 #endif
yangcq88517 0:c70b7ececf93 359 var3 = ((double)par_GH3 / (1024.0));
yangcq88517 0:c70b7ececf93 360 var4 = (var1 * (1.0 + (var2 * (double)heater)));
yangcq88517 0:c70b7ececf93 361 var5 = (var4 + (var3 * (double)ambient));
yangcq88517 0:c70b7ececf93 362
yangcq88517 0:c70b7ececf93 363 #ifdef HEATER_C1_ENABLE
yangcq88517 0:c70b7ececf93 364 res_heat = (uint8_t)(3.4 * ((var5 * (4 / (4 + (double)res_heat_range)) * (1/(1 + ((double)res_heat_val * 0.002)))) - 25));
yangcq88517 0:c70b7ececf93 365 #else
yangcq88517 0:c70b7ececf93 366 res_heat = (((var5 * (4.0 / (4.0 + (double)res_heat_range))) - 25.0) * 3.4);
yangcq88517 0:c70b7ececf93 367 #endif
yangcq88517 0:c70b7ececf93 368
yangcq88517 0:c70b7ececf93 369 }
yangcq88517 0:c70b7ececf93 370 return (uint8_t)res_heat;
yangcq88517 0:c70b7ececf93 371 }
yangcq88517 0:c70b7ececf93 372
yangcq88517 0:c70b7ececf93 373 double BME680::getCalculateGasDouble(int field)
yangcq88517 0:c70b7ececf93 374 {
yangcq88517 0:c70b7ececf93 375 uint8_t gas_range_u8 = getGasResistanceRange(field);
yangcq88517 0:c70b7ececf93 376 uint16_t gas_adc_u16 = getGasResistanceData(field);
yangcq88517 0:c70b7ececf93 377 double gas_res_d = 0;
yangcq88517 0:c70b7ececf93 378
yangcq88517 0:c70b7ececf93 379
yangcq88517 0:c70b7ececf93 380 #ifdef HEATER_C1_ENABLE
yangcq88517 0:c70b7ececf93 381
yangcq88517 0:c70b7ececf93 382 double var1 = 0;
yangcq88517 0:c70b7ececf93 383 double var2 = 0;
yangcq88517 0:c70b7ececf93 384 double var3 = 0;
yangcq88517 0:c70b7ececf93 385
yangcq88517 0:c70b7ececf93 386
yangcq88517 0:c70b7ececf93 387 var1 = (1340.0 + (5.0 * range_switching_error));
yangcq88517 0:c70b7ececf93 388 var2 = (var1) * (1.0 + _lookup_k1_range[gas_range_u8]/100.0);
yangcq88517 0:c70b7ececf93 389 var3 = 1.0 + (_lookup_k2_range[gas_range_u8]/100.0);
yangcq88517 0:c70b7ececf93 390
yangcq88517 0:c70b7ececf93 391 gas_res_d = 1.0 / (double)(var3 * (0.000000125) *
yangcq88517 0:c70b7ececf93 392 (double)(1 << gas_range_u8)
yangcq88517 0:c70b7ececf93 393 * (((((double)gas_adc_u16) - 512.00)/var2) + 1.0));
yangcq88517 0:c70b7ececf93 394
yangcq88517 0:c70b7ececf93 395 #else
yangcq88517 0:c70b7ececf93 396 gas_res_d = 1.0 / ((0.000000125) * (double)(1 << gas_range_u8) *
yangcq88517 0:c70b7ececf93 397 ((((double)(gas_adc_u16) - 512.00) / 1365.3333) + 1.0));
yangcq88517 0:c70b7ececf93 398 #endif
yangcq88517 0:c70b7ececf93 399 return gas_res_d;
yangcq88517 0:c70b7ececf93 400 }
yangcq88517 0:c70b7ececf93 401 #endif
yangcq88517 0:c70b7ececf93 402
yangcq88517 0:c70b7ececf93 403
yangcq88517 0:c70b7ececf93 404
yangcq88517 0:c70b7ececf93 405 BME680::BME680(PinName sda, PinName scl, bool SDO)
yangcq88517 0:c70b7ececf93 406 :_i2c_bus(sda, scl)
yangcq88517 0:c70b7ececf93 407 {
yangcq88517 0:c70b7ececf93 408 if (SDO)
yangcq88517 0:c70b7ececf93 409 _addr = 0x77 << 1;
yangcq88517 0:c70b7ececf93 410 else _addr = 0x76 << 1;
yangcq88517 0:c70b7ececf93 411
yangcq88517 0:c70b7ececf93 412 _i2c_bus.frequency(FREQUENCY_FAST);
yangcq88517 0:c70b7ececf93 413 }
yangcq88517 0:c70b7ececf93 414
yangcq88517 0:c70b7ececf93 415 bool BME680::init()
yangcq88517 0:c70b7ececf93 416 {
yangcq88517 0:c70b7ececf93 417 if (getChipID() != 0x61)
yangcq88517 0:c70b7ececf93 418 return false;
yangcq88517 0:c70b7ececf93 419
yangcq88517 0:c70b7ececf93 420 uint8_t cali[41];
yangcq88517 0:c70b7ececf93 421 readRegister(0x89, 25);
yangcq88517 0:c70b7ececf93 422 memcpy(cali, data, 25);
yangcq88517 0:c70b7ececf93 423 readRegister(0xE1, 16);
yangcq88517 0:c70b7ececf93 424 memcpy(cali + 25, data, 16);
yangcq88517 0:c70b7ececf93 425
yangcq88517 0:c70b7ececf93 426 /* read temperature calibration*/
yangcq88517 0:c70b7ececf93 427 par_T1 = (cali[DIG_T1_MSB_REG] << 8) | cali[DIG_T1_LSB_REG];
yangcq88517 0:c70b7ececf93 428 par_T2 = (cali[DIG_T2_MSB_REG] << 8) | cali[DIG_T2_LSB_REG];
yangcq88517 0:c70b7ececf93 429 par_T3 = cali[DIG_T3_REG];
yangcq88517 0:c70b7ececf93 430
yangcq88517 0:c70b7ececf93 431 /* read pressure calibration*/
yangcq88517 0:c70b7ececf93 432 par_P1 = (cali[DIG_P1_MSB_REG] << 8) | cali[DIG_P1_LSB_REG];
yangcq88517 0:c70b7ececf93 433 par_P2 = (cali[DIG_P2_MSB_REG] << 8) | cali[DIG_P2_LSB_REG];
yangcq88517 0:c70b7ececf93 434 par_P3 = cali[DIG_P3_REG];
yangcq88517 0:c70b7ececf93 435 par_P4 = (cali[DIG_P4_MSB_REG] << 8) | cali[DIG_P4_LSB_REG];
yangcq88517 0:c70b7ececf93 436 par_P5 = (cali[DIG_P5_MSB_REG] << 8) | cali[DIG_P5_LSB_REG];
yangcq88517 0:c70b7ececf93 437 par_P6 = cali[DIG_P6_REG];
yangcq88517 0:c70b7ececf93 438 par_P7 = cali[DIG_P7_REG];
yangcq88517 0:c70b7ececf93 439 par_P8 = (cali[DIG_P8_MSB_REG] << 8) | cali[DIG_P8_LSB_REG];
yangcq88517 0:c70b7ececf93 440 par_P9 = (cali[DIG_P9_MSB_REG] << 8) | cali[DIG_P9_LSB_REG];
yangcq88517 0:c70b7ececf93 441 par_P10 = cali[DIG_P10_REG];
yangcq88517 0:c70b7ececf93 442
yangcq88517 0:c70b7ececf93 443 /* read humidity calibration*/
yangcq88517 0:c70b7ececf93 444 par_H1 = (cali[DIG_H1_MSB_REG] << 4) | (cali[DIG_H1_LSB_REG] & BME680_BIT_MASK_H1_DATA);
yangcq88517 0:c70b7ececf93 445 par_H2 = (cali[DIG_H2_MSB_REG] << 4) | (cali[DIG_H2_LSB_REG] >> 4);
yangcq88517 0:c70b7ececf93 446 par_H3 = cali[DIG_H3_REG];
yangcq88517 0:c70b7ececf93 447 par_H4 = cali[DIG_H4_REG];
yangcq88517 0:c70b7ececf93 448 par_H5 = cali[DIG_H5_REG];
yangcq88517 0:c70b7ececf93 449 par_H6 = cali[DIG_H6_REG];
yangcq88517 0:c70b7ececf93 450 par_H7 = cali[DIG_H7_REG];
yangcq88517 0:c70b7ececf93 451
yangcq88517 0:c70b7ececf93 452 /* read gas calibration*/
yangcq88517 0:c70b7ececf93 453 par_GH1 = cali[DIG_GH1_REG];
yangcq88517 0:c70b7ececf93 454 par_GH2 = (cali[DIG_GH2_MSB_REG] <<8) | cali[DIG_GH2_LSB_REG];
yangcq88517 0:c70b7ececf93 455 par_GH3 = cali[DIG_GH3_REG];
yangcq88517 0:c70b7ececf93 456
yangcq88517 0:c70b7ececf93 457 /**<resistance calculation*/
yangcq88517 0:c70b7ececf93 458 readRegister(0x02);
yangcq88517 0:c70b7ececf93 459 res_heat_range = (data[0] >> 4) & 0x03;
yangcq88517 0:c70b7ececf93 460
yangcq88517 0:c70b7ececf93 461 /**<correction factor*/
yangcq88517 0:c70b7ececf93 462 readRegister(0x00);
yangcq88517 0:c70b7ececf93 463 res_heat_val = data[0];
yangcq88517 0:c70b7ececf93 464
yangcq88517 0:c70b7ececf93 465 /**<range switching error*/
yangcq88517 0:c70b7ececf93 466 readRegister(0x04);
yangcq88517 0:c70b7ececf93 467 range_switching_error = (data[0] & 0xF0) >> 4;
yangcq88517 0:c70b7ececf93 468 /*
yangcq88517 0:c70b7ececf93 469 uint16_t BME680::getParG1()
yangcq88517 0:c70b7ececf93 470 {
yangcq88517 0:c70b7ececf93 471 readRegister(0xEB, 2);
yangcq88517 0:c70b7ececf93 472 return (data[1] << 8) | data[0];
yangcq88517 0:c70b7ececf93 473 }
yangcq88517 0:c70b7ececf93 474
yangcq88517 0:c70b7ececf93 475 uint8_t BME680::getParG2()
yangcq88517 0:c70b7ececf93 476 {
yangcq88517 0:c70b7ececf93 477 readRegister(0xED);
yangcq88517 0:c70b7ececf93 478 return data[0];
yangcq88517 0:c70b7ececf93 479 }
yangcq88517 0:c70b7ececf93 480
yangcq88517 0:c70b7ececf93 481 uint8_t BME680::getParG3()
yangcq88517 0:c70b7ececf93 482 {
yangcq88517 0:c70b7ececf93 483 readRegister(0xEE);
yangcq88517 0:c70b7ececf93 484 return data[0];
yangcq88517 0:c70b7ececf93 485 }
yangcq88517 0:c70b7ececf93 486 */
yangcq88517 0:c70b7ececf93 487 return true;
yangcq88517 0:c70b7ececf93 488 }
yangcq88517 0:c70b7ececf93 489
yangcq88517 1:85088a918342 490 uint32_t BME680::getUncompensatedPressureData(int field)
yangcq88517 0:c70b7ececf93 491 {
yangcq88517 0:c70b7ececf93 492 readRegister(0x1F + field * 0x11, 3);
yangcq88517 0:c70b7ececf93 493 return (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
yangcq88517 0:c70b7ececf93 494 }
yangcq88517 0:c70b7ececf93 495
yangcq88517 1:85088a918342 496 uint32_t BME680::getUncompensatedTemp1Data(int field)
yangcq88517 0:c70b7ececf93 497 {
yangcq88517 0:c70b7ececf93 498 readRegister(0x22 + field * 0x11, 3);
yangcq88517 0:c70b7ececf93 499 return (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
yangcq88517 0:c70b7ececf93 500 }
yangcq88517 0:c70b7ececf93 501
yangcq88517 1:85088a918342 502 uint32_t BME680::getUncompensatedHumidityData(int field)
yangcq88517 0:c70b7ececf93 503 {
yangcq88517 0:c70b7ececf93 504 readRegister(0x25 + field * 0x11, 2);
yangcq88517 0:c70b7ececf93 505 return (data[0] << 8) | data[1];
yangcq88517 0:c70b7ececf93 506 }
yangcq88517 0:c70b7ececf93 507
yangcq88517 1:85088a918342 508 uint16_t BME680::getUncompensatedGasResistanceData(int field)
yangcq88517 0:c70b7ececf93 509 {
yangcq88517 0:c70b7ececf93 510 readRegister(0x2A + field * 0x11, 2);
yangcq88517 0:c70b7ececf93 511 return (data[0] << 2) | (data[1] >> 6);
yangcq88517 0:c70b7ececf93 512 }
yangcq88517 0:c70b7ececf93 513
yangcq88517 0:c70b7ececf93 514 uint8_t BME680::getGasResistanceRange(int field)
yangcq88517 0:c70b7ececf93 515 {
yangcq88517 0:c70b7ececf93 516 readRegister(0x2B + field * 0x11);
yangcq88517 0:c70b7ececf93 517 return data[0] & 0x0F;
yangcq88517 0:c70b7ececf93 518 }
yangcq88517 0:c70b7ececf93 519
yangcq88517 0:c70b7ececf93 520 bool BME680::isNewData(int field)
yangcq88517 0:c70b7ececf93 521 {
yangcq88517 0:c70b7ececf93 522 readRegister(0x1D + field * 0x11);
yangcq88517 0:c70b7ececf93 523 return (data[0] & 0x80) == 0x80 ? true : false;
yangcq88517 0:c70b7ececf93 524 }
yangcq88517 0:c70b7ececf93 525
yangcq88517 0:c70b7ececf93 526 bool BME680::isGasMeasuring(int field)
yangcq88517 0:c70b7ececf93 527 {
yangcq88517 0:c70b7ececf93 528 readRegister(0x1D + field * 0x11);
yangcq88517 0:c70b7ececf93 529 return (data[0] & 0x40) == 0x40 ? true : false;
yangcq88517 0:c70b7ececf93 530 }
yangcq88517 0:c70b7ececf93 531
yangcq88517 0:c70b7ececf93 532 bool BME680::isMeasuring(int field)
yangcq88517 0:c70b7ececf93 533 {
yangcq88517 0:c70b7ececf93 534 readRegister(0x1D + field * 0x11);
yangcq88517 0:c70b7ececf93 535 return (data[0] & 0x20) == 0x20 ? true : false;
yangcq88517 0:c70b7ececf93 536 }
yangcq88517 0:c70b7ececf93 537
yangcq88517 0:c70b7ececf93 538 int BME680::getGasMeasurementIndex(int field)
yangcq88517 0:c70b7ececf93 539 {
yangcq88517 0:c70b7ececf93 540 readRegister(0x1D + field * 0x11);
yangcq88517 0:c70b7ececf93 541 return data[0] & 0x0F;
yangcq88517 0:c70b7ececf93 542 }
yangcq88517 0:c70b7ececf93 543
yangcq88517 0:c70b7ececf93 544 int BME680::getSubMeasurementIndex(int field)
yangcq88517 0:c70b7ececf93 545 {
yangcq88517 0:c70b7ececf93 546 readRegister(0x1E + field * 0x11);
yangcq88517 0:c70b7ececf93 547 return data[0];
yangcq88517 0:c70b7ececf93 548 }
yangcq88517 0:c70b7ececf93 549
yangcq88517 0:c70b7ececf93 550 bool BME680::isGasValid(int field)
yangcq88517 0:c70b7ececf93 551 {
yangcq88517 0:c70b7ececf93 552 readRegister(0x2B + field * 0x11);
yangcq88517 0:c70b7ececf93 553 return (data[0] & 0x20) == 0x20 ? true : false;
yangcq88517 0:c70b7ececf93 554 }
yangcq88517 0:c70b7ececf93 555
yangcq88517 0:c70b7ececf93 556 bool BME680::isHeaterStable(int field)
yangcq88517 0:c70b7ececf93 557 {
yangcq88517 0:c70b7ececf93 558 readRegister(0x2B + field * 0x11);
yangcq88517 0:c70b7ececf93 559 return (data[0] & 0x10) == 0x10 ? true : false;
yangcq88517 0:c70b7ececf93 560 }
yangcq88517 0:c70b7ececf93 561
yangcq88517 0:c70b7ececf93 562 uint8_t BME680::getHeaterCurrent(int setPoint)
yangcq88517 0:c70b7ececf93 563 {
yangcq88517 0:c70b7ececf93 564 readRegister(0x50 + setPoint);
yangcq88517 0:c70b7ececf93 565 return data[0] >> 1;
yangcq88517 0:c70b7ececf93 566 }
yangcq88517 0:c70b7ececf93 567
yangcq88517 0:c70b7ececf93 568 void BME680::setHeaterCurrent(int setPoint, uint8_t value)
yangcq88517 0:c70b7ececf93 569 {
yangcq88517 0:c70b7ececf93 570 writeRegister(0x50 + setPoint, value << 1);
yangcq88517 0:c70b7ececf93 571 }
yangcq88517 0:c70b7ececf93 572
yangcq88517 0:c70b7ececf93 573 int8_t BME680::getTargetHeaterResistance(int setPoint)
yangcq88517 0:c70b7ececf93 574 {
yangcq88517 0:c70b7ececf93 575 readRegister(0x5A + setPoint);
yangcq88517 0:c70b7ececf93 576 return data[0];
yangcq88517 0:c70b7ececf93 577 }
yangcq88517 0:c70b7ececf93 578
yangcq88517 0:c70b7ececf93 579 void BME680::setTargetHeaterResistance(int setPoint, int8_t value)
yangcq88517 0:c70b7ececf93 580 {
yangcq88517 0:c70b7ececf93 581 writeRegister(0x5A + setPoint, value);
yangcq88517 0:c70b7ececf93 582 }
yangcq88517 0:c70b7ececf93 583
yangcq88517 0:c70b7ececf93 584 int BME680::getGasWaitTime(int setPoint)
yangcq88517 0:c70b7ececf93 585 {
yangcq88517 0:c70b7ececf93 586 readRegister(0x64 + setPoint);
yangcq88517 0:c70b7ececf93 587 return (data[0] & 0x3F) * (data[0] >> 6);
yangcq88517 0:c70b7ececf93 588 }
yangcq88517 0:c70b7ececf93 589
yangcq88517 0:c70b7ececf93 590 void BME680::setGasWaitTime(int setPoint, int time, int multiplication)
yangcq88517 0:c70b7ececf93 591 {
yangcq88517 0:c70b7ececf93 592 writeRegister(0x64 + setPoint, (multiplication << 6) | (time & 0x3F));
yangcq88517 0:c70b7ececf93 593 }
yangcq88517 0:c70b7ececf93 594
yangcq88517 0:c70b7ececf93 595 int BME680::getGasWaitShared()
yangcq88517 0:c70b7ececf93 596 {
yangcq88517 0:c70b7ececf93 597 readRegister(0x6E);
yangcq88517 0:c70b7ececf93 598 return (data[0] & 0x1F) * (data[0] >> 6);
yangcq88517 0:c70b7ececf93 599 }
yangcq88517 0:c70b7ececf93 600
yangcq88517 0:c70b7ececf93 601 void BME680::setGasWaitShared(int time, int multiplication)
yangcq88517 0:c70b7ececf93 602 {
yangcq88517 0:c70b7ececf93 603 writeRegister(0x6E, (multiplication << 6) | (time & 0x1F));
yangcq88517 0:c70b7ececf93 604 }
yangcq88517 0:c70b7ececf93 605
yangcq88517 0:c70b7ececf93 606 void BME680::setHeaterOff()
yangcq88517 0:c70b7ececf93 607 {
yangcq88517 0:c70b7ececf93 608 readRegister(0x70);
yangcq88517 0:c70b7ececf93 609 data[0] |= 0x08;
yangcq88517 0:c70b7ececf93 610 writeRegister(0x70, data[0]);
yangcq88517 0:c70b7ececf93 611 }
yangcq88517 0:c70b7ececf93 612
yangcq88517 0:c70b7ececf93 613 int BME680::getHeaterProfile()
yangcq88517 0:c70b7ececf93 614 {
yangcq88517 0:c70b7ececf93 615 readRegister(0x70);
yangcq88517 0:c70b7ececf93 616 return data[0] &= 0x08;
yangcq88517 0:c70b7ececf93 617 }
yangcq88517 0:c70b7ececf93 618
yangcq88517 0:c70b7ececf93 619 void BME680::setHeaterProfile(int vlaue)
yangcq88517 0:c70b7ececf93 620 {
yangcq88517 0:c70b7ececf93 621 readRegister(0x71);
yangcq88517 0:c70b7ececf93 622 data[0] &= 0xF0;
yangcq88517 0:c70b7ececf93 623 data[0] |= vlaue & 0x0F;
yangcq88517 0:c70b7ececf93 624 writeRegister(0x71, data[0]);
yangcq88517 0:c70b7ececf93 625 }
yangcq88517 0:c70b7ececf93 626
yangcq88517 0:c70b7ececf93 627 void BME680::runGasConversion()
yangcq88517 0:c70b7ececf93 628 {
yangcq88517 0:c70b7ececf93 629 readRegister(0x71);
yangcq88517 0:c70b7ececf93 630 data[0] |= 0x10;
yangcq88517 0:c70b7ececf93 631 writeRegister(0x71, data[0]);
yangcq88517 0:c70b7ececf93 632 }
yangcq88517 0:c70b7ececf93 633
yangcq88517 0:c70b7ececf93 634 float BME680::getWakePeriod()
yangcq88517 0:c70b7ececf93 635 {
yangcq88517 0:c70b7ececf93 636 readRegister(0x71);
yangcq88517 0:c70b7ececf93 637 int temp = (data[0] & 0x80) >> 4;
yangcq88517 0:c70b7ececf93 638 readRegister(0x75);
yangcq88517 0:c70b7ececf93 639 temp |= data[0] >> 5;
yangcq88517 0:c70b7ececf93 640
yangcq88517 0:c70b7ececf93 641 switch(temp) {
yangcq88517 0:c70b7ececf93 642 case 0:
yangcq88517 0:c70b7ececf93 643 return 0.59f;
yangcq88517 0:c70b7ececf93 644 case 1:
yangcq88517 0:c70b7ececf93 645 return 62.5f;
yangcq88517 0:c70b7ececf93 646 case 2:
yangcq88517 0:c70b7ececf93 647 return 125;
yangcq88517 0:c70b7ececf93 648 case 3:
yangcq88517 0:c70b7ececf93 649 return 250;
yangcq88517 0:c70b7ececf93 650 case 4:
yangcq88517 0:c70b7ececf93 651 return 500;
yangcq88517 0:c70b7ececf93 652 case 5:
yangcq88517 0:c70b7ececf93 653 return 1000;
yangcq88517 0:c70b7ececf93 654 case 6:
yangcq88517 0:c70b7ececf93 655 return 10;
yangcq88517 0:c70b7ececf93 656 case 7:
yangcq88517 0:c70b7ececf93 657 return 20;
yangcq88517 0:c70b7ececf93 658 default:
yangcq88517 0:c70b7ececf93 659 return 0;
yangcq88517 0:c70b7ececf93 660 }
yangcq88517 0:c70b7ececf93 661 }
yangcq88517 0:c70b7ececf93 662
yangcq88517 0:c70b7ececf93 663 void BME680::setWakePeriod(int value)
yangcq88517 0:c70b7ececf93 664 {
yangcq88517 0:c70b7ececf93 665 readRegister(0x71);
yangcq88517 0:c70b7ececf93 666 data[0] = (data[0] & 0x7F) | ((value & 0x0F) >> 3);
yangcq88517 0:c70b7ececf93 667 writeRegister(0x71, data[0]);
yangcq88517 0:c70b7ececf93 668
yangcq88517 0:c70b7ececf93 669 readRegister(0x75);
yangcq88517 0:c70b7ececf93 670 data[0] = (data[0] & 0x1F) | ((value & 0x07) << 5);
yangcq88517 0:c70b7ececf93 671 writeRegister(0x75, data[0]);
yangcq88517 0:c70b7ececf93 672 }
yangcq88517 0:c70b7ececf93 673
yangcq88517 0:c70b7ececf93 674 int BME680::getOversamplingHumidity()
yangcq88517 0:c70b7ececf93 675 {
yangcq88517 0:c70b7ececf93 676 readRegister(0x72);
yangcq88517 0:c70b7ececf93 677 switch (data[0] & 0x07) {
yangcq88517 0:c70b7ececf93 678 case 0:
yangcq88517 0:c70b7ececf93 679 return 0;
yangcq88517 0:c70b7ececf93 680 case 1:
yangcq88517 0:c70b7ececf93 681 return 1;
yangcq88517 0:c70b7ececf93 682 case 2:
yangcq88517 0:c70b7ececf93 683 return 2;
yangcq88517 0:c70b7ececf93 684 case 3:
yangcq88517 0:c70b7ececf93 685 return 4;
yangcq88517 0:c70b7ececf93 686 case 4:
yangcq88517 0:c70b7ececf93 687 return 8;
yangcq88517 0:c70b7ececf93 688 case 5:
yangcq88517 0:c70b7ececf93 689 return 16;
yangcq88517 0:c70b7ececf93 690 }
yangcq88517 0:c70b7ececf93 691
yangcq88517 0:c70b7ececf93 692 return 0;
yangcq88517 0:c70b7ececf93 693 }
yangcq88517 0:c70b7ececf93 694
yangcq88517 0:c70b7ececf93 695 void BME680::setOversamplingHumidity(int value)
yangcq88517 0:c70b7ececf93 696 {
yangcq88517 0:c70b7ececf93 697 readRegister(0x72);
yangcq88517 0:c70b7ececf93 698 data[0] = (data[0] & 0xF8) | (value & 0x07);
yangcq88517 0:c70b7ececf93 699 writeRegister(0x72, data[0]);
yangcq88517 0:c70b7ececf93 700 }
yangcq88517 0:c70b7ececf93 701
yangcq88517 0:c70b7ececf93 702 int BME680::getOversamplingPressure()
yangcq88517 0:c70b7ececf93 703 {
yangcq88517 0:c70b7ececf93 704 readRegister(0x74);
yangcq88517 0:c70b7ececf93 705 switch ((data[0] & 0x1C) >> 2) {
yangcq88517 0:c70b7ececf93 706 case 0:
yangcq88517 0:c70b7ececf93 707 return 0;
yangcq88517 0:c70b7ececf93 708 case 1:
yangcq88517 0:c70b7ececf93 709 return 1;
yangcq88517 0:c70b7ececf93 710 case 2:
yangcq88517 0:c70b7ececf93 711 return 2;
yangcq88517 0:c70b7ececf93 712 case 3:
yangcq88517 0:c70b7ececf93 713 return 4;
yangcq88517 0:c70b7ececf93 714 case 4:
yangcq88517 0:c70b7ececf93 715 return 8;
yangcq88517 0:c70b7ececf93 716 case 5:
yangcq88517 0:c70b7ececf93 717 return 16;
yangcq88517 0:c70b7ececf93 718 }
yangcq88517 0:c70b7ececf93 719
yangcq88517 0:c70b7ececf93 720 return 0;
yangcq88517 0:c70b7ececf93 721 }
yangcq88517 0:c70b7ececf93 722
yangcq88517 0:c70b7ececf93 723 void BME680::setOversamplingPressure(int value)
yangcq88517 0:c70b7ececf93 724 {
yangcq88517 0:c70b7ececf93 725 readRegister(0x74);
yangcq88517 0:c70b7ececf93 726 data[0] = (data[0] & 0xE3) | ((value & 0x07) << 2);
yangcq88517 0:c70b7ececf93 727 writeRegister(0x74, data[0]);
yangcq88517 0:c70b7ececf93 728 }
yangcq88517 0:c70b7ececf93 729
yangcq88517 0:c70b7ececf93 730 int BME680::getOversamplingTemperature()
yangcq88517 0:c70b7ececf93 731 {
yangcq88517 0:c70b7ececf93 732 readRegister(0x74);
yangcq88517 0:c70b7ececf93 733 switch ((data[0] & 0xE0) >> 5) {
yangcq88517 0:c70b7ececf93 734 case 0:
yangcq88517 0:c70b7ececf93 735 return 0;
yangcq88517 0:c70b7ececf93 736 case 1:
yangcq88517 0:c70b7ececf93 737 return 1;
yangcq88517 0:c70b7ececf93 738 case 2:
yangcq88517 0:c70b7ececf93 739 return 2;
yangcq88517 0:c70b7ececf93 740 case 3:
yangcq88517 0:c70b7ececf93 741 return 4;
yangcq88517 0:c70b7ececf93 742 case 4:
yangcq88517 0:c70b7ececf93 743 return 8;
yangcq88517 0:c70b7ececf93 744 case 5:
yangcq88517 0:c70b7ececf93 745 return 16;
yangcq88517 0:c70b7ececf93 746 }
yangcq88517 0:c70b7ececf93 747
yangcq88517 0:c70b7ececf93 748 return 0;
yangcq88517 0:c70b7ececf93 749 }
yangcq88517 0:c70b7ececf93 750
yangcq88517 0:c70b7ececf93 751 void BME680::setOversamplingTemperature(int value)
yangcq88517 0:c70b7ececf93 752 {
yangcq88517 0:c70b7ececf93 753 readRegister(0x74);
yangcq88517 0:c70b7ececf93 754 data[0] = (data[0] & 0x1F) | ((value & 0x07) << 5);
yangcq88517 0:c70b7ececf93 755 writeRegister(0x74, data[0]);
yangcq88517 0:c70b7ececf93 756 }
yangcq88517 0:c70b7ececf93 757
yangcq88517 0:c70b7ececf93 758 int BME680::getIIRfilterCoefficient()
yangcq88517 0:c70b7ececf93 759 {
yangcq88517 0:c70b7ececf93 760 readRegister(0x75);
yangcq88517 0:c70b7ececf93 761 switch ((data[0] & 0x1C) >> 2) {
yangcq88517 0:c70b7ececf93 762 case 0:
yangcq88517 0:c70b7ececf93 763 return 0;
yangcq88517 0:c70b7ececf93 764 case 1:
yangcq88517 0:c70b7ececf93 765 return 1;
yangcq88517 0:c70b7ececf93 766 case 2:
yangcq88517 0:c70b7ececf93 767 return 3;
yangcq88517 0:c70b7ececf93 768 case 3:
yangcq88517 0:c70b7ececf93 769 return 7;
yangcq88517 0:c70b7ececf93 770 case 4:
yangcq88517 0:c70b7ececf93 771 return 15;
yangcq88517 0:c70b7ececf93 772 case 5:
yangcq88517 0:c70b7ececf93 773 return 31;
yangcq88517 0:c70b7ececf93 774 case 6:
yangcq88517 0:c70b7ececf93 775 return 63;
yangcq88517 0:c70b7ececf93 776 case 7:
yangcq88517 0:c70b7ececf93 777 return 127;
yangcq88517 0:c70b7ececf93 778 }
yangcq88517 0:c70b7ececf93 779 return 0;
yangcq88517 0:c70b7ececf93 780 }
yangcq88517 0:c70b7ececf93 781
yangcq88517 0:c70b7ececf93 782 void BME680::setIIRfilterCoefficient(int value)
yangcq88517 0:c70b7ececf93 783 {
yangcq88517 0:c70b7ececf93 784 readRegister(0x75);
yangcq88517 0:c70b7ececf93 785 data[0] = (data[0] & 0xE3) | ((value & 0x07) << 2);
yangcq88517 0:c70b7ececf93 786 writeRegister(0x75, data[0]);
yangcq88517 0:c70b7ececf93 787 }
yangcq88517 0:c70b7ececf93 788
yangcq88517 0:c70b7ececf93 789 int BME680::getMode()
yangcq88517 0:c70b7ececf93 790 {
yangcq88517 0:c70b7ececf93 791 readRegister(0x74);
yangcq88517 0:c70b7ececf93 792 return data[0] & 0x03;
yangcq88517 0:c70b7ececf93 793 }
yangcq88517 0:c70b7ececf93 794
yangcq88517 0:c70b7ececf93 795 void BME680::setMode(int mode)
yangcq88517 0:c70b7ececf93 796 {
yangcq88517 0:c70b7ececf93 797 readRegister(0x74);
yangcq88517 0:c70b7ececf93 798 data[0] = (data[0] & 0xFC) | (mode & 0x03);
yangcq88517 0:c70b7ececf93 799 writeRegister(0x74, data[0]);
yangcq88517 0:c70b7ececf93 800 }
yangcq88517 0:c70b7ececf93 801
yangcq88517 0:c70b7ececf93 802 int BME680::getChipID()
yangcq88517 0:c70b7ececf93 803 {
yangcq88517 0:c70b7ececf93 804 readRegister(0xD0);
yangcq88517 0:c70b7ececf93 805 return data[0];
yangcq88517 0:c70b7ececf93 806 }
yangcq88517 0:c70b7ececf93 807
yangcq88517 0:c70b7ececf93 808 void BME680::readRegister(int reg, int size)
yangcq88517 0:c70b7ececf93 809 {
yangcq88517 0:c70b7ececf93 810 _i2c_bus.start();
yangcq88517 0:c70b7ececf93 811 _i2c_bus.write(_addr);
yangcq88517 0:c70b7ececf93 812 _i2c_bus.write(reg);
yangcq88517 0:c70b7ececf93 813 _i2c_bus.start();
yangcq88517 0:c70b7ececf93 814 _i2c_bus.write(_addr | 0x01);
yangcq88517 0:c70b7ececf93 815 int i = 0;
yangcq88517 0:c70b7ececf93 816 for (; i< size -1; i++)
yangcq88517 0:c70b7ececf93 817 data[i] = _i2c_bus.read(1);
yangcq88517 0:c70b7ececf93 818 data[i] = _i2c_bus.read(0);
yangcq88517 0:c70b7ececf93 819 _i2c_bus.stop();
yangcq88517 0:c70b7ececf93 820 }
yangcq88517 0:c70b7ececf93 821
yangcq88517 0:c70b7ececf93 822 void BME680::writeRegister(int reg, int value)
yangcq88517 0:c70b7ececf93 823 {
yangcq88517 0:c70b7ececf93 824 _i2c_bus.start();
yangcq88517 0:c70b7ececf93 825 _i2c_bus.write(_addr);
yangcq88517 0:c70b7ececf93 826 _i2c_bus.write(reg);
yangcq88517 0:c70b7ececf93 827 _i2c_bus.write(value);
yangcq88517 0:c70b7ececf93 828 _i2c_bus.stop();
yangcq88517 0:c70b7ececf93 829 }