LoginSignup
20
8

More than 3 years have passed since last update.

M5StackとTVOC/eCO2 ガスセンサユニットで部屋の二酸化炭素濃度をはかり、高かったらBeep音をならして換気を促す

Last updated at Posted at 2020-12-19

伊藤と申します。

会社員で、週4回ペースでリモートワークしております。
12月半ばになって急に寒くなり、窓を開けると寒いので、なかなか換気ができません。しかし二酸化炭素濃度が上がってくると眠くなるといいますし、空気が悪いと頭痛になったりしますので、CO2センサーで測ってアラートを上げる事にしました。

1.機材

  • M5Stack
  • TVOC/eCO2センサー

    • TVOC = 総揮発性有機化合物。常温常圧で大気中に容易に揮発する有機化学物質の総称。シックハウス症候群の原因とも。
    • eCO2 = 二酸化炭素相当量。「eCO2はH2濃度に基づいて計算されるので、研究所で使用されるレベルのCO2センサと完全に置き換えることはできません。」との説明。
  • Arduino IDE 1.8.10 ※最新版の方がいいと思います。

  • Mac Book Air 11' High Sierra

M1 Mac Book Proで試したのですが、USBSerialポートに M5Stackを検出できなかったので、古いMBAを引っ張り出して使いました。

2.手順

初期設定

自分が当初お世話になった神記事
@hmmrjn さんのMacでM5stackをはじめる

TVOC/eCO2センサーの公式サンプルを試す

  • M5StackとTVOC/eCO2センサーをHY2.0ケーブルで繋ぐ

  • M5Stack付属の短いUSBケーブルでMacとM5Stackを繋ぐ

Arduino IDEで作業

  • File > examples > M5Stack > Unit > TVOC_SGP30を開く

  • tools を設定

    • board: M5Stack-Core-ESP32
    • Port: /dev/cu.***USBほにゃらら

何も編集せずに 心を静かに「Upload」を押すと、以下のようにTVOCとeCO2の値が表示されました。

eCO2sample.png

やったー。まずはセンサーが動く事がわかって安心(^p^)

二酸化炭素濃度が閾値を超えたらBeep音を鳴らす

新しいスケッチを作ります。

  • File > New

さっきのサンプルにBeep音を鳴らす処理を付け加えてみます。
eCO2の値、つまり二酸化炭素濃度が1000ppmを超えたら、M5Stackの内蔵スピーカーを使って、コツン、コツン、というbeep音を鳴らすように、コードを書き加えました。

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


//for beep
#define GPIO_PIN 25
uint32_t beep_last_time = 0;
uint8_t beep_volume = 50; //min 1, max 255
uint32_t beep_total_time = 0;
uint16_t eco2_threshhold = 1000;

Adafruit_SGP30 sgp;
int i = 15;
long last_millis = 0;
void header(const char *string, uint16_t color)
{
    M5.Lcd.fillScreen(color);
    M5.Lcd.setTextSize(1);
    M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
    M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLACK);
    M5.Lcd.setTextDatum(TC_DATUM);
    M5.Lcd.drawString(string, 160, 3, 4); 
}

void setup() {
  M5.begin(true, false, true, true);
  header("SGP30 TEST",TFT_BLACK);
  Serial.begin(115200);
  Serial.println("SGP30 test");
  if (! sgp.begin()){
    Serial.println("Sensor not found :(");
    while (1);
  }

  beep_total_time = millis();

  M5.Lcd.drawString("TVOC:", 50, 40, 4);
  M5.Lcd.drawString("eCO2:", 50, 80, 4);
  Serial.print("Found SGP30 serial #");
  Serial.print(sgp.serialnumber[0], HEX);
  Serial.print(sgp.serialnumber[1], HEX);
  Serial.println(sgp.serialnumber[2], HEX);
  M5.Lcd.drawString("Initialization...", 140, 120, 4);
}

void loop() {
  while(i > 0) {    
    if(millis()- last_millis > 1000) {
      last_millis = millis();
      i--;
      M5.Lcd.fillRect(198, 120, 40, 20, TFT_BLACK);
      M5.Lcd.drawNumber(i, 20, 120, 4);
    }
  }
  M5.Lcd.fillRect(0, 120, 300, 30, TFT_BLACK);

  if (! sgp.IAQmeasure()) {
    Serial.println("Measurement failed");
    return;
  }
  M5.Lcd.fillRect(100, 40, 220, 90, TFT_BLACK);
  M5.Lcd.drawNumber(sgp.TVOC, 120, 40 , 4);
  M5.Lcd.drawString("ppb", 200, 40, 4);
  M5.Lcd.drawNumber(sgp.eCO2, 120, 80, 4);
  M5.Lcd.drawString("ppm", 200, 80, 4);
  Serial.print("TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb\t");
  Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");

 if (sgp.eCO2 > eco2_threshhold){
  M5.Lcd.drawString("over1000", 200, 100, 4);
  Serial.print("over500");   
  dacWrite(GPIO_PIN, 0);
  delay(1); //約500Hz
  dacWrite(GPIO_PIN, beep_volume); 
  delay(1); //約500Hz
 } 

  delay(1000);
}

※ M5Stackの内蔵スピーカーでBeepを鳴らすやり方は、
mgo_tecさんの「M5Stack の内蔵スピーカーから Beep 音(電子音)を出す実験」を参考にさせていただきました!
https://www.mgo-tec.com/blog-entry-beep-sound-speaker-m5stack.html

Verifyをクリックし、保存場所を聞かれたら適当に保存します。

また、先ほどのサンプルに入っていた、Adafruitの2つのファイル(以下のスクショの2個目と3個目のタブ)をコピーしてきます。

Adafruit.png

Arduinoのインストールディレクトリが「/Users/ユーザー名/Documents/Arduino/」の場合、コピー元とコピー先は以下となります。

  • FROM : /Users/ユーザー名/Documents/Arduino/libraries/M5Stack/examples/Unit/TVOC_SGP30/
  • TO : /Users/ユーザー名/Documents/Arduino/sketch_スケッチ名/

Adafruit3.png

  • スケッチをUpload後、TVOC/eCO2センサーユニットに向かって息をふきかけて二酸化炭素濃度を上げると、1000ppmを超えているい間は、1秒毎に、タン、タン、という控えめなBeep音が鳴ります。息は拡散して薄まるので、数秒後にはBeepはとまります。

https://www.youtube.com/watch?v=JmfcTXhLIT0

補足

二酸化炭素濃度の閾値について

1000ppmで良いのか?ですが、東京都地球温暖化防止活動推進センター(愛称:クール・ネット東京)という組織が書いてる説明によると、「外気はおおよそ400ppm、室内はおおよそ1,000ppmがCO2濃度の目安」だそうですので、参考にさせていただきました。

課題

部屋を締め切って1時間くらいたったらBeepが鳴ったのですが、その後さらに1時間たったら、eCO2は"400ppm"で止まってしまいました。
息をふきかけるとちゃんと1000ppm以上に上がってBeepが鳴るものの、その後またすぐ"400ppm"に戻ってしまいます。
精度は特に良くはないとの事なのですが、検出が止まるというのはちょっと意味が違うような。。
TVOC(総揮発性有機化合物)のほうは値が動いているので、eCO2の方だけの問題のようです。
 
(→12/26 追記)
「2020年忘年会!アドベントカレンダー振り返りラジオ - IoTLT オンライン vol5」にて、偉い方からアドバイスをいただきました!

  • 表示される最低値が400ppmであり、実際はそれ以下の値でも400ppmが表示される仕様。
  • 正常に動かすにはベースラインをとってキャリブレーションすることが必要 (サンプルコードがAdafruitのSGP30のサイトで公開されてるらしい) →おそらくここのp.12 https://cdn-learn.adafruit.com/downloads/pdf/adafruit-sgp30-gas-tvoc-eco2-mox-sensor.pdf 後でやってみます(^p^)

3. まとめ

野望リスト

  • どこかにアップしてグラフ化するといいやも
  • 家では限界があるため、会社のオフィスに勝手に設置して測ってみようかな
  • Raspberry Pi用にMH-Z14Aも買ってみたので、M5Stack + TVOC/eCO2センサーと比較してみたい
  • 当初Apple SiliconのMac Book Proを使って作業を始めたのだが、USBSerial port接続でM5Stackを認識せず。いずれ情報を仕入れて再チャレンジするぞい

感想

室内に人が多く換気が悪く澱んでいる状態だと、二酸化炭素濃度が高くなるなら、コロナ対策にも役立つやも。

以上でぃす! (^p^)

20
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
8