新しいものづくりがわかるメディア

RSS


土日で完成! 趣味のラズパイ

土日で完成! 趣味のラズパイ 空気質センサー「BME680」で空気汚染度を測る

前回はBME680を利用して気温、湿度、気圧を測りました。今回はこれに加えて、ガスセンサーで空気の質を測ってみましょう。

一般的にセンサーは、ガスに含まれているガス成分が持つ特定の分子を測定します。特定の分子とは酸素や水素、メタン、プロパン、一酸化炭素、アンモニアなどです。取り付けられているセンサーでは抵抗値として測定されますが、抵抗値はガス濃度と比例しますので、抵抗値が高くなるほどその濃度は濃い、ということになります。BME680では有機溶剤やアルコールなどの検出が可能です。

まず、前回作り上げたPythonプログラムを見てみましょう。

#!usr/bin/env python
# -*- coding: utf-8 -*-
import bme680
import time

sensor = bme680.BME680()

sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)

try:
    while True:
        output = '{0:.1f} C,{1:.1f} %RH,{2:.1f} hPa'.format(
            sensor.data.temperature,
            sensor.data.humidity,
            sensor.data.pressure)
        print(output)
        time.sleep(1)
except:
    KeyboardInterrupt

これにガスを検知する内容を加えます。内容は以下の通りです。

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)

「sensor.set_gas_heater」というパラメーターが加わっていますが、センサーを加熱することでガス抵抗値を測定するためです。これを組み込んだプログラムは以下のようになります。

#!usr/bin/env python
# -*- coding: utf-8 -*-
import bme680
import time

sensor = bme680.BME680()

sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
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)

try:
    while True:
        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:.2f} Ohms'.format(
                    output,
                    sensor.data.gas_resistance))

            else:
                print(output)

        time.sleep(1)

except:KeyboardInterrupt

先ほど紹介したプログラムの「while True:」文に、「if」文が加わります。これは気温、湿度、気圧のセンサー値が測定でき、なおかつガスセンサーの加熱具合が安定した時に空気の質を測定するためです。ガスセンサーの値は抵抗値ですので「Ω」で表されます。ガスセンサーの値ですが、前回試した「read-all.py」で表される値から、小数点2桁まで表示するように変更しています。

ではこのプログラムを「bme680_air.py」として保存し、実行してみましょう。

$ python bme680_air.py
27.59 C,1024.63 hPa,35.94 %RH
27.57 C,1024.65 hPa,35.95 %RH,102446.98 Ohms
27.57 C,1024.64 hPa,35.97 %RH,109406.12 Ohms
27.59 C,1024.63 hPa,35.98 %RH,114569.58 Ohms
27.62 C,1024.63 hPa,35.99 %RH,118375.06 Ohms
27.63 C,1024.62 hPa,35.98 %RH,121377.31 Ohms
27.65 C,1024.65 hPa,35.98 %RH,123982.74 Ohms
27.65 C,1024.65 hPa,35.94 %RH,126415.59 Ohms
27.66 C,1024.63 hPa,35.92 %RH,128550.00 Ohms
27.68 C,1024.64 hPa,35.91 %RH,131064.66 Ohms
27.70 C,1024.63 hPa,35.87 %RH,132202.55 Ohms
27.72 C,1024.62 hPa,35.83 %RH,134107.79 Ohms
27.75 C,1024.63 hPa,35.79 %RH,135737.94 Ohms
27.78 C,1024.62 hPa,35.73 %RH,137521.03 Ohms
27.81 C,1024.62 hPa,35.69 %RH,139120.10 Ohms
27.82 C,1024.60 hPa,35.65 %RH,140756.80 Ohms
27.82 C,1024.61 hPa,35.64 %RH,140993.77 Ohms
27.82 C,1024.60 hPa,35.66 %RH,142675.12 Ohms
27.83 C,1024.61 hPa,35.68 %RH,144024.58 Ohms
27.84 C,1024.59 hPa,35.68 %RH,146033.63 Ohms
27.85 C,1024.61 hPa,35.65 %RH,145906.42 Ohms
27.85 C,1024.60 hPa,35.61 %RH,147577.59 Ohms

……以下続く

ガスセンサーは安定するまでに数分かかりますが、実行させたままにしておきましょう。そのあと芳香剤などをかざしてみると、数値が変化するのが分かります。

ターミナルで実行した結果 ターミナルで実行した結果

測定した値を記録する

では測定した値を記録してみましょう。CSVの形式であれば、Excelなどで読み込み、グラフが作れそうです。ただ、CSV形式で記録するには「hpa」などの単位表示が邪魔になります。以下のように、まずはこれを取り除きます。

その後ガスセンサーの項目に改行「 + '\n'」を入れ、with文の「with open ('bme680kiroku.csv','a') as f:」と「f.write(output_csv)」で、「bme680kiroku.csv」という名前のCSVファイルを書き込むようにします。

#!usr/bin/env python
# -*- coding: utf-8 -*-
import bme680
import time

sensor = bme680.BME680()

sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
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)

try:
    while True:
        if sensor.get_sensor_data():
            output = '{0:.2f},{1:.2f},{2:.2f}'.format(
                sensor.data.temperature,
                sensor.data.pressure,
                sensor.data.humidity)

            if sensor.data.heat_stable:
                output_csv = ('{0},{1:.2f}'.format(
                    output,
                    sensor.data.gas_resistance) + '\n')

                print(output_csv)

                with open ('bme680kiroku.csv','a') as f:
                    f.write(output_csv)

            else:
                print(output)

        time.sleep(1)

except:KeyboardInterrupt

このプログラムは「csvwrite.py」などのように保存します。このプログラムを走らせると、CSVファイルを記録してくれます。

Excelで読み込んだ結果 Excelで読み込んだ結果

ニュース

編集部のおすすめ

連載・シリーズ

注目のキーワード

もっと見る