Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@revsystem

Raspberry Pi 3 で CO2濃度を測る (Raspbian OS)

Raspberry Pi 3 で CO2濃度を測る (Raspbian OS)

  • Raspberry Pi 4が手元にないのでRaspberry Pi 3を前提にしています。

はじめに

以前書いたこちらの記事 は多くの"いいね"(LGTM)や記事のストックがされていてページビューが伸びているものの、Raspberry Pi 3 model B に CentOS7がインストールされていることを前提にしていてあまり一般的な環境ではないのでRaspbian OSを前提として新たに記事を書きました。

元記事でも参考にしている 窓を開けて新鮮な空気をいれよう!Raspberry Pi でCO2 濃度を測ろう の MH-Z19 センサー用ライブラリ を使用しました。
これを使うことでCO2濃度の計測やキャリブレーションがノンプログラミングでできるようになりました。より手軽にRaspberry Piとセンサーの組み合わせを試せると思います。

本記事では、MH-Z19 から得たCO2濃度と気温を Mackarel でグラフ化します。

参考情報

準備する物

Raspbian OSの準備

Raspberry Pi Imagerを使用してRaspbianOSをSDカードに書き込みます。
Raspberry Pi Imagerダウンロードページから、使用しているPCのOS用のものをダウンロードします。
(以下はmacOS版の画面です。)
スクリーンショット 2020-03-30 1.47.18.png

Operating System を選択し、OS選択画面を開きます。
一番上の Raspbian を選択します。

スクリーンショット 2020-03-29 4.03.09.png

次に SD Card を選択します。(SDカードリーダー等にセットされているものが表示されます。)
ダウンロードするOSイメージのサイズが約1.1GB、microSDカードへの書き込まれるサイズが約3GBなので4GB以上のmicroSDカードが必要です。
スクリーンショット 2020-03-29 4.04.12.png

OS, microSDカードの選択が完了すると WRITE がクリックできるようになります。
スクリーンショット 2020-03-29 4.04.58.png

WRITEをクリックすると書き込みが始まります。OS書き込み終了までおよそ10分~15分ほどかかります。ダウンロード速度など環境によって時間は異なります。
スクリーンショット 2020-03-29 4.05.09.png

書き込みが完了するとメッセージが表示されるのでmicroSDカードを抜き、Raspberry PiでOSを起動します。
スクリーンショット 2020-03-29 4.15.38.png

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

スクリーンショット 2020-03-29 5.11.18.png

設定後、OSを再起動します。
スクリーンショット 2020-03-29 5.07.36.png

Terminalから設定する場合

sudo raspi-config

5 Interfacing Option -> P6 Serial

Would you like a login shell to be accessible over serial?
No を選択。

スクリーンショット 2020-03-29 5.13.09.png
スクリーンショット 2020-03-29 5.13.41.png
スクリーンショット 2020-03-29 5.14.14.png

Would you like the serial port hardware to be enabled?
Yes を選択。

スクリーンショット 2020-03-29 5.14.34.png

MH-Z19の配線

以下のように、MH-Z19とRaspberry Piを接続します。
ピンヘッダーをMH-Z19の下から挿し、メス-メスのジャンパーワイヤーで接続しました。
メス-オスのジャンパーワイヤーとブレッドボードで接続することもできます。
DSC_0654.JPG

Raspberry PiとMH-Z19の接続は以下のとおりです。画像は Raspberry Pi 2ものもになっていますが、Raspberry Pi 3でも同じ配線です。
配線する際は、Raspberry Piの電源を落としてから行います。電源を入れたまま配線した場合はMH-Z19が認識されない場合があります。

Raspberry Pi
(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}

上記のコマンドで null9が返る場合は配線が誤っているかMH-Z19とジャンパーワイヤーの接触が悪いことが原因と考えられます。Raspberry Piの電源を落として正しく配線したのちRaspberry Piを起動すると正常に認識します。

--allオプションを指定すると、気温など他の値も取得できますがこれらの値はMH-Z19の公式ドキュメントには掲載されていない値のようです。
TTは気温とは関連せずNDIR (非分散赤外線) 法によるCO2濃度の測定に必要な値のようです。この値は常に気温(摂氏)+40の値が出力されておりかつ気温も実際と比較して誤差が大きいため精度は低そうです。

参考

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
/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
/home/pi/mackerel/mh_z19_monitoring.rb
#!/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
/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を使う例。

home/pi/mackerel/mh_z19_monitoring.sh
#!/bin/bash

SECONDS=`date '+%s'`

LABEL='CO2 monitor'
VALUE=`python3 -m mh_z19  --all | jq .co2`

echo -e "${LABEL}\t${VALUE}\t${SECONDS}"
/etc/mackerel-agent/mackerel-agent.conf
[plugin.metrics.co2]
command = "ruby /home/pi/mackerel/mh_z19_monitoring.sh"

mackerelグラフ

スクリーンショット 2020-03-30 2.00.41.png
スクリーンショット 2020-03-30 2.27.08.png

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
14
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
14
Help us understand the problem. What is going on with this article?