Heizelement im Parallelmodus durchfahren
Was dieses Beispiel zeigt
Im Parallelmodus durchfährt der Gassensor ein Heizprofil, während Temperatur, Druck und Luftfeuchtigkeit fortlaufend gemessen werden. Das Beispiel verwendet ein Profil mit zehn Schritten (Heiztemperaturen von 100 bis 320 °C), bei dem jeder Schritt ein Vielfaches einer gemeinsamen Heizdauer dauert. Es gibt nur die Felder aus, die eine gültige Gasmessung mit stabilem Heizelement enthalten.
Das Beispiel erzeugt den Sensor mit BME690(). Auf den Ports esp32 und esp8266 verwendet es daher I2C(0) mit SDA an Pin 21 und SCL an Pin 22, unter der Adresse
0x76.
Der Beispielcode
# FILE: bme690-parallelMode.py
# AUTHOR: Josip Simun Kuci @ Soldered
# BRIEF: Run the BME690 in parallel mode, where the gas sensor sweeps through
# a heater profile while temperature, pressure and humidity are
# measured continuously
# WORKS WITH: BME690 breakout board: solde.red/333411
# LAST UPDATED: 2026-09-16
from bme690 import (
BME690,
BME69X_ERROR,
BME69X_GASM_VALID_MSK,
BME69X_HEAT_STAB_MSK,
BME69X_NEW_DATA_MSK,
BME69X_PARALLEL_MODE,
)
import time
# New data, gas measurement valid and heater stable, all at once.
BME690_VALID_DATA = (
BME69X_NEW_DATA_MSK | BME69X_GASM_VALID_MSK | BME69X_HEAT_STAB_MSK
)
# Heater temperature profile in degrees Celsius.
HEATER_TEMP = [320, 100, 100, 100, 200, 200, 200, 320, 320, 320]
# Multipliers of the shared heater duration, one per profile step.
HEATER_MUL = [5, 2, 10, 30, 5, 5, 5, 5, 5, 5]
sensor = BME690()
sensor.set_tph()
# The shared heating duration is the total measurement duration minus the
# time needed for the temperature, pressure and humidity measurement.
shared_heatr_dur = 140 - sensor.get_meas_dur(BME69X_PARALLEL_MODE) // 1000
sensor.set_heater_prof(HEATER_TEMP, HEATER_MUL, shared_heatr_dur)
sensor.set_op_mode(BME69X_PARALLEL_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, Meas index"
)
while True:
if sensor.fetch_data():
fields_left = 1
while fields_left:
data, fields_left = sensor.get_data()
# Skip the fields which hold no valid measurement.
if data.status != BME690_VALID_DATA:
continue
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,
data.meas_index,
)
)
🔗Das vollständige Beispiel öffnen
Examples/bme690-parallelMode.py im Commit 91a07b5
Erwartetes Ergebnis:
Timestamp(ms), Temperature(C), Pressure(Pa), Humidity(%), Gas resistance(Ohm), Status, Gas index, Meas index
Jedes gültige Feld wird dann als eine Zeile ausgegeben: der Millisekundenzähler, die Temperatur in
°C, der Druck in Pa, die Luftfeuchtigkeit in % r.H. und der Gaswiderstand in Ω (jeweils mit zwei
Nachkommastellen), das Statusbyte, der Schritt des Heizprofils und der Messindex.
Es werden nur Felder ausgegeben, deren Status genau neue Daten, gültiges Gas und stabiles Heizelement lautet, daher steht in der Statusspalte immer 0xb0.
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 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
| Typ | Name | Beschreibung |
|---|---|---|
I2C | i2c | Ein fertiges machine.I2C-Objekt. Wird es weggelassen, öffnet das Modul auf den Ports esp32 und esp8266 sowie bei 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. |
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 NoneLegt 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
| 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.get_meas_dur(op_mode=BME69X_SLEEP_MODE)returns intBerechnet aus dem mit set_tph() eingestellten Oversampling, wie lange eine Messung von Temperatur, Druck und Luftfeuchtigkeit dauert; rufen Sie daher zuerst set_tph() auf. Im Parallelmodus wird keine Aufwachzeit addiert. Mit den Standardwerten von set_tph() liefert es hier 41590 µs, die gemeinsame Heizdauer des Beispiels beträgt also 140 - 41 = 99 ms.
ReturnsDie Messdauer in Mikrosekunden.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
int | op_mode | Der Modus, für den berechnet wird. Das Beispiel übergibt BME69X_PARALLEL_MODE, weil der Modus noch nicht gesetzt ist. |
sensor.set_heater_prof(temp, dur, shared_heatr_dur=None)returns NoneLegt das Heizprofil des Gassensors fest und schaltet das Heizelement ein. Mit einer Liste von Temperaturen, einer Liste von Multiplikatoren und einer gemeinsamen Heizdauer, wie hier, schreibt es ein Parallelmodus-Profil: Jeder Schritt dauert das Produkt aus seinem Multiplikator und der gemeinsamen Dauer. Temperaturen über 400 °C werden auf 400 °C begrenzt. Bei einer gemeinsamen Dauer von 0 bleibt die Warnung Set the shared heater duration zurück.
ReturnsNichts. Das Ergebnis steht im Status.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
list | temp | Heiztemperatur jedes Schritts in °C. Das Beispiel verwendet HEATER_TEMP. |
list | dur | Im Parallelmodus der Multiplikator der gemeinsamen Dauer für jeden Schritt. Das Beispiel verwendet HEATER_MUL. |
int | shared_heatr_dur | Die gemeinsame Heizdauer in ms. Wird sie übergeben, wird der Parallelmodus gewählt. |
sensor.set_op_mode(op_mode)returns NoneVersetzt den Sensor in den Schlafmodus und setzt dann den gewünschten Modus. Mit BME69X_PARALLEL_MODE misst der Sensor weiter und durchfährt das Heizelement selbstständig. Der Modus wird für 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.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.fetch_data()returns intLiest 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 neuer Datenfelder, 0, wenn es keine gibt.
sensor.get_data()returns tupleLiefert das nächste neue Feld aus dem Puffer als BME690Data-Objekt mit temperature (°C), pressure (Pa), humidity (% r.H.), 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 neuer Felder, die nach diesem noch übrig sind.
Alles zusammengesetzt
Das Beispiel berechnet zuerst die gemeinsame Heizdauer aus get_meas_dur(),
sodass eine Zeitbasis des Profils insgesamt 140 ms beträgt. set_heater_prof() schreibt dann
die zehn Schritte, und set_op_mode(BME69X_PARALLEL_MODE) startet den Sensor.
Die Schleife sammelt mit fetch_data() und get_data() jedes neue Feld und
vergleicht dessen status mit BME690_VALID_DATA, den drei kombinierten Statusbits,
sodass nur vollständige Gasmessungen ausgegeben werden.