GAミント至上主義

Web Monomaniacal Developer.

Raspberry Pi + MH-Z19B + Firebaseで二酸化炭素濃度をウォッチする

仕事中眠くなったり、ぼーっとすることがあったら二酸化炭素が原因です(確信)。

濃度によってこのような影響が明らかになっており、オフィスや学校など法律でも一定以下にするよう決められているそうです。

特に新型コロナのご時世、テレワークをしている家ではオフィスビルの空調と比べて換気が悪いかもしれません。
出社されている方も、オフィス内の換気の目安にもなります。

CO2濃度が350ppmから450ppmであれば屋外と同等のレベル、700ppmを超えると注意が必要になり、1,000ppmを超えると眠気を誘われます。さらに2,500ppmを超えると、頭痛・倦怠感・注意力散漫など健康に害を及ぼす影響が出始め、5,000ppmを超えてしまうと、作業場所としては適しません。

attendant.hataraba.com


窓を開けっぱにしたり、頻繁に換気をすればいいんですが、外が寒かったり、暑かったり、花粉だったりすると換気をするには気が引けます。

そういうときにはデータを武器に戦いましょう。

Amazonでできあいのものも買えますが見なかったことにして、Raspberry Piで作ることにしました。

作ったもの

f:id:uyamazak:20200404214823j:plain

まだ試作段階でSlack通知とかつけてます。

ソースコード

コードや詳細はGitHubに上げました。この記事はGitHubのREADMEより前に書いてたので内容が重複しますが公開しておきます。

github.com

ざっくり予算

Raspberry Pi Zero WH 一式で3000円くらい?
MH-Z19B 2500円くらい
抵抗とかLEDとかブレッドボードとか多めに買って 1000円くらい

ということで0から揃えたら7500円〜程度でしょうか。
でもセンサー以外は他でも使えるのでプライスレス。

用意するもの

Raspberry Pi

今回は家にあった3Bを使いました。
普通にRasbianをインストールしておきます。

センサー MH-Z19B

どうやら中国メーカーのMH-Z19Bが2000円弱で買えて情報も多くよさそうです。
温度センサーなどど比べると結構なお値段しますが、レーザーでなんかやってるらしく中は複雑なのでしょうね。

MH Z19B 赤外線 CO2 用 CO2 モニター MH Z19B 5000PPM MH Z19B NDIR ガスセンサー CO2 ガスセンサー MH Z19|infrared co2 sensor|co2 sensorco2 gas sensor - AliExpress

私はアリエクスプレスで注文しました。
いろいろ出品されてますが、半田付けしたくないので、ピンヘッダ付きを選びました。
家とオフィスで必要になるかもしれないのでとりあえず2つ。
3/9に注文して3/23に到着しました。コロナの影響もあったかもしれませんが2週間ぐらいを見ておけばよさそうです。

マニュアル、データシートはこれ。
https://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf

ジャンパーワイヤー 最低限はメス−メス4本

MH-Z19Bはピンヘッダ付きを買ったので、ラズパイもどちらもメスで接続します。
最低限4本あれば足りますが、色は違ったほうが良さそう。

わたしは以前同じくアリエクスプレスでこんなのを買ったので一生大丈夫そうです。
ケーブルデュポンジャンパー線デュポン 30 男性 + メスオス + メスジャンパー銅線デュポンケーブル DIY キット|ワイヤー & ケーブル| - AliExpress

ブレッドボード

オプション。
ジャンパーワイヤ直結でもいけますが、ぶらぶらしてるのが不安だったり、のちのちLEDとかスイッチとかブザー使いたくなったら便利です。
オスメスなどのジャンパーワイヤが必要になります。

ラズパイに専用ライブラリをインストール

MH-Z19Bをかんたんに使えるライブラリ+ドキュメントをなんとGitHubPyPiに用意してくれています。感謝。
なにやらシリアルを使って通信しているようですが、全く意識することなく使うことができました。

github.com

超わかりやすい接続図
https://camo.githubusercontent.com/3cd4c1b482ea902b7e66dca13d4260193c831a63/68747470733a2f2f63616d6f2e716969746175736572636f6e74656e742e636f6d2f313132616435666534316338326131363637316432383832303730333834313039633838363063632f36383734373437303733336132663266373136393639373436313264363936643631363736353264373337343666373236353265373333333265363136643631376136663665363137373733326536333666366432663330326633343336333533343334326633303338333233383333333033313334326433363338363433323264363333333634363532643331333633343334326433373633333836343339363233373632333633323636363432653661373036353637

超試しやすいコマンド

pi@raspberrypi:~ $ sudo python -m mh_z19 
{'co2': 668}

ほんとにこれ通りにラズパイ設定して再起動、配線して、書いてあるコマンドを叩くだけで二酸化炭素濃度が返ってきます。

リビングで起動直後は1000オーバーでびっくりしましたが、換気したら600程度になったり、外に置いたら400弱で安定したり、このままでも大丈夫そうです。

Firestoreに送信する

取得した値はやっぱりWEBから確認したいもの。しかしRaspberry Piをインターネットには晒したくありません。
Raspberry Pi自体は、いつ壊れても差し替えやすいようにシンプルで可能な限りステートレスな状態に保ちたいものです。


そのため、以下のような設計とします。

Raspberry Pi でcron等で定期的にセンサーから値の取得コマンドを実行

取得した値をFireabse FunctionsのHTTPSのやつに送信

Firestoreに保存

WEB側でFirestoreから読み出してグラフにする。

こうすることでRaspberry Piは単純にURLにデータを送るだけでよく、Firebaseの認証や、SDKなどのインストールも必要ありません。
Pythonのファイル1つとcronかsystemdの設定のみで動くはず。

グラフで表示するWEB側もFirestoreをonSnapshotで参照することで簡単にリアルタイム更新が可能です。