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