mirror of
https://github.com/cmur2/python-bme680.git
synced 2024-11-14 08:56:20 +01:00
109 lines
3.2 KiB
Python
Executable File
109 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import bme680
|
|
import time
|
|
|
|
print("""indoor-air-quality.py - Estimates indoor air quality.
|
|
|
|
Runs the sensor for a burn-in period, then uses a
|
|
combination of relative humidity and gas resistance
|
|
to estimate indoor air quality as a percentage.
|
|
|
|
Press Ctrl+C to exit!
|
|
|
|
""")
|
|
|
|
try:
|
|
sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
|
|
except IOError:
|
|
sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY)
|
|
|
|
# These oversampling settings can be tweaked to
|
|
# change the balance between accuracy and noise in
|
|
# the data.
|
|
|
|
sensor.set_humidity_oversample(bme680.OS_2X)
|
|
sensor.set_pressure_oversample(bme680.OS_4X)
|
|
sensor.set_temperature_oversample(bme680.OS_8X)
|
|
sensor.set_filter(bme680.FILTER_SIZE_3)
|
|
sensor.set_gas_status(bme680.ENABLE_GAS_MEAS)
|
|
|
|
sensor.set_gas_heater_temperature(320)
|
|
sensor.set_gas_heater_duration(150)
|
|
sensor.select_gas_heater_profile(0)
|
|
|
|
# start_time and curr_time ensure that the
|
|
# burn_in_time (in seconds) is kept track of.
|
|
|
|
start_time = time.time()
|
|
curr_time = time.time()
|
|
burn_in_time = 300
|
|
|
|
burn_in_data = []
|
|
|
|
try:
|
|
# Collect gas resistance burn-in values, then use the average
|
|
# of the last 50 values to set the upper limit for calculating
|
|
# gas_baseline.
|
|
print('Collecting gas resistance burn-in data for 5 mins\n')
|
|
while curr_time - start_time < burn_in_time:
|
|
curr_time = time.time()
|
|
if sensor.get_sensor_data() and sensor.data.heat_stable:
|
|
gas = sensor.data.gas_resistance
|
|
burn_in_data.append(gas)
|
|
print('Gas: {0} Ohms'.format(gas))
|
|
time.sleep(1)
|
|
|
|
gas_baseline = sum(burn_in_data[-50:]) / 50.0
|
|
|
|
# Set the humidity baseline to 40%, an optimal indoor humidity.
|
|
hum_baseline = 40.0
|
|
|
|
# This sets the balance between humidity and gas reading in the
|
|
# calculation of air_quality_score (25:75, humidity:gas)
|
|
hum_weighting = 0.25
|
|
|
|
print('Gas baseline: {0} Ohms, humidity baseline: {1:.2f} %RH\n'.format(
|
|
gas_baseline,
|
|
hum_baseline))
|
|
|
|
while True:
|
|
if sensor.get_sensor_data() and sensor.data.heat_stable:
|
|
gas = sensor.data.gas_resistance
|
|
gas_offset = gas_baseline - gas
|
|
|
|
hum = sensor.data.humidity
|
|
hum_offset = hum - hum_baseline
|
|
|
|
# Calculate hum_score as the distance from the hum_baseline.
|
|
if hum_offset > 0:
|
|
hum_score = (100 - hum_baseline - hum_offset)
|
|
hum_score /= (100 - hum_baseline)
|
|
hum_score *= (hum_weighting * 100)
|
|
|
|
else:
|
|
hum_score = (hum_baseline + hum_offset)
|
|
hum_score /= hum_baseline
|
|
hum_score *= (hum_weighting * 100)
|
|
|
|
# Calculate gas_score as the distance from the gas_baseline.
|
|
if gas_offset > 0:
|
|
gas_score = (gas / gas_baseline)
|
|
gas_score *= (100 - (hum_weighting * 100))
|
|
|
|
else:
|
|
gas_score = 100 - (hum_weighting * 100)
|
|
|
|
# Calculate air_quality_score.
|
|
air_quality_score = hum_score + gas_score
|
|
|
|
print('Gas: {0:.2f} Ohms,humidity: {1:.2f} %RH,air quality: {2:.2f}'.format(
|
|
gas,
|
|
hum,
|
|
air_quality_score))
|
|
|
|
time.sleep(1)
|
|
|
|
except KeyboardInterrupt:
|
|
pass
|