« GeForce GTX1050Ti搭載のグラフィックボードが”新発売”で、お値段は2万円超 | トップページ | Microsoftがプレゼンの評価・指導をしてくれるAI機能の提供へ »

2021年3月14日 (日)

Keyestudio CCS811という二酸化炭素濃度センサーを使ってみた

今、まさにコロナ禍です。

このため職場では、部屋の換気をよくやります。

が、気温がまだ低い時期でもあるので、換気が終わればすぐに閉めたいところ。

その換気の目安に、この二酸化炭素濃度センサーが使えそうという話を聞いたので、さっそく買ってみました。

Img_0283

Keyestudio CCS811搭載のKS0457というセンサーです。

Amazonで1499円。ほかにもっと安いのがあったんですけど、Primeマーク付きじゃないところからはなるべく買わないようにしたら、これが最安値でした。

Img_0284

本当はRaspberry Piで使いたかったんですが、I2Cながらやや特殊な接続の仕方(通常のI2Cなら4本で済むところが、5本接続)だったので、Arduinoに接続して使用することに。

で、あとは下記のサイトに従って、使えるようにします。

 [電子工作]Arduinoで二酸化炭素濃度測定器を作ってみた(Vol.1)|ホッタ|note

まず、Arudinoとこのセンサーを接続。メス-メスのジャンパー線で、それぞれ

  センサー  …  Arduino

・GND …  GND

・VCC  …  5V

・SDA  …  A4

・SCL  …  A5

・WAKE  …  GND

に接続します。

続いて、メーカーの提供するコードとライブラリを以下からダウンロード。

Dropbox - KS0457 keyestudio CCS811 Carbon Dioxide Air Quality Sensor - 日常をシンプルに

得られたZipファイルを展開し、ライブラリフォルダにある「CCS811」というフォルダを丸ごとArduinoIDEのライブラリ用フォルダ(たいていはドキュメントの中の「Arduino」-「libraries」というフォルダ)に入れます。

で、ArduinoIDEを開き、以下のコードをコンパイルします。


#include <CCS811.h>

/*
 * IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
 */
//CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
CCS811 sensor;

void setup(void)
{
    Serial.begin(115200);
    /*Wait for the chip to be initialized completely, and then exit*/
    while(sensor.begin() != 0){
        Serial.println("failed to init chip, please check if the chip connection is fine");
        delay(1000);
    }
    /**
     * @brief Set measurement cycle
     * @param cycle:in typedef enum{
     *                  eClosed,      //Idle (Measurements are disabled in this mode)
     *                  eCycle_1s,    //Constant power mode, IAQ measurement every second
     *                  eCycle_10s,   //Pulse heating mode IAQ measurement every 10 seconds
     *                  eCycle_60s,   //Low power pulse heating mode IAQ measurement every 60 seconds
     *                  eCycle_250ms  //Constant power mode, sensor measurement every 250ms
     *                  }eCycle_t;
     */
    sensor.setMeasCycle(sensor.eCycle_250ms);
}
void loop() {
  delay(1000);
    if(sensor.checkDataReady() == true){
        //Serial.print("CO2: ");
        Serial.println(sensor.getCO2PPM());
        //Serial.print(" ppm, TVOC: ");
        //Serial.print(sensor.getTVOCPPB());
        //Serial.println(" ppb");
        
    } else {
        Serial.println("Data is not ready!");
    }
    /*!
     * @brief Set baseline
     * @param get from getBaseline.ino
     */
    sensor.writeBaseLine(0x847B);
    //delay cannot be less than measurement cycle
    //delay(1000);
}

実は元コードはCO2濃度とTVOC(総揮発性有機化合物濃度)の2種類を出力できるようになってますが、二酸化炭素濃度値しかいらないので、コメントアウトしてます。

これをArduinoIDEでArduinoに流し込んでおきます。

一方、Raspberry Pi側には、以下のコードを入れます。

co2sens_ar.py


import serial
import datetime

ser = serial.Serial('/dev/ttyACM0'115200)
date_file = datetime.datetime.now()

while True:
    with open("/home/pi/co2_{0:%Y%m%d%H%M%S}.csv".format(date_file),"a"as f:
        now = datetime.datetime.now()
        String_data = ser.readline().decode('utf-8').rstrip()
        print(now," , ",String_data)
        print(now," , ",String_data, file=f)
        f.flush()

ser.close()

シリアルポート(USB)から値を読むだけなので、簡単なコードです。

なお、二酸化炭素濃度値の前に日付・時刻をつけるようにしてます。

これを使う前に、「pip3 install pyserial」を実行しておいてください。

Img_0285

あとはRaspberry PiのUSBにArduinoを接続し、上の「co2sens_ar.py」を実行します。

> python3 co2sens_ar.py

すると、以下のようにターミナル上に日付と二酸化炭素濃度が表示されるはずです。

Co2sens01

※上はWindowsのTeraterm上

なお、このセンサーの下限値は400ppmだそうです。つまり、400ppm以下は測定不可。

実はこれを一晩ほど動かしてみましたが。

Co2sens02

新室内の二酸化炭素濃度が2260ほどまで上昇。

えっ!?ちょっと待って、これほんと!?

ちなみに、労働衛生上の基準値は1000ppm以下です。これを倍ほど上回る値をたたき出してます。

が、ここで外からRaspberry Piにアクセスできなくなってしまったため、一旦、Raspberry Piを再起動して、もう一度値を取り直してみたら……

なぜかですね……400ppmからスタートしました。

それから何度かプログラムを起動してみたんですが、どうやらこれRaspberry PiのコードがArduinoにシリアル接続するたびに「400ppm」からスタートしてるみたいです。

ううん、なんか怪しいなぁ……

でも、息を吹きかけると一時的に1000ppm程度まで上昇し、その後は下がるという挙動を示すため、確かに二酸化炭素の濃度を即手はしているような気がします。

プログラムコードを読むと、Arduino側はシリアル接続したときに値を出力している節があります。つまり、シリアル接続するまではLEDがちかちかしているものの、値を取得していなさそう……ていう理解で、いいのかな?

まあ、ともかく、換気の目安として使えるかどうかが問題。二酸化炭素濃度を正確に測定することは、今回の狙いではないので。

ということで一度、部屋を閉め切ってしばらく二酸化炭素濃度を上昇させたのちに、部屋の窓を開けて一気に換気して、値がどう動くかを調べてみました。

Img_0286

1時間ほど寝そべって過ごした後、こんな勢いで部屋の窓を開けました。ちょっと雨が降り気味な日でしたが、構わず開けてます。

で、その時のグラフが以下。

Co2sens03

ちょうどかくっと下がっているところがありますが、そこが換気した時間。

一気に二酸化炭素濃度は400程度まで下がるんですが……なぜかですね、2度ほど900ppmまで上昇しました。

何なのでしょう?ノイズでしょうか、それとも私の息でも降りかかったのか、あるいは外の排気ガスか何かでも拾ったんでしょうか……?

なんだかこのセンサー、ちょっと怪しい。

と思ったら、スイッチサイエンスのこんな記事を発見。

空気品質を測定し、記録する - AmbientでIoTをはじめよう

これを読むと、どうやらCSS811ってセンサーは、エージング(慣らし運転)というのをやらないといけない。

おまけに最初の20分は不安定らしいので、開始から20分の値はあてにしちゃだめだということのようです。

なんてこった……ということで、まず48時間のエージングというのを実施。

あまり意味はないですが、その48時間(正確には48時間と28分)の変化をグラフ化してみると、こんな感じに。

 

Ccs811_04

※ データが多すぎるので、ここだけGoogleスプレッドシートを使ってます

分かりにくいですが、最大6000ppm近くまで上昇してます。

労働安全衛生法での事務所の基準値は5000ppm以下(空調設備により調整可能ならば、1000ppm以下)とされているので、それを上回る値が出てますが……ただ、その時間が昼間の15時半ごろで、これを設置した部屋には誰もいないはずの時間。ちょっと怪しいです。

まあ、ともかく48時間のエージングを終えたので、測定を再開してみた。

Ccs811_03

30分ほど経過し、安定しているはずの時間での値は、大体600くらいになりました。

で、そのまま一晩動かした結果

Co220210312

こんな感じです。安定してますね。

ただ、逆に言うと安定しすぎ。

部屋を閉め切っているので、もうちょっと濃度が上昇してもおかしくはないかなぁと思うのですが。

とまあ、信用してよいのか悪いのか、よく分からないセンサーですね。

しばらく、様子見です。


KEYESTUDIO DC 5V CCS811 CO2 二酸化炭素 TVOC 大気質 センサー モジュール for Arduino アルドゥイーノ アルディーノ 電子工作

« GeForce GTX1050Ti搭載のグラフィックボードが”新発売”で、お値段は2万円超 | トップページ | Microsoftがプレゼンの評価・指導をしてくれるAI機能の提供へ »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

正確な基準となる機器を一緒に運用して
比較しないと本当に大丈夫なのかが
分かりませんねぇ。会社にそういう機器は
無いんですか?

> mokekyoさん

職場に一つあります、市販の測定器が。ただし、Amazonで売ってるようなやつなので、どこまで正確かは分かりませんが……

本当にガチなのは、月に一度やってくる環境測定士の使ってるやつですが、測ったらさっさと次に行っちゃうので、その場で教えてはくれなさそう。

コメントを書く

(ウェブ上には掲載しません)

« GeForce GTX1050Ti搭載のグラフィックボードが”新発売”で、お値段は2万円超 | トップページ | Microsoftがプレゼンの評価・指導をしてくれるAI機能の提供へ »