Hobby Science&Experiment

愛と工作の日々

趣味でやっている工作や勉強したことのメモ書きです。

ラズパイでCO2/気圧/温度/湿度/ガスの総合測定+モニタリング【Ambient】

以前の記事で複合センサーBME680とCO2センサーMH-Z19BをRaspberry Piで使用するところまではやりました。
jakejake.hatenablog.com
jakejake.hatenablog.com
今回はそれらのセンサーの取得値(CO2/気圧/温度/湿度/有機ガス)をまとめて測定し、スマホから好きな時に確認出来るようにしたいと思います。

配線

f:id:tara-chang:20210131190954p:plain

ラズパイ側 BME680 MH-Z19B
3V3
CN1(Vin)
--
SCL1(3pin)
CN2(SCL)
--
SDA1(2pin)
CN3(SDA)
--
GND
CN4(GND)
GND(黒線)
5V0
--
VCC(赤線)
TXD0(14pin)
--
RX(青線)
RXD0(15pin)
--
TX(黄線)

※pinはGPIO番号です。

モニタリング

モニタリングにはAmbientを使わせて頂きました。一見難しそうですが利用は非常にシンプルで簡単でした。
ambidata.io
サインイン後、pythonライブラリーをインストールし、コードを数行付け足すだけで使用することが出来ます。
ambidata.io

コード全体

#bme680_and_CO2.py
#!/usr/bin/env python

import bme680
import time

print("""read-all.py - Displays temperature, pressure, humidity, and gas.

Press Ctrl+C to exit!

""")

try:
    sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
except IOError:
    sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY)

# These calibration data can safely be commented
# out, if desired.

print('Calibration data:')
for name in dir(sensor.calibration_data):

    if not name.startswith('_'):
        value = getattr(sensor.calibration_data, name)

        if isinstance(value, int):
            print('{}: {}'.format(name, value))

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

print('\n\nInitial reading:')
for name in dir(sensor.data):
    value = getattr(sensor.data, name)

    if not name.startswith('_'):
        print('{}: {}'.format(name, value))

sensor.set_gas_heater_temperature(320)
sensor.set_gas_heater_duration(150)
sensor.select_gas_heater_profile(0)

# Up to 10 heater profiles can be configured, each
# with their own temperature and duration.
# sensor.set_gas_heater_profile(200, 150, nb_profile=1)
# sensor.select_gas_heater_profile(1)
n=0
print('\n\nPolling:')
try:
    while n<5:
        if sensor.get_sensor_data():
            output = '{0:.2f} C,{1:.2f} hPa,{2:.2f} %RH'.format(
                sensor.data.temperature,
                sensor.data.pressure,
                sensor.data.humidity)

            if sensor.data.heat_stable:
                print('{0},{1} Ohms'.format(
                    output,
                    sensor.data.gas_resistance))

            else:
                print(output)
	
        time.sleep(1)
        n=n+1

except KeyboardInterrupt:
    pass


temp_bmp = sensor.data.temperature
hum_bmp = sensor.data.humidity
press_bmp = sensor.data.pressure
gas_bmp = sensor.data.gas_resistance

############################CO2#########################################
import mh_z19
co2read =  mh_z19.read_all()
co2 = co2read["co2"]
temp_co2 = co2read["temperature"]
print(co2,temp_co2)

############################RasPi#########################################

############################Ambient#####################################
import ambient
ambi = ambient.Ambient(チャネルId, ライトキー)
r = ambi.send({"d1": temp_bmp, "d2": hum_bmp, "d3": press_bmp, "d4": gas_bmp, "d5": co2, "d6": temp_co2, "d7": humid, "d8": humid})

定期実行

crontabにて5分毎に上記プログラムを実行するように設定しました。Ambientサーバーへの送信も5分に一度行われるようになっています。

*/5 * * * * python3 /home/pi/bme680_and_CO2.py

モニタリング状況

●PCから確認
f:id:tara-chang:20210131193303p:plain
スマホから確認
f:id:tara-chang:20210131193315p:plain
無事各種センサーの測定値がモニタリング出来ました!

課題

・BME680の有機ガスセンサーはセンサー値が安定するまで時間を要します。今のプログラムではその辺が上手く取り扱えていません。
・CO2濃度が一定値超えたらアラート…みたいな仕組みは今のところありません。Lineで通知しても良いかもしれませんね!
・サーバーへの情報送信、センサー測定のレートなどがどの程度の塩梅で行うのが省エネなのか、良く分かりません…。