Edited at

Raspberry Pi 3 で CO2濃度を測る


Raspberry Pi 3 で CO2濃度を測る


はじめに

社内で、この記事をきっかけに「社内のCO2濃度を測ってみたいね」「計測器を買ったり借りたりすると高いから、Raspberry Piでなんとかならないの?」という話になったので、さっそく試してみました。

すでに実績のある手順が公開されているので、参考にしました。

なぜ、カフェだと仕事がはかどるのか、を実験してみた。


端的にいうと、仕事場でいちばん生産性に影響を及ぼす因子は、気温とCO2濃度。その気温とCO2濃度がもっとも低く、生産性を高める環境というのが、自宅でも、オフィスでもなく、カフェなんだとか。



参考情報


前提条件


準備する物


OSのセットアップ

/boot/config.txt に enable_uart=1 を追加して UART を有効にします。

$ sudo vi /boot/config.txt

差分

diff --git 1/tmp/confifg.old 2/tmp/confifg.new

index 671312c..8cfe831 100644
--- 1/tmp/confifg.old
+++ 2/tmp/confifg.new
@@ -10,3 +10,4 @@ disable_overscan=0
core_freq=250
sdram_freq=400
over_voltage=0
+enable_uart=1

変更後、OS を再起動します。

$ sudo reboot


MH-Z19 の動作環境のセットアップ


プログラム動作環境のセットアップ

制御プログラムを動かすために、python-pip と pyserial をインストールします。

$ cd /tmp

$ sudo curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo pip install pyserial
$ sudo pip install redis

制御プログラムを取得するために、git をインストールします。

$ sudo yum install git -y

制御プログラムを git clone で取得します。あわせて制御プログラムから呼び出しているモジュールをインストールします。

$ cd

$ git clone https://github.com/UedaTakeyuki/slider.git
$ sudo pip install getrpimodel


ジャンパーワイヤを結線する。

"窓を開けて新鮮な空気をいれよう!Raspberry Pi でCO2 濃度を測ろう" の接続図を参考にしました。


制御プログラムを実行する。

git clone で取得した制御プログラムを実行します。

出力された値の単位は ppm。この場合は、 453ppm。

User's Manual よると ±(50ppm + 5%)の誤差があり、外気は約400ppmだそうなので、およそ正しそう。

$ cd slider

$ sudo mkdir -p /home/pi/LOG/
$ sudo python ./mh_z19.py
co2= 453


補正(キャリブレーション)

値が正しくなさそうな場合は、User's Manual 8ページ目に記載されている Calibrate zero point のコマンドを送信する。

Calibrate zero point のコマンドは、mh_z19.pyのコードを参考に、以下のように実装。

戻り値はないので、実行のみ。


  • calibrate.py

# -*- coding: utf-8 -*-

# refer http://eleparts.co.kr/data/design/product_file/SENSOR/gas/MH-Z19_CO2%20Manual%20V2.pdf
#
# <C2><A9> Takeyuki UEDA 2015 -

import serial
import time
import subprocess
import slider_utils as slider
import getrpimodel

if getrpimodel.model() == "3 Model B":
serial_dev = '/dev/ttyS0'
stop_getty = 'sudo systemctl stop serial-getty@ttyS0.service'
start_getty = 'sudo systemctl start serial-getty@ttyS0.service'
else:
serial_dev = '/dev/ttyAMA0'
stop_getty = 'sudo systemctl stop serial-getty@ttyAMA0.service'
start_getty = 'sudo systemctl start serial-getty@ttyAMA0.service'

def calibrateZeroPoing():
try:
ser = serial.Serial(serial_dev,
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1.0)
while 1:
result=ser.write("\xff\x01\x87\x00\x00\x00\x00\x00\x78")
break
except IOError:
slider.io_error_report()
except:
slider.unknown_error_report()

if __name__ == '__main__':
calibrateZeroPoing()
print "caribration zero point done."

実行します。

$ sudo python ./calibrate.py

caribration zero point done.

再度、mh_z19.py を実行し値を確認します。


cron 実行と値の記録

cron で 10 分毎に実行し、ファイルに出力する例。

(もしくは、mh_z19.py でファイル出力を実装する。)

*/10 * * * * sudo python /PATH/TO/slider/mh_z19.py >> /tmp/co2.txt


モノクロOLEDモジュールにCO2濃度を表示

"Raspberry Pi 3 Model Bに Adafruit PiOLED を接続" に、関連記事を書きました。


今後


  • MH-Z19 に単一列端子ピン ヘッダーをつけて結線を見直す。


  • Chart.jsなどでグラフ化する。

  • 閾値を設けて、超えたら換気を促すTypetalk botをつくる。