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:
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 BME690Stvara 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
| Tip | Naziv | Opis |
|---|---|---|
I2C | i2c | Spreman 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. |
int | address | I2C adresa: BME69X_I2C_ADDR_LOW (0x76, zadano) ili BME69X_I2C_ADDR_HIGH (0x77). |
int | amb_temp | Temperatura 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 NonePostavlja naduzorkovanje za temperaturu, tlak i vlažnost. Pozvana bez argumenata, kao ovdje, postavlja zadane vrijednosti Arduino biblioteke.
ReturnsNišta. Rezultat je u statusu.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | os_temp | Naduzorkovanje temperature, od BME69X_OS_NONE do BME69X_OS_16X. |
int | os_pres | Naduzorkovanje tlaka, od BME69X_OS_NONE do BME69X_OS_16X. |
int | os_hum | Naduzorkovanje vlažnosti, od BME69X_OS_NONE do BME69X_OS_16X. |
sensor.get_meas_dur(op_mode=BME69X_SLEEP_MODE)returns intIzrač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
| Tip | Naziv | Opis |
|---|---|---|
int | op_mode | Nač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 NonePostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
list | temp | Temperatura grijača za svaki korak u °C. Primjer koristi HEATER_TEMP. |
list | dur | U paralelnom načinu rada, množitelj zajedničkog trajanja za svaki korak. Primjer koristi HEATER_MUL. |
int | shared_heatr_dur | Zajednič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
| Tip | Naziv | Opis |
|---|---|---|
int | op_mode | BME69X_SLEEP_MODE, BME69X_FORCED_MODE, BME69X_PARALLEL_MODE ili BME69X_SEQUENTIAL_MODE. |
sensor.check_status()returns intSaž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 strOpisuje 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 tupleVrać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.