M5Stackでできること 〜M5StackでTVOC/eCO2ユニットを使う

M5Stack社の製品に「TVOC/eCO2ガスセンサユニット」というセンサがあります。


借りている畑のとなりにビニールハウスがあります。このハウスは現在使われていないため、このハウスも借りて野菜を栽培しようと計画中です。
その際にはハウス内の二酸化炭素濃度でも計測してみようかな?と考え、しばらく前にこのセンサを購入していたのですが、ハウスの野菜栽培計画自体が全く進んでおらず、このセンサも長らくほったらかしになっていました。

今後もハウスにはなかなか手をつけられそうになく、このままだとこのセンサ自体がお蔵入りしてしまいそうなので、今のうちに一度試してみることにしました。

「TVOC/eCO2ガスセンサユニット」について

「TVOC/eCO2ガスセンサユニット」は、「SGP30」という空気環境センサモジュールを内蔵したガスセンサユニットです。
「SGP30」は、空気中のVOC(揮発性有機化合物)とH2(水素)を測定します。また、そこからTVOC(総揮発性有機化合物)とeCO2(二酸化炭素相当量)濃度を算出して出力します。

このセンサはCO2濃度自体を測定している訳ではなく、他の気体の濃度から二酸化炭素相当量を算出しているので、測定結果は正確ではありません。
ただ、他のCO2センサよりも安価なので、「室内の空気が汚れているか?(換気が必要か?)」「ビニールハウス内のCO2濃度が高いか?低いか?」程度の大雑把な測定には十分利用可能と思われます。

このような、寸法の小さいユニットです。長さ5センチ程度の短いGROVEケーブルが付属していました。

サンプルスケッチを使ってみる

  • 「M5Stack Basic」のGROVEポートに「TVOC/eCO2ガスセンサユニット」をつなぎます。
  • 「Arduino IDE」を起動し、「ツール」>「ライブラリを管理…」で「Adafruit SGP30 Sensor by Adafruit」をインストールします。インストール時には、同時に「Adafruit BusIO」もインストールするか聞かれるので、こちらも一緒にインストールします。
  • 「ファイル」>「スケッチ例」>「M5Stack」>「Unit」>「TVOC_SGP30」を開き、M5Stackに書き込みます。
#include <M5Stack.h>
#include "Adafruit_SGP30.h"

Adafruit_SGP30 sgp;
long last_millis = 0;

void setup() {
  M5.begin(true, false, true, true);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(80,0);
  M5.Lcd.println("TVOC TEST");
  if (!sgp.begin()){
    M5.Lcd.println("Sensor not found");
    while (1);
  }
  M5.Lcd.setCursor(0,80);
  M5.Lcd.println("\nInitialization...");
}

void loop() {
  static int i = 15;
  while(i > 0) {
    if(millis()- last_millis > 1000) {
      last_millis = millis();
      i--;
      M5.Lcd.fillRect(20, 120, 60, 30, BLACK);
      M5.Lcd.drawNumber(i, 20, 120, 2);
    }
  }
  M5.Lcd.fillRect(0, 80, 90, 100, BLACK);

  if (! sgp.IAQmeasure()) {
    Serial.println("Measurement failed");
    return;
  }
  M5.Lcd.fillRect(100, 40, 220, 90, TFT_BLACK);
  M5.Lcd.setCursor(0,50);
  M5.Lcd.printf("TVOC:%d ppb\n",sgp.TVOC);
  M5.Lcd.printf("eCO2:%d ppm\n",sgp.eCO2);
  delay(500);
}
  • M5Stackの電源をオンにすると、最初に15秒間キャリブレーションが行われ、その後、LCD画面に「TVOC」「eCO2」の値が表示されます。

eCO2濃度に応じてLCD画面の色を変える

次に、「TVOC/eCO2ガスセンサユニット」で測定したeCO2濃度に応じて、M5StackのLCD画面の色を変えてみようと思います。
eCO2値が低い(400ppm)時に画面の色を「青」、高い(1675ppm以上)時に「赤」、その間の値の時にはグラデーションで色を変えます。

スケッチは以下のとおりです。

#include <M5Stack.h>
#include "Adafruit_SGP30.h"

Adafruit_SGP30 sgp;

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(4);
  if(!sgp.begin()) {
    M5.Lcd.println("Sensor not found");
    while(1);
  }
  for(int i=15; i>0; i--) {
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(136, 108);
    M5.Lcd.printf("%2d", i);
    delay(1000);
  }
}

void loop() {
  if(!sgp.IAQmeasure()) {
    Serial.println("Measurement failed");
    return;
  }
  int co2 = sgp.eCO2;
  int val = (int)((co2-400)/5);
  if(val<0)   val=0;
  if(val>255) val=255;
  M5.Lcd.fillScreen(M5.Lcd.color565(val, 0, 255-val));
  M5.Lcd.setCursor(64, 108);
  M5.Lcd.setTextColor(WHITE, M5.Lcd.color565(val, 0, 255-val));
  M5.Lcd.printf("%4d ppm", co2);
  delay(100);
}

このスケッチをM5Stackに書き込むと、最初に15秒間キャリブレーションが行われた後、LCD画面がeCO2値に応じた色に表示されます。

室内に置いておいて、空気が汚れているかどうかを色で把握するなんていう使い方ができそうです。

まとめ

きちんと調べてはいませんが、サンプルスケッチを参考にして、とりあえず動かすことはできました。

ただし、値の精度を上げようとすると、キャリブレーションについてもっと調べる必要がありそうです。
湿度センサを組み合わせて値を補正する機能もあるようなので、今後試してみたいと思います。

また、このセンサは起動時にキャリブレーションが行われるので、例えばビニールハウスにて電池で長期間稼働させるために間欠動作させるときなどは、測定値の連続性がなくなってしまいます。
その辺りの使い方についても、引き続き調査する必要があります。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。