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:
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 BME690Erzeugt 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
| Typ | Name | Beschreibung |
|---|---|---|
I2C | i2c | Ein 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. |
int | address | Die I2C-Adresse: BME69X_I2C_ADDR_LOW (0x76, der Standardwert) oder BME69X_I2C_ADDR_HIGH (0x77). |
int | amb_temp | Umgebungstemperatur 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 NoneStellt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | os_temp | Oversampling der Temperatur, BME69X_OS_NONE bis BME69X_OS_16X. |
int | os_pres | Oversampling des Drucks, BME69X_OS_NONE bis BME69X_OS_16X. |
int | os_hum | Oversampling der Luftfeuchtigkeit, BME69X_OS_NONE bis BME69X_OS_16X. |
sensor.set_filter(filter_size=BME69X_FILTER_OFF)returns NoneStellt den IIR-Filter ein, der die Temperatur- und Druckmesswerte glättet.
ReturnsNichts. Das Ergebnis steht im Status.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | filter_size | BME69X_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 NoneLegt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | temp | Heiztemperatur in °C. Das Beispiel verwendet 300. |
int | dur | Heizdauer in ms. Das Beispiel verwendet 100. |
int | shared_heatr_dur | Nur im Parallel-Modus; im Forced-Modus weglassen. |
sensor.check_status()returns intFasst 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 strBeschreibt 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 NoneVersetzt 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
| Typ | Name | Beschreibung |
|---|---|---|
int | op_mode | BME69X_SLEEP_MODE, BME69X_FORCED_MODE, BME69X_PARALLEL_MODE oder BME69X_SEQUENTIAL_MODE. |
sensor.get_meas_dur(op_mode=BME69X_SLEEP_MODE)returns intBerechnet, 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
| Typ | Name | Beschreibung |
|---|---|---|
int | op_mode | Der Modus, für den berechnet wird. Wird er weggelassen, gilt der zuletzt mit set_op_mode() gesetzte Modus. |
sensor.fetch_data()returns intLiest 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 tupleLiefert 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.