Č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:
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 BME690Stvara 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
| Tip | Naziv | Opis |
|---|---|---|
I2C | i2c | Gotov 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. |
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 oversampling 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 | Oversampling temperature, od BME69X_OS_NONE do BME69X_OS_16X. |
int | os_pres | Oversampling tlaka, od BME69X_OS_NONE do BME69X_OS_16X. |
int | os_hum | Oversampling vlažnosti, od BME69X_OS_NONE do BME69X_OS_16X. |
sensor.set_filter(filter_size=BME69X_FILTER_OFF)returns NonePostavlja IIR filtar koji izglađuje očitanja temperature i tlaka.
ReturnsNišta. Rezultat je u statusu.
Parametri
| Tip | Naziv | Opis |
|---|---|---|
int | filter_size | BME69X_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 NonePostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
int | temp | Temperatura grijača u °C. Primjer koristi 300. |
int | dur | Trajanje grijanja u ms. Primjer koristi 100. |
int | shared_heatr_dur | Samo za parallel način rada; u forced načinu rada ga izostavite. |
sensor.check_status()returns intSaž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 strOpisuje 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 NoneStavlja 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
| Tip | Naziv | Opis |
|---|---|---|
int | op_mode | BME69X_SLEEP_MODE, BME69X_FORCED_MODE, BME69X_PARALLEL_MODE ili BME69X_SEQUENTIAL_MODE. |
sensor.get_meas_dur(op_mode=BME69X_SLEEP_MODE)returns intIzrač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
| Tip | Naziv | Opis |
|---|---|---|
int | op_mode | Nač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 tupleVrać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.