ESP-WROOM-02 を使って Wi-Fi 大気汚染モニタを作った

おもしろそうなセンサを見つけたので、実際に使って電子工作をしてみましたというお話。

ESP-WROOM-02 (Arduino 互換マイコンとして使える Wi-Fi モジュール) と、フィガロ技研の大気汚染検出センサ TGS2600 を使って Wi-Fi 大気汚染モニタを作ってみました。モノ自体は結構前に出来ていて、連続稼動に耐えるかしばらく動かし続けていましたが、問題なさそうなので記事にまとめてみます。

構成と機能

  • 大気汚染センサ TGS2600 を使用
  • 大気汚染センサの値を一定時間ごとに時系列 DB に対して送信
    • 現状は 10 秒おきに送ってる
  • デバイス自体も単体の Web サーバとして機能する
    • 現在のセンサ値の確認とブザーの動作確認がブラウザから可能
    • ブザーによるアラート発報用のエンドポイントを持つ
      • メトリクス可視化ツールからエンドポイントを叩く想定
      • センサ値をトリガーにするとか
  • 電源は AC アダプタから供給

使ったソースコードと回路図は Github で公開しています。何かの参考になれば幸いです。 リポジトリはここ👇

GitHub - yukirii/AirMon: Air Contaminants Monitor - 大気汚染モニタ

Air Contaminants Monitor - 大気汚染モニタ. Contribute to yukirii/AirMon development by creating an account on GitHub.

大気汚染センサ TGS2600

今回使用したのはフィガロ技研の TGS2600 というセンサです。秋葉原の aitendo で買ってきました。市販の空気清浄機のセンサにも使われているものらしく、煙やアルコールに敏感に反応します。

Arduino IDE のシリアルモニタで送られてきたセンサの値を、 Google Spreadsheet に突っ込んでグラフにしてみると、こんな感じ。

このセンサですが、 5V 定電圧駆動のセンサとなっており、 3.3V 駆動の ESP-WROOM-02 を使った回路で使用するには一工夫必要でした。当初 ESP-WROOM-02 内蔵の A/D 変換機能が使えないかと考えたのですが、入力電圧は 0 ~ 1V の範囲のみの対応であることがわかりました。抵抗分圧で範囲内に収めることも考えてみましたが、精度の面で不安があったため別の方法を検討しました。

今回はマイコンとは別に A/D コンバータを用意し、センサと A/D コンバータは 5V で動作させることにしました。A/D コンバータとマイコン間に 5V-3.3V のロジックレベル変換回路を挟み、A/D 変換結果の SPI 信号をマイコン側に取り込む作戦です。

回路図

A/D コンバータに MCP3002 を、レベル変換回路には Nch MOS-FET BSS138 を使いました。どちらも秋葉原の秋月電子で購入。

心あたたまる手配線😊 BSS138 は斜めに傾けると 2.54mm ピッチのユニバーサル基板にうまいこと収まります。白い紐は壁にあるフック的なやつに引っ掛けるためのもの。

センサデータの集約と可視化

自宅のサーバで InfluxDB と Grafana を動かしていたので、センサデータの集約と可視化にはそれらを流用しました。以前 ESP-WROOM-02 で遊んだ時には MQTT 使ったりもしたのですが、管理するコンポーネントを増やしたくなかったので、センサデータを受け取るためのサーバプログラムなどは用意せず、直接マイコンから HTTP で InfluxDB の API を叩いています。

Grafana では、一旦現在のセンサ値と、過去のセンサ値/変化量の推移を確認できる dashboard を作ってみました。日中/夕方/深夜とでグラフの変化量が結構変わります。TGS2600 はモジュール内のヒータで検出対象のガスを温めるような仕組みになっているため、気温や日光による影響を受けているかもしれません。

このデバイス自体も単体の Web サーバとして機能しています。ブラウザからデバイスに HTTP でアクセスすると、簡易的に現在のセンサ値の確認とブザーのテストができる仕組みになっています。Wi-Fi モジュールの IP アドレスは DHCP で割り当てられるため、 mDNS を使って IP アドレスが変化しても同じ名前でアクセスできるようにしました。

まとめと感想的なアレ

今はセンサ基板を部屋の壁にある通気口の中にブチ込んで、部屋に流れてくる外気の監視をしています。2ヶ月以上連続稼動させていますが、特にトラブル無く動き続けてくれています。

比較するデータが無いので、この街の空気が汚れているのか否かは判断できませんが、隣の住人がベランダでタバコを吸うとグラフが跳ねるので、空気の汚れ具合はセンサ値として反映はされているようです。 いやー、ベランダ喫煙、マジでやめてほしい💢💢💢

TGS2600 は相対値検知のセンサ (空気のきれいな時を基準として、その基準値からどれだけセンサの抵抗値が変化したかによって汚れ具合を検出する) であるため、空気が汚れたことを検知する目的であれば、空気がきれいな時の値を記憶するようなキャリブレーションの仕組みを入れたほうが良さそうです。InfluxDB のクエリや Grafana だけで、なんか上手いこと出来ないかな?w


comments powered by Disqus