はじめに
以前書いたこちらの記事 は多くの"いいね"(LGTM)や記事のストックがされていてページビューが伸びているものの、Raspberry Pi 3 model B に CentOS7がインストールされていることを前提にしていてあまり一般的な環境ではないのでRaspbian OSを前提として新たに記事を書きました。
元記事でも参考にしている 窓を開けて新鮮な空気をいれよう!Raspberry Pi でCO2 濃度を測ろう の MH-Z19 センサー用ライブラリ を使用しました。
これを使うことでCO2濃度の計測やキャリブレーションがノンプログラミングでできるようになりました。より手軽にRaspberry Piとセンサーの組み合わせを試せると思います。
本記事では、MH-Z19 から得たCO2濃度と気温を Mackarel でグラフ化します。
参考情報
- http://qiita.com/UedaTakeyuki/items/c5226960a7328155635f
- https://qiita.com/yukataoka/items/a3b4065e8210b8f372ff
- https://qiita.com/ww24/items/5409aefd87f14beff504
- https://pypi.org/project/mh-z19/
- https://mackerel.io/ja/docs/entry/advanced/custom-metrics
- https://raspida.com/release-raspberry-pi-imager
- https://github.com/mackerelio/mackerel-agent/releases
準備する物
- アイ・オー・データ機器 UD-RP3BP Raspberry Pi メインボード(Bluetooth、Wi-Fi対応モデル) Raspberry Pi 3 Model B+
- MH-Z19 0-5000PPM CO2室内空気質モニタ用赤外線CO2センサUART / PWM
- ELEGOO 120pcs多色デュポンワイヤー、arduino用ワイヤ—ゲ—ジ28AWG オス-メス オス-オス メス –メス ブレッドボードジャンパーワイヤー
- HiLetgo® 20個セット 40Pin 2.54mm 単一列端子ピン ヘッダー ストリップ PBC 1*40 P ピッチ Ardunioに対応 DIYセット [並行輸入品]
- その他、Raspberry Piをセットアップするための周辺機器(microSDカード 4GB以上, HDMI接続のディスプレイ,キーボード,マウス)
Raspbian OSの準備
Raspberry Pi Imagerを使用してRaspbianOSをSDカードに書き込みます。
Raspberry Pi Imagerダウンロードページから、使用しているPCのOS用のものをダウンロードします。
(以下はmacOS版の画面です。)
Operating System を選択し、OS選択画面を開きます。
一番上の Raspbian を選択します。
次に SD Card を選択します。(SDカードリーダー等にセットされているものが表示されます。)
ダウンロードするOSイメージのサイズが約1.1GB、microSDカードへの書き込まれるサイズが約3GBなので4GB以上のmicroSDカードが必要です。
OS, microSDカードの選択が完了すると WRITE がクリックできるようになります。
WRITEをクリックすると書き込みが始まります。OS書き込み終了までおよそ10分~15分ほどかかります。ダウンロード速度など環境によって時間は異なります。
書き込みが完了するとメッセージが表示されるのでmicroSDカードを抜き、Raspberry PiでOSを起動します。
RaspbianOSのアップデート
作業を進める前に、OSを最新の状態にします。
sudo apt-get update
sudo apt-get upgrade
sudo apt clean
sudo reboot
UARTシリアル通信の設定
UARTシリアル通信の設定を変更します。Raspberry PiにVNCで接続している場合や直接ディスプレイを接続している場合はRaspberry Pi Configuration、SSH接続している場合はraspi-configで設定できます。
Raspberry Pi Configurationから設定する場合
メニューから Preferences
→ Raspberry Pi Configuration
を選択します。次に Interfaces
のタブを選択します。
Serial Port とSerial Console を以下の状態に変更します。(デフォルトはどちらもdisable)
項目名 | 値 |
---|---|
Serial Port | Enable |
Serial Console | disable |
Terminalから設定する場合
sudo raspi-config
5 Interfacing Option
-> P6 Serial
Would you like a login shell to be accessible over serial?
No を選択。
Would you like the serial port hardware to be enabled?
Yes を選択。
MH-Z19の配線
以下のように、MH-Z19とRaspberry Piを接続します。
ピンヘッダーをMH-Z19の下から挿し、メス-メスのジャンパーワイヤーで接続しました。
メス-オスのジャンパーワイヤーとブレッドボードで接続することもできます。
Raspberry PiとMH-Z19の接続は以下のとおりです。画像は Raspberry Pi 2ものもになっていますが、Raspberry Pi 3でも同じ配線です。
配線する際は、Raspberry Piの電源を落としてから行います。電源を入れたまま配線した場合はMH-Z19が認識されない場合があります。
(Drown with Cacoo)
センサーライブラリのインストール
sudo pip3 install mh-z19
CO2濃度と気温の取得
以下のコマンドを実行することで、CO2濃度が得られます、
sudo python3 -m mh_z19
{"co2": 398}
sudo python3 -m mh_z19 --all
{"co2": 383, "temperature": 26, "TT": 66, "SS": 0, "UhUl": 0}
上記のコマンドで null
や9
が返る場合は配線が誤っているかMH-Z19とジャンパーワイヤーの接触が悪いことが原因と考えられます。Raspberry Piの電源を落として正しく配線したのちRaspberry Piを起動すると正常に認識します。
--allオプションを指定すると、気温など他の値も取得できますがこれらの値はMH-Z19の公式ドキュメントには掲載されていない値のようです。
TTは気温とは関連せずNDIR (非分散赤外線) 法によるCO2濃度の測定に必要な値のようです。この値は常に気温(摂氏)+40の値が出力されておりかつ気温も実際と比較して誤差が大きいため精度は低そうです。
参考
-
mh-z19 CO2 concentration sensor library for All models of Raspberry Pi :
Undocumented response values of 0x86 command.
-
Is the undocumented TT value on the responses of command 0x86 really related to the ambient temperature? :
The random mismatch between TT value and other thermal sensor value.
Mackerelの設定
サーバの管理や監視が行えるmackerelを使い取得したCO2濃度をグラフ化します。
サインアップすると14日間の試用期間ののちFreeプランに移行します。
Freeプランではグラフの保持期間が1日に限られます。
mackerelにサインアップ
サインアップ ページから手続きができます。詳細はヘルプを参照してください。
サインアップ後、APIキーを取得します。
mackerel-agentのインストール
記事執筆時点の最新版 v0.67.0をインストールします。
ARMプロセッサ用のバイナリをダウンロードします。
cd ~/
mkdir src && cd src
curl -sL https://github.com/mackerelio/mackerel-agent/releases/download/v0.67.0/mackerel-agent_linux_arm.tar.gz | tar xz
実行ファイルを /usr/local/bin/へ、mackerel-agent.conf を/etc/mackerel-agent/へ配置します。
sudo mkdir -p /usr/local/bin/ /etc/mackerel-agent
sudo cp -dpR mackerel-agent_linux_arm/mackerel-agent /usr/local/bin/
sudo cp mackerel-agent_linux_arm/mackerel-agent.conf /etc/mackerel-agent/
設定ファイルにAPIキーを登録します。
APIキーはmackerelにサインイン後、オーガニゼーションのページに記載されています。
sudo mackerel-agent init -apikey="YOUR API KEY"
mackerelをsystemdのserviceとして登録します。
sudo vi /lib/systemd/system/mackerel-agent.service
[Unit]
Description=mackerel-agent
After=network.target network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mackerel-agent
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure
[Install]
WantedBy=multi-user.target
Alias=mackerel-agent.service
sudo systemctl enable mackerel-agent
sudo systemctl start mackerel-agent
カスタムメトリックの追加
jqのインストール
CO2濃度の計測結果は以下のようにJSON形式で返されるので、mackerel-agentに値のみを渡せるように jq コマンドをインストールします。
sudo python3 -m mh_z19
{"co2": 398}
jq コマンドをインストールします。
sudo apt-get install jq
rubyのインストール
カスタムメトリックにCO2濃度の値を渡すスクリプトを ruby で書いたため ruby をインストールします。
sudo apt-get install ruby
CO2濃度を取得するスクリプト
mkdir -p /home/pi/mackerel
#!/usr/bin/env ruby
#encoding:UTF-8
arg = ENV.fetch("MONITOR") { "co2" }
if ENV['MACKEREL_AGENT_PLUGIN_META'] == '1'
require 'json'
meta = {
:graphs => {
'mh_z19.'+arg => {
:label => arg,
:unit => 'integer',
:metrics => [
{
:name => 'monitoring',
:label => arg
}
]
}
}
}
puts '# mackerel-agent-plugin'
puts meta.to_json
exit 0
end
res = `/usr/bin/python3 -m mh_z19 --all | jq .#{arg}`
res.chomp!
puts [ 'mh_z19.'+arg+'.monitoring', res , Time.now.to_i ].join("\t")
mackerel-confに追記
mackerel-agent.confに上記のスクリプトを呼び出す設定を追記します。
sudo vi /etc/mackerel-agent/mackerel-agent.conf
[plugin.metrics.co2]
command = "ruby /home/pi/mackerel/mh_z19_monitoring.rb"
env = { MONITOR = "co2" }
[plugin.metrics.temp]
command = "ruby /home/pi/mackerel/mh_z19_monitoring.rb"
env = { MONITOR = "temperature" }
CO2濃度を取得するスクリプト (Shell Script)
ruby スクリプトではなく Shell Scriptを使う例。
#!/bin/bash
SECONDS=`date '+%s'`
LABEL='CO2 monitor'
VALUE=`python3 -m mh_z19 --all | jq .co2`
echo -e "${LABEL}\t${VALUE}\t${SECONDS}"
[plugin.metrics.co2]
command = "ruby /home/pi/mackerel/mh_z19_monitoring.sh"
mackerelグラフ
CO2濃度の値が突然異常な値を示したりグラフが途切れてしまうことがあり、手元の環境では安定した値が取得出来ていません。
MH-Z19のキャリブレーション
以前書いた記事では手動で補正(キャリブレーション)を実施していましたが、今回利用するライブラリではキャリブレーション用のコマンドラインオプションが用意されています。
CALIBRATION & detection range
外気のCO2濃度は400ppmで、MH-Z19のマニュアルによるとこのセンサーの測定誤差は±(50ppm + 5%)あるそうなので測定値はおよそ350ppm ~ 450ppmが基準値となりそうです。
キャリブレーションの仕様は、マニュアルに記載されています。
ZERO Point Calibration
換気をしている室内で350ppm ~ 450ppの範囲を著しく逸脱する場合は、ゼロポイントキャリブレーションを行います。
sudo /usr/bin/python3 -m mh_z19 --zero_point_calibration
マニュアルによると20分以上400ppm未満で動作したことを確認すること
と書かれているので20分間は換気された状態で放置したほうが良さそうです。
NOTE:ZERO POINT is 400PPM, PLS MAKE SURE THE SENSOR HAD BEEN WORKED UNDER 400PPM FOR OVER 20MINUTES
Automatic Baseline Correction (ABC logic function)
電源ONのあと24時間毎に自動的にZERO Point Calibrationを実行するオプション。常時CO2濃度を計測している場合は、MH-Z19に通電したあとに一度このオプションを実行したほうが良いでしょう。
intelligently after a continuous operation period. The automatic calibration cycle is every 24 hours after powered on. The zero point of automatic calibration is 400ppm.
ただし、このオプションはオフィスや学校、家などの屋内に適しておりビニールハウスや農場、冷蔵施設には適さないそうです。その様な環境では、このオプションをOFFにし都度 ZERO Point Calibration を手動実行したほうがよいと書かれています。
This function is usually suitable for indoor air quality monitor such as offices, schools and homes, not suitable for greenhouse, farm and refrigeratory where this function should be off. Please do zero calibration timely, such as
manual or commend calibration.
ONにする場合。
sudo /usr/bin/python3 -m mh_z19 --abc_on
OFFにする場合。
sudo /usr/bin/python3 -m mh_z19 --abc_off