Skip to content

Commit d997015

Browse files
committed
Fixes from upstream BME680_driver 3.5.3
1 parent fffb520 commit d997015

2 files changed

Lines changed: 56 additions & 40 deletions

File tree

library/CHANGELOG.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
1.0.3
2+
-----
3+
4+
* Merged fixes from Bosch BME680_driver version 3.5.3
5+
* Replaced division with logical shift in compensation equations
6+
* Fixed bug in temperature compensation of pressure
7+
18
1.0.2
29
-----
310

library/bme680/__init__.py

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -287,63 +287,72 @@ def _get_regs(self, register, length):
287287
return self._i2c.read_i2c_block_data(self.i2c_addr, register, length)
288288

289289
def _calc_temperature(self, temperature_adc):
290-
var1 = (temperature_adc / 8) - (self.calibration_data.par_t1 * 2)
291-
var2 = (var1 * self.calibration_data.par_t2) / 2048
292-
var3 = ((var1 / 2) * (var1 / 2)) / 4096
293-
var3 = ((var3) * (self.calibration_data.par_t3 * 16)) / 16384
290+
var1 = (temperature_adc >> 3) - (self.calibration_data.par_t1 << 1)
291+
var2 = (var1 * self.calibration_data.par_t2) >> 11
292+
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12
293+
var3 = ((var3) * (self.calibration_data.par_t3 << 4)) >> 14
294294

295295
# Save teperature data for pressure calculations
296296
self.calibration_data.t_fine = (var2 + var3)
297-
calc_temp = (((self.calibration_data.t_fine * 5) + 128) / 256)
297+
calc_temp = (((self.calibration_data.t_fine * 5) + 128) >> 8)
298298

299299
return calc_temp
300300

301301
def _calc_pressure(self, pressure_adc):
302-
var1 = (self.calibration_data.t_fine / 2) - 64000
303-
var2 = ((var1 / 4) * (var1 / 4)) / 2048
304-
var2 = (var2 * self.calibration_data.par_p6) / 4
305-
var2 = var2 + ((var1 * self.calibration_data.par_p5) * 2)
306-
var2 = (var2 / 4) + (self.calibration_data.par_p4 * 65536)
307-
308-
var1 = ((var1 / 4) * (var1 / 4)) / 8192
309-
var1 = ((var1 * (self.calibration_data.par_p3 * 32)) / 8) + ((self.calibration_data.par_p2 * var1) / 2)
310-
var1 = var1 / 262144
311-
var1 = ((32768 + var1) * self.calibration_data.par_p1) / 32768
312-
calc_pres = 1048576 - pressure_adc
313-
calc_pres = (calc_pres - (var2 / 4096)) * 3125
314-
calc_pres = (calc_pres / var1) * 2
315-
var1 = (self.calibration_data.par_p9 * (((calc_pres / 8) * (calc_pres / 8)) / 8192)) / 4096
316-
var2 = ((calc_pres / 4) * self.calibration_data.par_p8) / 8192
317-
var3 = ((calc_pres / 256)
318-
* (calc_pres / 256)
319-
* (calc_pres / 256)
320-
* self.calibration_data.par_p10) / 131072
321-
calc_pres = calc_pres + ((var1 + var2 + var3 + (self.calibration_data.par_p7 * 128)) / 16)
322-
323-
return calc_pres
302+
var1 = ((self.calibration_data.t_fine) >> 1) - 64000
303+
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) *
304+
self.calibration_data.par_p6) >> 2
305+
var2 = var2 + ((var1 * self.calibration_data.par_p5) << 1)
306+
var2 = (var2 >> 2) + (self.calibration_data.par_p4 << 16)
307+
308+
var1 = ((var1 >> 2) * (var1 >> 2)) >> 13
309+
var1 = ((var1 * (self.calibration_data.par_p3 << 5)) >> 3) + ((self.calibration_data.par_p2 * var1) >> 1)
310+
var1 = var1 >> 18
311+
312+
var1 = ((32768 + var1) * self.calibration_data.par_p1) >> 15
313+
calc_pressure = 1048576 - pressure_adc
314+
calc_pressure = ((calc_pressure - (var2 >> 12)) * (3125))
315+
316+
if calc_pressure >= (1 << 31):
317+
calc_pressure = ((calc_pressure / var1) << 1)
318+
else:
319+
calc_pressure = ((calc_pressure << 1) / var1)
320+
321+
var1 = (self.calibration_data.par_p9 * (((calc_pressure >> 3) *
322+
(calc_pressure >> 3)) >> 13)) >> 12
323+
var2 = ((calc_pressure >> 2) *
324+
self.calibration_data.par_p8) >> 13
325+
var3 = ((calc_pressure >> 8) * (calc_pressure >> 8) *
326+
(calc_pressure >> 8) *
327+
self.calibration_data.par_p10) >> 17
328+
329+
calc_pressure = (calc_pressure) + ((var1 + var2 + var3 +
330+
(self.calibration_data.par_p7 << 7)) >> 4)
331+
332+
return calc_pressure
324333

325334
def _calc_humidity(self, humidity_adc):
326-
temp_scaled = ((self.calibration_data.t_fine * 5) + 128) / 256
335+
temp_scaled = ((self.calibration_data.t_fine * 5) + 128) >> 8
327336
var1 = (humidity_adc - ((self.calibration_data.par_h1 * 16))) \
328-
- (((temp_scaled * self.calibration_data.par_h3) / (100)) / 2)
337+
- (((temp_scaled * self.calibration_data.par_h3) / (100)) >> 1)
329338
var2 = (self.calibration_data.par_h2
330339
* (((temp_scaled * self.calibration_data.par_h4) / (100))
331-
+ (((temp_scaled * ((temp_scaled * self.calibration_data.par_h5) / (100))) / 64)
332-
/ (100)) + (1 * 16384))) / 1024
340+
+ (((temp_scaled * ((temp_scaled * self.calibration_data.par_h5) / (100))) >> 6)
341+
/ (100)) + (1 * 16384))) >> 10
333342
var3 = var1 * var2
334-
var4 = self.calibration_data.par_h6 * 128
335-
var4 = ((var4) + ((temp_scaled * self.calibration_data.par_h7) / (100))) / 16
336-
var5 = ((var3 / 16384) * (var3 / 16384)) / 1024
337-
var6 = (var4 * var5) / 2
338-
calc_hum = (((var3 + var6) / 1024) * (1000)) / 4096
343+
var4 = self.calibration_data.par_h6 << 7
344+
var4 = ((var4) + ((temp_scaled * self.calibration_data.par_h7) / (100))) >> 4
345+
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10
346+
var6 = (var4 * var5) >> 1
347+
calc_hum = (((var3 + var6) >> 10) * (1000)) >> 12
339348

340349
return min(max(calc_hum,0),100000)
341350

342351
def _calc_gas_resistance(self, gas_res_adc, gas_range):
343-
var1 = ((1340 + (5 * self.calibration_data.range_sw_err)) * (lookupTable1[gas_range])) / 65536
344-
var2 = (((gas_res_adc * 32768) - (16777216)) + var1)
345-
var3 = ((lookupTable2[gas_range] * var1) / 512)
346-
calc_gas_res = ((var3 + (var2 / 2)) / var2)
352+
var1 = ((1340 + (5 * self.calibration_data.range_sw_err)) * (lookupTable1[gas_range])) >> 16
353+
var2 = (((gas_res_adc << 15) - (16777216)) + var1)
354+
var3 = ((lookupTable2[gas_range] * var1) >> 9)
355+
calc_gas_res = ((var3 + (var2 >> 1)) / var2)
347356

348357
return calc_gas_res
349358

0 commit comments

Comments
 (0)