Skip to main content

Prolaz grijača u paralelnom načinu rada

Što ovaj primjer prikazuje​

U paralelnom načinu rada senzor plina prolazi kroz profil grijača, dok se temperatura, tlak i vlažnost mjere neprekidno. Primjer koristi profil od deset koraka (temperature grijača od 100 do 320 °C), pri čemu svaki korak traje višekratnik jednog zajedničkog trajanja grijanja. Ispisuje samo ona polja koja sadrže valjano mjerenje plina obavljeno sa stabilnim grijačem.

Primjer stvara senzor pomoću BME690(), pa na portovima esp32 i esp8266 koristi I2C(0) sa signalom SDA na pinu 21 i SCL na pinu 22, na adresi 0x76.

Kôd primjera​

# 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,
)
)

🔗Otvorite cjeloviti primjer

Examples/bme690-parallelMode.py u commitu 91a07b5

→

Očekivani rezultat:

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

Svako valjano polje zatim ispisuje jedan redak: brojač milisekundi, temperaturu u °C, tlak u Pa, vlažnost u % r.H. i otpor plina u Ω (svaku vrijednost na dvije decimale), bajt statusa, korak profila grijača i indeks mjerenja. Ispisuju se samo polja čiji je status točno novi podaci, valjani plin i stabilan grijač, pa stupac statusa uvijek glasi 0xb0.

Korištene funkcije​

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

Stvara objekt senzora. Softverski resetira senzor, provjerava njegov ID čipa (0x61) i čita kalibracijske podatke. Javlja iznimku kada senzor ne odgovara ili je na toj adresi drugi čip; svaka druga funkcija svoj rezultat bilježi u statusu umjesto da javlja iznimku.

ReturnsObjekt senzora.

Parametri

TipNazivOpis
I2Ci2cSpreman objekt machine.I2C. Ako se izostavi, modul otvara I2C(0) sa SCL na pinu 22 i SDA na pinu 21 na portovima esp32 i esp8266 te na jednom firmwareu Soldered pločice, a na bilo kojem drugom portu javlja iznimku.
intaddressI2C adresa: BME69X_I2C_ADDR_LOW (0x76, zadano) ili BME69X_I2C_ADDR_HIGH (0x77).
intamb_tempTemperatura okoline u °C, koristi se za izračun postavke grijača. Zadano 25.
sensor.set_tph(os_temp=BME69X_OS_2X, os_pres=BME69X_OS_16X, os_hum=BME69X_OS_1X)returns None

Postavlja naduzorkovanje za temperaturu, tlak i vlažnost. Pozvana bez argumenata, kao ovdje, postavlja zadane vrijednosti Arduino biblioteke.

ReturnsNišta. Rezultat je u statusu.

Parametri

TipNazivOpis
intos_tempNaduzorkovanje temperature, od BME69X_OS_NONE do BME69X_OS_16X.
intos_presNaduzorkovanje tlaka, od BME69X_OS_NONE do BME69X_OS_16X.
intos_humNaduzorkovanje vlažnosti, od BME69X_OS_NONE do BME69X_OS_16X.
sensor.get_meas_dur(op_mode=BME69X_SLEEP_MODE)returns int

Izračunava koliko traje jedno mjerenje temperature, tlaka i vlažnosti, na temelju naduzorkovanja postavljenog pomoću set_tph(), stoga prvo pozovite set_tph(). U paralelnom načinu rada ne dodaje se vrijeme buđenja. Sa zadanim vrijednostima funkcije set_tph() ovdje vraća 41590 µs, pa je zajedničko trajanje grijanja u primjeru 140 - 41 = 99 ms.

ReturnsTrajanje mjerenja u mikrosekundama.

Parametri

TipNazivOpis
intop_modeNačin rada za koji se računa. Primjer prosljeđuje BME69X_PARALLEL_MODE, jer način rada još nije postavljen.
sensor.set_heater_prof(temp, dur, shared_heatr_dur=None)returns None

Postavlja profil grijača plina i uključuje grijač. S popisom temperatura, popisom množitelja i zajedničkim trajanjem grijanja, kao ovdje, upisuje profil za paralelni način rada: svaki korak traje svoj množitelj puta zajedničko trajanje. Temperature iznad 400 °C ograničavaju se na 400 °C. Zajedničko trajanje 0 ostavlja upozorenje Set the shared heater duration.

ReturnsNišta. Rezultat je u statusu.

Parametri

TipNazivOpis
listtempTemperatura grijača za svaki korak u °C. Primjer koristi HEATER_TEMP.
listdurU paralelnom načinu rada, množitelj zajedničkog trajanja za svaki korak. Primjer koristi HEATER_MUL.
intshared_heatr_durZajedničko trajanje grijanja u ms. Njegovim prosljeđivanjem odabire se paralelni način rada.
sensor.set_op_mode(op_mode)returns None

Šalje senzor u stanje mirovanja, a zatim postavlja traženi način rada. S BME69X_PARALLEL_MODE senzor samostalno nastavlja mjeriti i prolaziti kroz profil grijača. Način rada pamti se za fetch_data() i get_data().

ReturnsNišta. Rezultat je u statusu.

Parametri

TipNazivOpis
intop_modeBME69X_SLEEP_MODE, BME69X_FORCED_MODE, BME69X_PARALLEL_MODE ili BME69X_SEQUENTIAL_MODE.
sensor.check_status()returns int

Sažima status koji je ostavila posljednja funkcija.

ReturnsBME69X_ERROR (-1) nakon pogreške, BME69X_WARNING (1) nakon upozorenja, inače BME69X_OK (0).

sensor.status_string()returns str

Opisuje trenutni statusni kôd u nekoliko riječi, na primjer Communication failure ili No new data.

ReturnsOpis, prazan niz kada je status OK.

sensor.fetch_data()returns int

Čita tri polja rezultata senzora u međuspremnik modula i sortira ih tako da najstariji novi uzorak dođe prvi. Kada nema ničeg novog, status glasi No new data.

ReturnsBroj novih polja podataka, 0 kada ih nema.

sensor.get_data()returns tuple

Vraća sljedeće novo polje iz međuspremnika kao objekt BME690Data s temperaturom (°C), tlakom (Pa), vlažnošću (% r.H.), gas_resistance (Ω), status, gas_index (korak profila) i meas_index.

Returns(data, fields_left): BME690Data ili None kada nema novih podataka te koliko je novih polja preostalo nakon ovog.

Sve zajedno​

Primjer najprije izračuna zajedničko trajanje grijanja iz get_meas_dur(), tako da jedna vremenska baza profila ukupno traje 140 ms. set_heater_prof() zatim upisuje deset koraka, a set_op_mode(BME69X_PARALLEL_MODE) pokreće senzor. Petlja prikuplja svako novo polje pomoću fetch_data() i get_data() te uspoređuje njegov status s BME690_VALID_DATA, kombinacijom triju statusnih bitova, pa se ispisuju samo potpuna mjerenja plina.