Skip to content

BME680

Bosch BME680 temperature / pressure / humidity sensor (gas channel not modelled).

Live catalog

Prefer labwired_describe with the catalog id over guessing pins or addresses.

Status at a glance

Aspect Status
Catalog id bme680
Bus I²C
Address 0x76 (SDO low); 0x77 (SDO high)
Source configs/devices/bme680.yaml (declarative, no Rust model)
Datasheet Bosch BST-BME680-DS001 §5.2 memory map (Table 20); calibration layout and integer compensation from Bosch BME68x_SensorAPI bme68x.c
Tier smoke-proven (register-level tests: crates/core/tests/everyday_sensor_set.rs)

Pins / attachment

Pin / net Role
SDA I²C SDA
SCL I²C SCL
VDD/GND Power (digital twin)

Support matrix

Behavior Status Notes
CHIP_ID 0xD0 = 0x61, VARIANT_ID 0xF0 = 0x00 ✅
Calibration block (0x8A / 0xE1 / 0x00) ✅ One plausible unit; see the YAML header
T / P / H ADC words ✅ Exact inverse of Bosch's integer compensation: T exact, P ≤ 1 Pa, H ≤ 3 milli-%RH, 300–1100 hPa at −40…85 °C
Forced mode + new_data_0 ✅ new_data_0 7256 µs after mode = 01 (Bosch's shortest-cycle duration); mode returns to sleep
Soft reset (0xE0 ← 0xB6) ✅ Control registers restored
Gas resistance ❌ gas_r reads 0 with gas_valid_r / heat_stab_r clear; heater registers are storage
Oversampling / IIR filter / noise ❌ Readings are the stimulus, exact
Analog / power ❌ Bench

Stimulus

Host inputs: temperature (°C), pressure (hPa), humidity (%RH).

How to run

  1. Place the part and an MCU in Playground, or add it to a system YAML:
    external_devices:
      - id: "bme680"
        type: "bme680"
        connection: "i2c0"   # the bus id your chip system uses
    
  2. Agent: labwired_list → labwired_describe id=bme680 → wire → labwired_validate → labwired_run / labwired_verify.
  3. Register-level smoke: cargo test -p labwired-core --test everyday_sensor_set — CHIP_ID 0x61; Bosch init + forced cycle compensates to 25.00 °C / 101325 Pa / 50.000 %RH (±2 milli-%); 480-point sweep against a line-for-line port of Bosch's integer code. The same file's negative control proves the check fails against a part that answers only 0x00 or only 0xFF.

Limitations

  • The gas channel is not modelled — a driver that checks gas_valid reports no gas reading.
  • The float build of the Bosch API uses different formulas and lands within its own rounding.

See the YAML header for the full datasheet trace and every named approximation.