Zum Hauptinhalt springen

Ein Heizprofil im Sequential Mode durchlaufen

Was dieses Beispiel zeigt​

Im Sequential Mode durchläuft der Sensor ein Heizprofil selbstständig und schläft zwischen den Messungen. Das Beispiel legt ein Profil mit zehn Schritten fest (Heizertemperaturen von 100 bis 320 °C, je 150 ms) und eine Pause von 250 ms zwischen den Schritten. Anschließend gibt es jede neue Messung zusammen mit dem Profilschritt aus, bei dem sie gemessen wurde.

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-sequentialMode.py
# AUTHOR: Josip Simun Kuci @ Soldered
# BRIEF: Run the BME690 in sequential mode, where the sensor steps through a
# heater profile on its own, sleeping between the measurements
# WORKS WITH: BME690 breakout board: solde.red/333411
# LAST UPDATED: 2026-09-16

from bme690 import (
BME690,
BME69X_ERROR,
BME69X_ODR_250_MS,
BME69X_SEQUENTIAL_MODE,
)
import time

# Heater temperature profile in degrees Celsius.
HEATER_TEMP = [320, 100, 100, 100, 200, 200, 200, 320, 320, 320]

# Heating duration profile in milliseconds.
HEATER_DUR = [150, 150, 150, 150, 150, 150, 150, 150, 150, 150]

sensor = BME690()

sensor.set_tph()

# Sleep duration between two measurements of the profile.
sensor.set_seq_sleep(BME69X_ODR_250_MS)

sensor.set_heater_prof(HEATER_TEMP, HEATER_DUR)
sensor.set_op_mode(BME69X_SEQUENTIAL_MODE)

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, Gas index"
)

while True:
if sensor.fetch_data():
fields_left = 1

while fields_left:
data, fields_left = 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,
data.gas_index,
)
)

time.sleep_ms(100)

🔗Vollständiges Beispiel öffnen

Examples/bme690-sequentialMode.py im Commit 91a07b5

→

Erwartetes Ergebnis:

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

Jedes neue Datenfeld gibt dann eine Zeile aus: den Millisekundenzähler, die Temperatur in °C, den Druck in Pa, die Luftfeuchtigkeit in % r.F. und den Gaswiderstand in Ω (jeweils mit zwei Nachkommastellen), das Statusbyte in Hexadezimalschreibweise und den Heizprofilschritt von 0 bis 9. 0xb0 im Status bedeutet neue Daten, eine gültige Gasmessung und einen stabilen Heizer.

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 aus. Es löst eine Exception aus, wenn der Sensor nicht antwortet oder sich ein anderer Chip unter der Adresse befindet; 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 mit der Firmware eines Soldered-Boards I2C(0) mit SCL an Pin 22 und SDA an Pin 21, auf jedem anderen Port löst es 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 Heizereinstellung 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

Legt das Oversampling für Temperatur, Druck und Luftfeuchtigkeit fest. Ohne Argumente aufgerufen, wie hier, setzt es 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_seq_sleep(odr=BME69X_ODR_0_59_MS)returns None

Legt fest, wie lange der Sensor im Sequential Mode zwischen zwei Messungen schläft.

ReturnsNichts. Das Ergebnis steht im Status.

Parameter

TypNameBeschreibung
intodrBME69X_ODR_0_59_MS, BME69X_ODR_10_MS, BME69X_ODR_20_MS, BME69X_ODR_62_5_MS, BME69X_ODR_125_MS, BME69X_ODR_250_MS, BME69X_ODR_500_MS, BME69X_ODR_1000_MS oder BME69X_ODR_NONE. Das Beispiel verwendet BME69X_ODR_250_MS.
sensor.set_heater_prof(temp, dur, shared_heatr_dur=None)returns None

Legt das Heizprofil des Gassensors fest und schaltet den Heizer ein. Mit einer Liste von Temperaturen und einer Liste von Dauern und ohne gemeinsame Dauer, wie hier, schreibt es ein Profil für den Sequential Mode, einen Schritt pro Listeneintrag. Temperaturen über 400 °C werden auf 400 °C begrenzt.

ReturnsNichts. Das Ergebnis steht im Status.

Parameter

TypNameBeschreibung
listtempHeizertemperatur jedes Schritts in °C. Das Beispiel verwendet HEATER_TEMP.
listdurHeizdauer jedes Schritts in ms. Das Beispiel verwendet HEATER_DUR.
intshared_heatr_durNur im Parallel Mode; im Sequential Mode weglassen.
sensor.set_op_mode(op_mode)returns None

Versetzt den Sensor in den Schlafmodus und setzt dann den gewünschten Modus. Mit BME69X_SEQUENTIAL_MODE beginnt der Sensor, das Profil selbstständig abzuarbeiten. Der Modus wird für 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.check_status()returns int

Fasst den Status zusammen, den die zuletzt aufgerufene 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.fetch_data()returns int

Liest die drei Ergebnisfelder des Sensors in den Puffer des Moduls und sortiert sie so, dass die älteste neue Messung zuerst kommt. Ist nichts Neues vorhanden, lautet der Status No new data.

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

sensor.get_data()returns tuple

Gibt das nächste neue Feld aus dem Puffer als BME690Data-Objekt zurück, mit temperature (°C), pressure (Pa), humidity (% r.F.), gas_resistance (Ω), status, gas_index (der Profilschritt) und meas_index.

Returns(data, fields_left): das BME690Data-Objekt oder None, wenn es keine neuen Daten gibt, sowie die Anzahl der neuen Felder, die nach diesem noch übrig sind.

Alles zusammen​

Nach set_tph(), set_seq_sleep() und set_heater_prof() lässt der Aufruf set_op_mode(BME69X_SEQUENTIAL_MODE) den Sensor das Profil selbstständig durchlaufen. Alle 100 ms fragt die Schleife mit fetch_data() nach neuen Feldern und liest sie mit get_data() einzeln aus, bis fields_left den Wert 0 erreicht. Die Spalte gas_index zeigt, bei welchem der zehn Heizschritte eine Zeile gemessen wurde.