iizukak の雑記

忘れる前に書いとこう

オフィスの CO2 濃度と温湿度を可視化する、社内向け IoT サービスを作った

この記事は LeapMind Advent Calendar 2019 1 日目の記事です。

概要

オフィスの空気の質を監視したいというのは割とよくある需要だと思うのですが、手頃な製品は市販されていなさそうです。ので作ってみた、というのが本記事になります。具体的には、CO2 濃度と温度、湿度センサを取り付けたデバイスを実装し、サーバにデータを送信して可視化する IoT システムです。開発時の要件は次の通りでした。

  • デバイス
    • CO2 (二酸化炭素) 濃度が測定できる
    • 温度が測定できる
    • 湿度が測定できる
    • 一定期間ごとに (1 分間ごとなど) データを Wi-Fi 経由でサーバに送信できる
    • 1 台 5000 円以下
    • デバイスへのプログラムのデプロイが容易である
    • 実装が容易。電子工作初心者でも作れる
  • 可視化
    • 集まったデータはブラウザで時系列で可視化できる
    • それとは別に各拠点のデータをひと目で分かるようにもしたい
    • 社内の誰もが閲覧できる
    • データは誰でも自由に取り出せ、利用できる

この要件で実装を進め、現在 9 台の空気監視デバイスがオフィス各所にデプロイされており、データをリアルタイムで Google Cloud Platform (GCP) に送信しています。集まったデータは BigQuery に集約され、全社員がブラウザから Re:dash と自作のフロントエンドを用いて可視化した状態を確認できるようになっています。オフィスのどの区画の空気が悪いのか、換気すべきなのか、暑(寒)すぎるのか分かるようになりました。本システムを導入してから、窓が開いているのをを以前より頻繁に見るようになりました。ご協力ありがとうございます。

ここで作成したデバイスと可視化結果をいくつかご紹介します。

上記が作成されたデバイス。ESP32 がメインです。CO2 センサ、温湿度センサが乗っており、データを Wi-Fi 経由で GCP に送信する。電子工作初心者を含めみんなで作りたかったので、ブレッドボードで配線を行った

f:id:iizukak:20191128161511p:plain
ある日の朝から夕方にかけてのデータ。Re:dash を用いて可視化されている。左から、温度、湿度、CO2 濃度。湿度に関してはセンサから取得できる値が整数値のようだ

f:id:iizukak:20191128162129p:plain
Re:dash 上で CO2 濃度を拡大してみた。どのタイミングで空気が悪くなったか一目瞭然!概ね人の多いミーティングのときに悪くなる傾向がある

f:id:iizukak:20191128161707p:plain
@suttang さんが開発した素敵なフロントエンド。青 -> 緑 -> 黄 -> 赤で空気の悪さが示され、社内でもっぱら見られているのはこれ。ちなみに LeapMind では、会議室の名前に著名な計算機科学者の名前をつける習慣がある。Alan, Boole, Claude, Dijkstra, Neumann はそれぞれ会議室の名前。Office1~4 が執務室。灰色はなんらかの原因で稼働していないデバイス。

f:id:iizukak:20191128161813p:plain
空気が悪かったときの可視化結果。加湿しないと!

HackDays について

LeapMind では、HackDays と呼ばれる、業務を止めて作りたいものを作って良いというイベントが定期的に開催されるのですが、このプロジェクトは 5 日間普段の業務を止め、社内の 3 人でチームを組みゴリゴリと作成したものです。ありがとう HackDays 運営チーム。

ハードウェア

少し技術的なところを書いてみます。まずはハードウェアのほうから。

マイコン

ネットワークアクセスは必須要件です。当初 Raspberry Pi も選択肢になはったのですが、Linux は必要なさそうですし、起動も遅いです。そこで、 ESP32-DevKitC を選択しました。ESP32-DevKitC はメジャーな Wi-Fi 接続可能なマイコンボードであり、比較的1500 円程度と安価に購入できます。今回は CO2 センサ以外のものは秋月電子から購入し、1 台 5000 円の予算を守って作成できました。Aliexpress とかで安いのを買う手もありましたが、安定の秋月電子ということで秋月で買いました。

CO2 センサ

CO2 センサについてはいろいろとググったのですが、価格と精度の兼ね合いを考えると、 MH-Z19 というセンサが良さそうでした。日本国内で入手性が悪いため Aliexpress で購入しました。これが今回使ったパーツの中では一番単価が高く、1600 円ほどしました。10 台ほど程度使ってみて、精度はそこそこかなという印象です。精度の検証のために、Coxfox GDC-17 という CO2 計を使っているのですが、 100ppm くらい誤差が出そうです。またキャリブレーションはそこそこ面倒で、外気と同等の空気環境で 20 分放置する必要があります。ただ、 CO2 濃度センサのキャリブレーションは何を使うにせよめんどく臭そうな印象ですので MH-Z19 が悪いというわけでもなさそうです。

温湿度センサ

温湿度については、安いセンサでもある程度の精度が得られるので、今回はお手頃な DHT-11 を使いました。300 円。特に実用上問題は生じていません。

ディスプレイ

センサデータをデバイス本体だけでも確認したいので、ディスプレイをつけました。キャラクタディスプレイでもよかったのですが、使ってみたかったので SSD1306 の OLED のディスプレイ を使いました。OLED ディスププレイは視認性が良く、見やすいという声が聞かれました。社内でデバイスを見て「これで Vim でコーディングできませんか?」と言っていた人がいましたが、さすがにそれは厳しそう。

開発環境

PlatformIO を全面的に使いました。IDE は Visual Studio Code に PlatformIO を入れ、依存ライブラリの管理も PlatformIO におまかせで開発できました。最近はマイコン開発のエコシステムがとても整っていて、ほぼ詰まるところなく開発できました。素晴らしいです。

回路図

配線は以下のようになっています。10~15 分くらいで配線可能です。

f:id:iizukak:20191130141934p:plain

サーバ

Google Cloud Platform を使っています。このあたりは自分が担当していないのでキーワード程度ですがご紹介します。

Cloud IoT Core

ESP32 から GCP への接続は Cloud IoT Core を使っています。Cloud IoT Core を使ったのは初めてだったのですが、マイコンから GCP にセキュアにデータを送信するためには非常に良さそうという印象を受けました。プロトコルは MQTT を使っています。gcloud コマンドからデバイスを追加したりなど、今回くらいの小規模な場合でも使い勝手が良かったです。

BigQuery

GCP を使うので、データは BigQuery で作るのが良いだろうということで、BigQuery に入れてます。他のクラウドベースのデータベースでも可能だとは思うのですが、ブラウザ上でクエリを流してすぐ結果を見られるのは便利ですね。SQL 書ける人であればデータを見るだけくらいなら全然いける印象でした。

Re:dash

LeapMind では、 Re:dash を社内から自由に使えるようになっており、BigQuery に入っているデータを Re:dash を使って誰でも可視化して見ることができます。Re:dash は社内では他の用途でもよく使われている印象があり、サーバの利用統計や Github の利用統計なんかも Re:dash で見られたりします。このあたりはインフラチームがすごい。

まとめと課題

今回、 LeapMind の HackDays というイベントで、オフィスの空気状態を監視するハードウェアを作成し、サーバ側で可視化できるようにしました。結果として得られたデータは社内から誰でも閲覧でき、オフィスにいる人の空気への認識も少しは変わったように思います。

課題もあり、実はデバイスが不安定で、ときどき手で再起動してあげる必要があったりしています…。そこは直したい。また、この手の CO2 濃度監視デバイスの問題点として「換気するしか改善する方法がない」があります。当社のオフィスの場合は窓が比較的自由に開けられるので換気が可能なのですが、高層のオフィスビルだと窓が開かないでしょう。また、冬などは窓を開けると冷気が流れ込んでくるため開けられないということもあります。また、オフィスは自宅よりは広いので普通の方法では加湿が難しいですね。このあたりの解決方法はまだ模索している段階です。

最後に宣伝を…

LeapMind ではソフトウェアエンジニア採用を 通年で行っています 。普段の業務を止めて作りたい放題のイベント HackDays が定期的に開催される、GCP 自由に使える、スパコンいじれる、フルタイムで OSS 開発できる、Educational Support 制度など、ソフトウェアエンジニアがドッカンドッカン成果を出しつつ成長できる環境があると思います。深層学習のプロではなくても大丈夫なポジションもありますので、興味を持たれた方はぜひご応募ください。

LeapMind Advent Calendar 2019 の 2 日目は Masahiro Takahashi さんの予定です!