タバコの受動喫煙対策で煙の検出用のI2C接続のタイプのTVOCセンサーのSGP30を使ってみた。
前に、I2C接続のタイプのTVOCセンサーを手に入れたというblogエントリーを書いたが、その続きだ。
SGP30は、 水素H2と、エタノール、TVOC、二酸化炭素eCO2を測定できるセンサーだ。有能だが、他のセンサーに比べてちょっと値段が高い。
Amazonで比較的安いSGP30のブレークアウト基板を注文したのだが、届かなかった。
代わりにちょっと値段が高めのSGP30のセンサーモジュール基板をAmazonで注文して購入した。
CJMCU-30という品物だ。
中国製で、BME680の載ったCJMCU-680と同じメーカーが作っている品物のようだ。
2つは似たような紫色の基板モジュールだ。
Semoic 1個SGP30マルチピクセルガスセンサー屋内空気測定TVOC / eCO2(Amazon)
センサーであるSGP30自体は1.8Vで動作するので、単純なブレークアウト基板の場合には、自前で1.8Vの電源回路と、I2Cバス電圧変換回路を外付けで用意しなければならない。
最初はそのつもりで準備をしていたのだが、結局ブレークアウト基板は届かなかった。
CJMCU-30というSGP30の搭載された基板モジュールには、1.8Vの電源回路とI2Cバス電圧変換回路が一緒に基板上に搭載されている。
なので、このモジュールは5VのArduinoマイコンなどにそのまま繋ぐことができる。
あるいは、3.3Vのマイコンボードに繋いでもOKだ。
とりあえず、BME680モジュール用に作った自作のArduino接続の基板に取り付けた。
Arduinoマイコンボードのソフトについては簡単で、AdafruitのSGP30ライブラリというのをArduino IDEのライブラリ管理からインストールして、sgp30testというexampleソースコードのスケッチを動かした。
水素H2と、エタノール、TVOC、二酸化炭素eCO2の測定値が得られる。このうちTVOC測定値を使う。
自分はCrowtailのMP503センサーモジュール基板を比較用の基準に使っていて、SGP30と同時に動かして比較してみた。
数日動かして、ログ(記録)を取ってみた。そのうちのある1日の0時からの24時間分を取り出した。
系列1は、Crowtail MP503モジュールの計測値で、汚染に反応して数値が上昇している。
系列2は、SGP30の出力値を10で割った数値をプロットした。
SGP30の出力値のグラフは、MP503の計測値のグラフと相似形になっているように見える。
MP503のオフセットを27にして、SGP30の出力値を20で割るようにしてプロットしなおすと、このようにほぼきれいにグラフが重なる。
原点のオフセットについて、SGP30の出力は、汚染が少ない時点が0に戻るように内部で自動で処理されている(?)らしい。
Arduinoの上記のSGP30用のexampleのソースコードに書いてあるbaselineという機能が働いているからだろう。
機能としては、次のような動作を想定しているらしい。
・SGP30の内部で自動でbaselineの値を更新していて、自動でゼロ点を合わせる動作をしている。
・baseline設定値は、SGP30に電源を入れてスタートさせてから12時間くらいで合う。それまではSGP30の計測値は捨てること。
・ただし、毎回電源を入れるたびに12時間のウォームアップ(?)をするのは困るので、baseline値を設定する機能(読み出しと書き込み機能)がある。
・baseline設定値は、SGP30自体に保存することはできないので、自前で不揮発メモリなどの保存できる場所に保存しておく。例えば1時間毎に自動保存するとか。
・保存されたbaseline設定値は、SGP30の電源を落として、次に電源を入れたときにSGP30に設定しなおすことで、SGP30をすぐに使うことができる。
・ただし、保存してから1週間以上経過している場合には、保存された値は当てにならないものとして捨てて、また12時間のウォームアップをしてbaseline値を取り直すこと。
Arduinoのexampleには、baseline値を保存したり書き戻したりする処理が入っていない。
なので、とりあえずは、毎回12時間のウォームアップをして、baseline設定機能については無視して使うことにした。