土日で完成! 趣味のラズパイ
土日で完成! 趣味のラズパイ 空気質センサー「BME680」で空気汚染度を測る
前回はBME680を利用して気温、湿度、気圧を測りました。今回はこれに加えて、ガスセンサーで空気の質を測ってみましょう。
土日で完成! 趣味のラズパイ
第16回 ラズパイとChatGPTで遊ぼう——圧電ブザーで音を鳴らす
第15回 ラズパイとChatGPTで遊ぼう——気温/湿度/気圧を測定する
第14回 ChatGPTで遊ぼう——ラズパイで作ったデジタル時計に天気情報も表示させる
第13回 ラズパイとChatGPTで遊ぼう——液晶時計を作る
第12回 ラズパイとChatGPTで遊ぶ——その1:Lチカさせてみる
第11回 ラズパイをブリッジモードで使って、Wi-Fi接続する
第10回 ラズパイをWi-Fiルーターにする
特別編 【実機レビュー】よりパワフルになったRaspberry Pi 5を検証!
第9回 VolumioでラズパイからSpotifyやradikoを楽しむ
第8回 ラズパイで音楽プレーヤー「Volumio」を楽しむ
第7回 GPSを導入して正確な時刻を刻む
第6回 ラズパイをNTPサーバーにする
第5回 ラズパイを使ってデジタル時計を作る
第4回 Raspberry Pi Camera Module 3を使って見守りカメラを作る
第3回 BME680の測定データを小型ディスプレイに表示させる
第2回 空気質センサー「BME680」で空気汚染度を測る
第1回 ラズパイ工作の基本! 気温と湿度、気圧を計測する
一覧ページへ
一般的にセンサーは、ガスに含まれているガス成分が持つ特定の分子を測定します。特定の分子とは酸素や水素、メタン、プロパン、一酸化炭素、アンモニアなどです。取り付けられているセンサーでは抵抗値として測定されますが、抵抗値はガス濃度と比例しますので、抵抗値が高くなるほどその濃度は濃い、ということになります。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ファイルを記録してくれます。