換気は大事。部屋のC02濃度の記録を採るためにやったこと


気象庁 二酸化炭素濃度の経年変化 によると、2018年の世界のCO2平均濃度は、前年と比べて2.3ppm増えて407.8ppm となっているそうです。

地球温暖化によってCO2濃度が増え続けていることは懸念すべきことではありますが、新型コロナウィルスが流行している今現在の目の前の心配は、「密閉」「密集」「密接」の三密のうち「密閉」のリスクを回避するためにちゃんと部屋の換気が出来ているか、ということです。

室内のCO2濃度について、
厚生労働省 建築物環境衛生管理基準 では 1,000 ppm 以下
文部科学省 学校環境衛生の基準 では 1,500 ppm 以下
を管理基準としています。
また、CHC GROUP さん がまとめて下さっているこの図も参考になりそうです。

(出典:http://group.chcsys.net/jp/chcgroup/)

基準と照らし合わせて、自分の居場所のCO2濃度がどの程度なのか、ちゃんとしたデータを持っておきたかったので、センサを用いて計測することにしました。

用意したもの

Raspberry Pi 3 Model B
CO2センサー MH-Z19B

OS

Debian GNU/Linux
Linux raspberrypi 4.19.97-v7+ #1294 SMP Thu Jan 30 13:15:58 GMT 2020 armv7l

[Raspberry Pi の設定] - [インターフェイス] で Serial Port を有効にします。

Serial Port 有効後に Raspberry Pi を再起動します。

配線

GND, Vin, TxD, RxD それぞれに配線はんだ付けを行います。


(配線図 https://pypi.org/project/mh-z19/ より)

配線図にしたがって Raspberry Pi と CO2センサーを接続します。

パッケージのインストール

https://pypi.org/project/mh-z19/ の情報をもとにしました。
パッケージのインストール

$ sudo pip3 install mh-z19
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting mh-z19
  Downloading https://www.piwheels.org/simple/mh-z19/mh_z19-0.4.1-py3-none-any.whl
Collecting argparse (from mh-z19)
  Downloading https://files.pythonhosted.org/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl
Requirement already satisfied: pyserial in /usr/lib/python3/dist-packages (from mh-z19) (3.4)
Collecting getrpimodel (from mh-z19)
  Downloading https://www.piwheels.org/simple/getrpimodel/getrpimodel-0.1.15-py3-none-any.whl
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (from mh-z19) (2.21.0)
Installing collected packages: argparse, getrpimodel, mh-z19
Successfully installed argparse-1.4.0 getrpimodel-0.1.15 mh-z19-0.4.1

計測値の取得テスト

モジュール mh_z19 はディクショナリ型で結果を出力しているようです。
モジュール mh_z19 は JSON で結果を出力しているようです。
(@UedaTakeyuki さんから編集リクエストをいただきました。ありがとうございます。)

$ sudo python3 -m mh_z19
{"co2": 1456}

プログラムを作成

日時とセットで計測値を出力します。

import datetime
import mh_z19

now = datetime.datetime.now()
now = "{0:%Y-%m-%d %H:%M:%S}".format(now)
value = mh_z19.read().get("co2")  # ex: {"co2": 1456}
out = now + ',' + str(value)
print(out)  # コンソールに出力

出力結果

2020-04-15 19:34:01,1950

シェルスクリプトの作成

標準出力の結果をログファイルにリダイレクトします。
do.sh

#!/bin/sh

cd /home/pi/mh-z19
sudo python3 MeasureAndOutput.py >> ./log/logfile.csv

シェルスクリプトを実行可能モードにします。

$ chmod +x do.sh

定期実行の設定

$ crontab -e

エディターが起動するので、毎分計測してログを出力するように設定します。

# m h  dom mon dow   command
* * * * * mh-z19/do.sh

設定が有効となるように、cronを再起動します。

$ sudo /etc/init.d/cron restart
[ ok ] Restarting cron (via systemctl): cron.service.

数分後に確認したところ、シナリオ通りにログが出力されていました。

$ cat logfile.csv
2020-04-15 19:34:01,1950
2020-04-15 19:35:02,1957
2020-04-15 19:36:01,1965
2020-04-15 19:37:01,1976
2020-04-15 19:38:02,1983
2020-04-15 19:39:01,1996
2020-04-15 19:40:01,2032

グラフを作ってみる

出力されたログファイルをもとに、とりあえず手動でグラフを作ってみました。

このあとやりたいこと

・一定の濃度以上になったときにLINE Bot へアラート
・スマートスピーカーによる音声でのアラート

参考にさせていただいたQiitaの先輩

@revsystem さん https://qiita.com/revsystem/items/76ab1e21d386c5977892
@tororu さん https://qiita.com/tororu/items/20e8625d3fb24f3e06da
@UedaTakeyuki さん https://qiita.com/UedaTakeyuki/items/c5226960a7328155635f