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
BME680.cpp@1:85088a918342, 2016-08-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |