Skip to main content

Čitanje u forced načinu rada

Što ovaj primjer prikazuje​

U forced načinu rada senzor izvodi jedno mjerenje svaki put kad ga zatražite. Primjer postavlja oversampling, IIR filtar i jedan korak grijača (300 °C tijekom 100 ms), zatim svake sekunde pokreće mjerenje i ispisuje temperaturu, tlak, vlažnost i otpor plina. Ovo je uobičajen način čitanja senzora.

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

Kod primjera​

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

🔗Otvorite cijeli primjer

Examples/bme690-forcedMode.py u commitu 91a07b5

→

Očekivani rezultat:

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

Svako novo mjerenje zatim ispisuje jedan redak tim redoslijedom: brojač milisekundi, temperaturu u °C, tlak u Pa, vlažnost u % r.H. i otpor plina u Ω (svako na dvije decimale) te statusni bajt u heksadecimalnom zapisu. 0xb0 znači novi podaci, valjano mjerenje plina i stabilan grijač.

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 ako senzor ne odgovara ili je na adresi drugi čip; sve ostale funkcije svoj rezultat bilježe u statusu umjesto da javljaju iznimku.

ReturnsObjekt senzora.

Parametri

TipNazivOpis
I2Ci2cGotov objekt machine.I2C. Ako je izostavljen, modul otvara I2C(0) sa SCL na pinu 22 i SDA na pinu 21 na portovima esp32 i esp8266 te na jednom firmveru 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 oversampling 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_tempOversampling temperature, od BME69X_OS_NONE do BME69X_OS_16X.
intos_presOversampling tlaka, od BME69X_OS_NONE do BME69X_OS_16X.
intos_humOversampling vlažnosti, od BME69X_OS_NONE do BME69X_OS_16X.
sensor.set_filter(filter_size=BME69X_FILTER_OFF)returns None

Postavlja IIR filtar koji izglađuje očitanja temperature i tlaka.

ReturnsNišta. Rezultat je u statusu.

Parametri

TipNazivOpis
intfilter_sizeBME69X_FILTER_OFF ili BME69X_FILTER_SIZE_1, _3, _7, _15, _31, _63 ili _127. Primjer koristi BME69X_FILTER_SIZE_3.
sensor.set_heater_prof(temp, dur, shared_heatr_dur=None)returns None

Postavlja profil grijača plina i uključuje grijač. S jednom temperaturom i jednim trajanjem, kao ovdje, upisuje jedan korak grijača koji koristi forced način rada. Temperature iznad 400 °C ograničavaju se na 400 °C.

ReturnsNišta. Rezultat je u statusu.

Parametri

TipNazivOpis
inttempTemperatura grijača u °C. Primjer koristi 300.
intdurTrajanje grijanja u ms. Primjer koristi 100.
intshared_heatr_durSamo za parallel način rada; u forced načinu rada ga izostavite.
sensor.check_status()returns int

Sažima status koji je ostavila zadnja 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 kod u nekoliko riječi, na primjer Communication failure ili No new data.

ReturnsOpis, prazan niz kad je status OK.

sensor.set_op_mode(op_mode)returns None

Stavlja senzor u stanje mirovanja, zatim postavlja traženi način rada. BME69X_FORCED_MODE pokreće jedno mjerenje. Način rada pamti se za get_meas_dur(), 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.get_meas_dur(op_mode=BME69X_SLEEP_MODE)returns int

Izračunava koliko traje jedno mjerenje temperature, tlaka i vlažnosti, na temelju oversamplinga postavljenog funkcijom set_tph(), zato prvo pozovite set_tph(). Izvan parallel načina rada dodaje 1 ms za buđenje senzora. Trajanje grijanja nije dio rezultata.

ReturnsTrajanje mjerenja u mikrosekundama.

Parametri

TipNazivOpis
intop_modeNačin rada za koji se izračunava. Ako je izostavljen, zadnji način postavljen funkcijom set_op_mode().
sensor.fetch_data()returns int

Čita izmjerene podatke iz senzora u međuspremnik modula. U forced načinu rada čita jedno polje rezultata. Kad nema ničeg novog, status glasi No new data.

ReturnsBroj novih polja podataka, 0 kad ih nema.

sensor.get_data()returns tuple

Vraća sljedeće polje iz međuspremnika kao objekt BME690Data s temperature (°C), pressure (Pa), humidity (% r.H.), gas_resistance (Ω), status, gas_index i meas_index. U forced načinu rada uvijek vraća jedno polje.

Returns(data, fields_left): BME690Data i broj preostalih novih polja (0 u forced načinu rada).

Sve zajedno​

BME690() pronalazi senzor, a set_tph(), set_filter() i set_heater_prof() ga postavljaju. check_status() čita samo status koji je zadnji od tih poziva ostavio, pa se skripta zaustavlja s razlogom kad postavljanje grijača prijavi pogrešku; upozorenje je ne zaustavlja. U petlji set_op_mode(BME69X_FORCED_MODE) pokreće jedno mjerenje, skripta miruje get_meas_dur() mikrosekundi, a fetch_data() s get_data() prikupljaju rezultat. Petlja u kojoj fetch_data() vrati 0 ne ispisuje ništa.

Komentar u primjeru kaže da čekanje uključuje trajanje grijanja, ali get_meas_dur() ga ne pribraja: sa zadanim vrijednostima set_tph() vraća 42590 µs, što je kraće od koraka grijača od 100 ms. fetch_data() zatim provjerava ima li novih podataka do pet puta, u razmaku od 10 ms, prije nego što odustane u toj petlji.

Ako ste pomaknuli jumper ADDR, stvorite senzor pomoću BME690(address=BME69X_I2C_ADDR_HIGH) i iz modula bme690 uvezite i BME69X_I2C_ADDR_HIGH.