Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

自宅作業環境の二酸化炭素濃度をM5Stack+CCS811で計測してみた

morimorihogeです。自宅リモートワーク環境が拡充に次ぐ拡充を重ねて完全に引きこもりモードになってきました。Ryzen 3700X環境に慣れるともうノートPC環境には戻れない。

さて、ソフトウェアエンジニアな皆様におかれましてはフルリモート環境や部分リモート環境が一般的になりつつある昨今ですが、オフィス環境と自宅環境で勝手が違うことでイマイチ調子が出ない人もいるのではないかと思います。
僕は元々リモート環境も普通にこなしていたのですが、いつもは週に1~3日くらいは何かしら打ち合わせ等で外に出る機会があったので、ここまで自宅作業メインになることははじめてです。もう4か月くらい都内に行ってない。

オフィス環境と違って調子が出ない理由にはいろいろなものが考えられますが、ディスプレイやPCなどのモノは分かりやすいのでそろえればいいだけの話だと思います。一方で、空調や明るさなどは目に見えないこともあり今一つ気が回らないところではないでしょうか。

本記事では、M5Stack Basic空気品質センサモジュールCCS811を使い、二酸化炭素(CO2)濃度を計測する環境構築を行います。
一応電子工作やマイコン工作素人な人向けに書いていますが、よくわからない点などあればTwitter等でフィードバックいただければと思います。

※本記事は健康や電子工作について素人な人間がやっておりますので、その点ご了承の上閲覧下さい

二酸化炭素濃度(CO2)の健康基準について

IIJのスマートメーターBルートブログでちょうどよい記事がありますのでこちらを参照するとよいと思います。

CO2センサーで自宅の二酸化炭素濃度を測ってみた | スマートメーターBルートブログ

こちらで紹介されている表が分かりやすいですね。


route-b.iij.ad.jpより

これを見ると、日本では建築物及び事務所や学校などの環境において二酸化炭素濃度の基準が定められていることが分かります。
特定建築物とされる多数の人が利用する施設では2か月以内ごとに1回の測定が必要なようなので、そういった施設では1,000 ppm以下の状態がキープされているのだと思います。
さらっと調べた限りでは一般の事務所などにおける定期検査の実施等については見つかりませんでしたが、弊社の入居しているビルでも年に1回くらいは環境測定?か何かで調査の方が出入りしたりしていた記憶があるので、何かしら基準があるのかもしれません(都道府県によっても違うかも?)。

一方で、自宅環境については建築時には基準を満たしているとは思いますが、入居後については空気環境調査などしたことがない人が大半ではないかと思います。
オフィスのビル空調は自宅に比べればかなり排気能力の高いものが使われていると思うので、オフィス環境と自宅環境では空調に差があるわけですね。

計測方法の検討

というわけで、自宅の二酸化炭素濃度計測方法について調べてみました。

市販の計測機器を使う

ここでは素人がふわっとやってみたいだけなので、産業用途レベルの精度や信頼性は不要ということでとりあえず市販品を検索してみると、6000円~1万円以上の機器まで色々と見つかります。
最初は2~3,000円くらいで買えるかな?と思っていたのですが、意外とお高くて厳しい。そもそも今の所そこまで常用するつもりもないものなので、あまりでかいのを買うのもなあ・・・という印象です。

# と思ったら、今は安いのがありますね(記事執筆時3,779円)

適当なセンサモジュールを適当なマイコンボードに繋いで自作する

まあ趣味の領域やし自作したろ、というやつです。現代ではRaspberry PiArduinoなど、昔と比べたら超絶簡単に使えるマイコンボードがとてもお安く数千円程度で手に入ります。
センサモジュールも、ADCでアナログ値を取得してデータシート見て値変換して・・・みたいなことをやらずとも、I2C経由でいきなり正規化済みの値が取れるといっためんどくさいことを抜きにとりあえず繋げば動くという世界になっています。

マイコンボードは何使っても良いとは思うのですが、今回の用途だとある程度電源を入れっぱなしで使う可能性があることから低消費電力、データもシリアル経由とかで見るのはしんどいのでLCDとか全部入りだと楽だよな、ということでM5Stackを選択しました。
ちなみにM5Stackを触ってすごくいいなと思ったのはバッテリが内蔵されていることです。センサ系の計測はあちこち移動しつつやる必要があるのですが、バッテリが付いていないものだとUSBバッテリなどを一緒に持ち歩かねばならず、ケーブルが増えて取り回しがだるいです。
そのほかにも、M5Stackは

  • ケースが付いている:大抵むき出しボードを買って後で買うと高かったり排熱に悩む
  • ディスプレイが付いている:デバッグが圧倒的に楽
  • ボタンが付いている:意外と見落としがちだがちょっと凝ったことをしようとすると欲しくなるやつ
  • ケースを付けた状態でジャンパワイヤのソケットが刺さる:開発中もケースの蓋を閉めておけるので、ふとした破壊を防げる
  • 標準キットにジャンパワイヤが数本分付属してくる:「いざやるぞ」と思ったときにモノが足りない悲しみを防げる(地味に大事)

という点で、よく考えられたキットだと思います。特に経験や蓄積がない初心者には断然オススメできます。

センサモジュールは現実的な入手性、情報の多さを考えるとSCD30というCO2、湿度、温度センサがよさそうで、記事を書いている方もいた(換気のすゝめ ~M5StackでCO2濃度モニタを作る~)のですが、これが結構お高い(8,000円前後くらいする)ので、他のセンサを探しました。
次点ではMH-Z19Bというセンサが見つかりましたが、こちらも3000円前後~という感じでそこそこにお高い。

最終的にCCS811というセンサが1500円~3000円弱程度で値ごろなこと、精度についても以下の記事を見る限りでは遊びレベルで使う分には何の問題もなさそうだな、ということでこれを買うことにしました。

CO2センサー、空気品質センサーの測定値を比較する | Ambient

最終的に本記事で使ったのは、以下の通りになります。

  • M5Stack本体
  • CCS811:ピンヘッダなしのものを買ったのでそこは自分で付けた(後述)
  • CSS811用ピンヘッダ(1x7):こういうやつです。
  • 配線用のブレッドボード(小):こういうやつです。4 pin配線できればよかったので、結果としてはもっと小さくても良かった

センサ計測の自作まで

大体2~3時間くらいで一通りできました。
ただ、前提知識として僕はArduino触ったことがあるのでサクサクできているだけで、Arduinoもこの手の電子工作&マイコン開発っぽいこともはじめて、という人は勘所が分からないのでそれなりに大変だと思います。

M5Stack開封の儀

とりあえず箱から出してUSBケーブル(A-Cケーブルが付属してます)を繋げばなんかいい感じに起動してボタンテストアプリが動きました。

ディスプレイがあると返品が必要なレベルのチェックが超手軽にできるのは良いですね。すばらしい。

CSS811のピンヘッダ実装(はんだ付け)

購入したCSS811モジュールはピンヘッダが実装されていないので、自前で実装する必要があります。
以下の写真のようになっているのを

こんな感じで配線します。ピンヘッダは1x7のサイズのものがなければ切り取れば良いです(1xのサイズのものであれば手でむしれます)。

これで配線の準備が整いました。はんだ付けはムラがありますが、結線されてればいいのだという心で。

M5StackとCSS811の物理接続

M5StackとCSS811を接続します。
M5StackにはあらかじめI2Cのピンが出ているので、付属のジャンパワイヤを使って以下のように配線します(付属の状態では束ねられてますが、手でむしれば1本ずつバラせます)。GND、3.3V、SDA、SCLの4つを繋げばよいです。
※この辺でCCS811のジャンパピン上下間違えたなーと思いましたが気にしないことにしました

この辺りの接続についてはCSS811モジュールを出しているSparkfun公式のCCS811 Air Quality Breakout Hookup Guideがとても分かりやすかったです。
M5Stackと繋ぐガイドではないですが、M5Stackは後述のようにArduino互換なので、そのまま参考にすることができます。

M5Stackのコードを書く

今回M5Stackを使うのははじめてだったので、ここが一番面倒でした。個別に解説するのも面倒なのでざっと書くとこんな感じです。

  • M5Stack公式HPはやたらとUIFlowというIDEを推してくるが、ここではArduinoのIDEを使う必要がある(UIFlowは多分UIFlow用のファームウェアを焼いてオンラインプログラミングできるようなツールなのかなあ)
  • 色々ぐぐったが、結局一番よくできてたのはM5Stack付属の物理マニュアルだった(以下画像)。この通りでとりあえずM5Stackにコードを書いてdeployできるようになる

  • Arduino IDEの使い勝手がなかなか慣れないが、とりあえず M5StackSparkFun BME280SparkFun CCS811 Arduino Libraryを「ツール -> ライブラリを管理」から入れれば良い
  • Serial.print() / Serial.println()をLCDに出そうと思って M5.Lcd.print()M5.Lcd.println()に書き換えてみたが、インターフェース互換が全然なくて単純wrappingは諦めた
  • Cを久々に書いた(Stringクラスくらいは欲しいぜ)
  • 2000年代にちょいちょい趣味&学生としてセンサを触ってたことのある人間としては、ADCではなくI2C経由でセンサデータが取れるというのは本当に良いですね。今回開発している中で一番よいと思いました(I2Cだと結線や電源不良の場合に通信エラーになるのがありがたい)

Sparkfun公式のサンプルコードをちょいちょい直したコードが以下になります。もし同じことやる人がいれば動作確認くらいには使えると思います。
※Sparkfun公式コードはシリアルにしかデータが出ないのを、M5StackのLcdに値表示するようにしただけです

動かしてみる

こんな感じです。値が出ればとりあえずええんや!

作業環境の二酸化炭素濃度計測をやってみる

さて、プログラム的には動いたので今度はちゃんとセンサ値がまともな値なのかを確かめるべく、室内~外などでちょいちょい条件を変えて計測してみます。

  • いつもの作業環境: 3,200 ppm前後
  • ベランダに出てみる: 800 ppm前後
  • 作業環境でドアを開けてサーキュレーターで換気口経由で換気してみる: 2,000 ppm前後
  • 作業環境で窓を全開にしてサーキュレーターで換気してみる: 900 ppm前後
  • その後、窓を閉めて普段の環境に戻す(直後1分ほど): 1,200 ppm前後
  • その後5分ほど経過: 1,600 ppm前後
  • 1時間後: 2,600 ppm前後

注:短時間で計測を行ったので、センサのキャリブレーションが十分でなかった可能性もあります。値は参考までということで

なんとなくそれっぽいデータが取れているように見えます。特に、同じ場所で換気前後で明らかに値が違うというのは少なくともセンサが死んでいるわけではなさそうです。
その上で値を信用してみると、いつもの作業環境がそれなりに悪い環境であることが良くわかります。5,000 ppm以下ではありますが、特定建築物で求められるような1,000 ppm以下というラインを目指そうとするとかなり厳しいですね。

まとめ

そんなわけで、たまにはセンサ触りたいなと思ったのでごそごそしてみました。
まだ表示をチャートにしたいなーとか、配線を工夫したいななど思うことはありますが、自分しか使わない最低ラインとしてはとりあえずこれでMVP(Minimum Viable Product)だよな、という感じですね。

今回の開発で、ある地点の二酸化炭素濃度をざっくり計測できるようになったので、今後はサーキュレーターの向きや角度を調整したりといった方面に工夫しつつ、健康な開発に役立てていこうと思います。まる。

関連記事

暗い廊下も怖くない: 自動点灯する照明を作った


関連記事

該当する記事がありません。

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。