Zum Hauptinhalt springen

Im Forced-Modus lesen

Was dieses Beispiel zeigt​

Im Forced-Modus führt der Sensor bei jeder Anforderung genau eine Messung durch. Das Beispiel stellt das Oversampling, einen IIR-Filter und eine Heizstufe (300 °C für 100 ms) ein, löst dann jede Sekunde eine Messung aus und gibt Temperatur, Druck, Luftfeuchtigkeit und Gaswiderstand aus. Dies ist die übliche Art, den Sensor auszulesen.

Das Beispiel erzeugt den Sensor mit BME690(), daher verwendet es auf den Ports esp32 und esp8266 I2C(0) mit SDA an Pin 21 und SCL an Pin 22 unter der Adresse 0x76.

Der Beispielcode​

# FILE: bme690-forcedMode.py
# AUTHOR: Josip Simun Kuci @ Soldered
# BRIEF: Read temperature, pressure, humidity and gas resistance from the
# BME690 in forced mode, one measurement at a time
# WORKS WITH: BME690 breakout board: solde.red/333411
# LAST UPDATED: 2026-09-16

from bme690 import (
BME690,
BME69X_ERROR,
BME69X_FILTER_SIZE_3,
BME69X_FORCED_MODE,
)
import time

# Start the sensor on the default I2C address (0x76). Use
# BME690(address=BME69X_I2C_ADDR_HIGH) if the address jumper is soldered.
sensor = BME690()

# Oversampling for temperature, pressure and humidity.
sensor.set_tph()

# IIR filter for the temperature and pressure readings.
sensor.set_filter(BME69X_FILTER_SIZE_3)

# Heat the gas sensor plate to 300 degrees Celsius for 100 milliseconds.
sensor.set_heater_prof(300, 100)

if sensor.check_status() == BME69X_ERROR:
raise Exception("BME690 setup failed: " + sensor.status_string())

print(
"Timestamp(ms), Temperature(C), Pressure(Pa), Humidity(%), "
"Gas resistance(Ohm), Status"
)

while True:
# Trigger a single measurement.
sensor.set_op_mode(BME69X_FORCED_MODE)

# Wait for the measurement to finish, the heater duration included.
time.sleep_us(sensor.get_meas_dur())

if sensor.fetch_data():
data, _ = sensor.get_data()

print(
"{}, {:.2f}, {:.2f}, {:.2f}, {:.2f}, 0x{:02x}".format(
time.ticks_ms(),
data.temperature,
data.pressure,
data.humidity,
data.gas_resistance,
data.status,
)
)

time.sleep(1)

🔗Das vollständige Beispiel öffnen

Examples/bme690-forcedMode.py im Commit 91a07b5

→

Erwartetes Ergebnis:

ShellMicroPython
Timestamp(ms), Temperature(C), Pressure(Pa), Humidity(%), Gas resistance(Ohm), Status

Jede neue Messung gibt dann in dieser Reihenfolge eine Zeile aus: den Millisekundenzähler, die Temperatur in °C, den Druck in Pa, die Luftfeuchtigkeit in % r.H. und den Gaswiderstand in Ω (jeweils mit zwei Nachkommastellen) sowie das Statusbyte in Hex. 0xb0 bedeutet neue Daten, eine gültige Gasmessung und ein stabiles Heizelement.

Verwendete Funktionen​

BME690(i2c=None, address=BME69X_I2C_ADDR_LOW, amb_temp=25)returns BME690

Erzeugt das Sensorobjekt. Es setzt den Sensor per Soft-Reset zurück, prüft seine Chip-ID (0x61) und liest die Kalibrierdaten. Es löst eine Exception aus, wenn der Sensor nicht antwortet oder ein anderer Chip unter der Adresse liegt; jede andere Funktion hält ihr Ergebnis im Status fest, statt eine Exception auszulösen.

ReturnsDas Sensorobjekt.

Parameter

TypNameBeschreibung
I2Ci2cEin fertiges machine.I2C-Objekt. Wird es weggelassen, öffnet das Modul auf den Ports esp32 und esp8266 sowie bei einer Firmware für Soldered-Boards I2C(0) mit SCL an Pin 22 und SDA an Pin 21 und löst auf jedem anderen Port eine Exception aus.
intaddressDie I2C-Adresse: BME69X_I2C_ADDR_LOW (0x76, der Standardwert) oder BME69X_I2C_ADDR_HIGH (0x77).
intamb_tempUmgebungstemperatur in °C, mit der die Heizeinstellung berechnet wird. Standardmäßig 25.
sensor.set_tph(os_temp=BME69X_OS_2X, os_pres=BME69X_OS_16X, os_hum=BME69X_OS_1X)returns None

Stellt das Oversampling für Temperatur, Druck und Luftfeuchtigkeit ein. Ohne Argumente aufgerufen, wie hier, setzt sie die Standardwerte der Arduino-Bibliothek.

ReturnsNichts. Das Ergebnis steht im Status.

Parameter

TypNameBeschreibung
intos_tempOversampling der Temperatur, BME69X_OS_NONE bis BME69X_OS_16X.
intos_presOversampling des Drucks, BME69X_OS_NONE bis BME69X_OS_16X.
intos_humOversampling der Luftfeuchtigkeit, BME69X_OS_NONE bis BME69X_OS_16X.
sensor.set_filter(filter_size=BME69X_FILTER_OFF)returns None

Stellt den IIR-Filter ein, der die Temperatur- und Druckmesswerte glättet.

ReturnsNichts. Das Ergebnis steht im Status.

Parameter

TypNameBeschreibung
intfilter_sizeBME69X_FILTER_OFF oder BME69X_FILTER_SIZE_1, _3, _7, _15, _31, _63 oder _127. Das Beispiel verwendet BME69X_FILTER_SIZE_3.
sensor.set_heater_prof(temp, dur, shared_heatr_dur=None)returns None

Legt das Heizprofil des Gassensors fest und schaltet das Heizelement ein. Mit einer Temperatur und einer Dauer, wie hier, schreibt sie die einzelne Heizstufe, die der Forced-Modus verwendet. Temperaturen über 400 °C werden auf 400 °C begrenzt.

ReturnsNichts. Das Ergebnis steht im Status.

Parameter

TypNameBeschreibung
inttempHeiztemperatur in °C. Das Beispiel verwendet 300.
intdurHeizdauer in ms. Das Beispiel verwendet 100.
intshared_heatr_durNur im Parallel-Modus; im Forced-Modus weglassen.
sensor.check_status()returns int

Fasst den Status zusammen, den die letzte Funktion hinterlassen hat.

ReturnsBME69X_ERROR (-1) nach einem Fehler, BME69X_WARNING (1) nach einer Warnung, sonst BME69X_OK (0).

sensor.status_string()returns str

Beschreibt den aktuellen Statuscode in wenigen Worten, etwa Communication failure oder No new data.

ReturnsDie Beschreibung, ein leerer String, wenn der Status OK ist.

sensor.set_op_mode(op_mode)returns None

Versetzt den Sensor in den Schlafmodus und setzt dann den gewünschten Modus. BME69X_FORCED_MODE löst eine Messung aus. Der Modus wird für get_meas_dur(), fetch_data() und get_data() gespeichert.

ReturnsNichts. Das Ergebnis steht im Status.

Parameter

TypNameBeschreibung
intop_modeBME69X_SLEEP_MODE, BME69X_FORCED_MODE, BME69X_PARALLEL_MODE oder BME69X_SEQUENTIAL_MODE.
sensor.get_meas_dur(op_mode=BME69X_SLEEP_MODE)returns int

Berechnet, wie lange eine Messung von Temperatur, Druck und Luftfeuchtigkeit dauert, anhand des mit set_tph() eingestellten Oversamplings; rufen Sie daher zuerst set_tph() auf. Außerhalb des Parallel-Modus addiert sie 1 ms für das Aufwachen des Sensors. Die Heizdauer ist nicht Teil des Ergebnisses.

ReturnsDie Messdauer in Mikrosekunden.

Parameter

TypNameBeschreibung
intop_modeDer Modus, für den berechnet wird. Wird er weggelassen, gilt der zuletzt mit set_op_mode() gesetzte Modus.
sensor.fetch_data()returns int

Liest die Messdaten vom Sensor in den Puffer des Moduls. Im Forced-Modus liest sie das eine Ergebnisfeld. Liegen keine neuen Daten vor, lautet der Status No new data.

ReturnsDie Anzahl der neuen Datenfelder, 0, wenn es keine gibt.

sensor.get_data()returns tuple

Liefert das nächste Feld aus dem Puffer als BME690Data-Objekt mit temperature (°C), pressure (Pa), humidity (% r.H.), gas_resistance (Ω), status, gas_index und meas_index. Im Forced-Modus gibt sie immer das eine Feld zurück.

Returns(data, fields_left): das BME690Data-Objekt und die Anzahl der noch verbleibenden neuen Felder (0 im Forced-Modus).

Zusammenfassung​

BME690() findet den Sensor, und set_tph(), set_filter() und set_heater_prof() konfigurieren ihn. check_status() liest nur den Status, den der letzte dieser Aufrufe hinterlassen hat, sodass das Skript mit der Ursache anhält, wenn die Heizungseinrichtung einen Fehler meldet; eine Warnung hält es nicht an. In der Schleife startet set_op_mode(BME69X_FORCED_MODE) eine Messung, das Skript wartet get_meas_dur() Mikrosekunden, und fetch_data() und get_data() holen das Ergebnis ab. Eine Schleife, in der fetch_data() 0 zurückgibt, gibt nichts aus.

Der Kommentar im Beispiel sagt, die Wartezeit enthalte die Heizdauer, aber get_meas_dur() addiert sie nicht: Mit den Standardwerten von set_tph() liefert es 42590 µs, also weniger als die Heizstufe von 100 ms. fetch_data() prüft dann bis zu fünfmal im Abstand von 10 ms auf neue Daten, bevor es für diese Schleife aufgibt.

Wenn Sie den ADDR-Jumper umgesetzt haben, erzeugen Sie den Sensor mit BME690(address=BME69X_I2C_ADDR_HIGH) und importieren Sie BME69X_I2C_ADDR_HIGH ebenfalls aus bme690.