Skip to content

Commit f63099a

Browse files
committed
fix(bme280): Rewrite ctrl_meas after ctrl_hum to latch humidity config.
1 parent 8b142fc commit f63099a

2 files changed

Lines changed: 20 additions & 9 deletions

File tree

lib/bme280/bme280/device.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,14 @@ def set_oversampling(self, temperature=None, pressure=None, humidity=None):
182182
"""
183183
if humidity is not None:
184184
self._write_reg(REG_CTRL_HUM, humidity)
185-
if temperature is not None or pressure is not None:
186-
ctrl = self._read_reg(REG_CTRL_MEAS)
187-
if temperature is not None:
188-
ctrl = (ctrl & ~(0x07 << OSRS_T_SHIFT)) | (temperature << OSRS_T_SHIFT)
189-
if pressure is not None:
190-
ctrl = (ctrl & ~(0x07 << OSRS_P_SHIFT)) | (pressure << OSRS_P_SHIFT)
191-
self._write_reg(REG_CTRL_MEAS, ctrl)
185+
ctrl = self._read_reg(REG_CTRL_MEAS)
186+
if temperature is not None:
187+
ctrl = (ctrl & ~(0x07 << OSRS_T_SHIFT)) | (temperature << OSRS_T_SHIFT)
188+
if pressure is not None:
189+
ctrl = (ctrl & ~(0x07 << OSRS_P_SHIFT)) | (pressure << OSRS_P_SHIFT)
190+
# ctrl_meas must always be rewritten: changes to ctrl_hum are only
191+
# latched when ctrl_meas is written (datasheet section 5.4.3).
192+
self._write_reg(REG_CTRL_MEAS, ctrl)
192193

193194
def set_iir_filter(self, coefficient):
194195
"""Configure the IIR filter coefficient.

tests/scenarios/bme280.yaml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,15 +356,25 @@ tests:
356356
expect_true: true
357357
mode: [mock]
358358

359-
- name: "set_oversampling configures humidity"
359+
- name: "set_oversampling configures humidity and latches via ctrl_meas"
360360
action: script
361361
script: |
362362
from bme280.const import OSRS_X8
363363
i2c.clear_write_log()
364364
dev.set_oversampling(humidity=OSRS_X8)
365365
log = i2c.get_write_log()
366366
hum_writes = [data[0] for reg, data in log if reg == 0xF2]
367-
result = len(hum_writes) == 1 and hum_writes[0] == OSRS_X8
367+
# ctrl_meas must be rewritten after ctrl_hum for the change to take effect
368+
ctrl_writes = [data[0] for reg, data in log if reg == 0xF4]
369+
# Verify write order: ctrl_hum (0xF2) must come before ctrl_meas (0xF4)
370+
hum_idx = next(i for i, (reg, _) in enumerate(log) if reg == 0xF2)
371+
meas_idx = next(i for i, (reg, _) in enumerate(log) if reg == 0xF4)
372+
result = (
373+
len(hum_writes) == 1
374+
and hum_writes[0] == OSRS_X8
375+
and len(ctrl_writes) == 1
376+
and hum_idx < meas_idx
377+
)
368378
expect_true: true
369379
mode: [mock]
370380

0 commit comments

Comments
 (0)