環境デバイス(CCS-811)について調査しました。

最終更新日:2020年11月14日

AMS社からCCS811というガスセンサがリリースされています。ガスセンサというとヒータで環境温度を上げてアナログ値を読み取るセンサが多い中で、このセンサは消費電流もしれているため興味深いです。

CCS811は、VOC(揮発性有機化合物)を検出して室内空気質を監視するためのデジタルVOCセンサーです。CO2に特化した値も取得出来るようです。
『室内空気質を監視』と云うのが何を意味しているのか明確ではありません。が、屋内の人口密度を判断出来る指針なのかと思っています。満員電車の度合判断とか、室内換気が必要なのかどうかの判断に使用できないかと思っています。

揮発性有機化合物が具体的に何を意味するのか曖昧です。CO2相当に換算するという様な記載があります。温度湿度による補正が必要とのことでBME280をボード内に一緒に乗せているボードもあるようです。
有機溶剤にも敏感に反応するようです。レポートがありました。https://revspace.nl/CJMCU-811

CO2濃度 ppm 400〜8192 
TVOC濃度 ppb 0〜1187

このセンサではCO2濃度は0.8%程度までしか取得出来ません。気象庁提供のデータでは2018年の世界の平均濃度が407.8ppmとあります。このことから、このセンサは大気中のCO2濃度観測がなんとか出来る事が判りました。
厚生省の提供する環境基準では事務所作業環境のCO2濃度は1000ppm以下とあります。学校環境だと1500ppm以下とあります。そして10,000ppm を超えると不快を感じるとあり、その不快を感じるところまでは測定できないことが判りました。
致死量は明確では無いが7%(70000ppm)で意識を失うと云う情報があります。

乗用車車内で内気でエアコンを回すと数千PPM、外気で1000ppm前後、窓を開けて換気すると500ppmまで落ちるというレポートがあります。

これらのことから、このCCS811でCO2濃度監視をすることで換気か必要な状態を発見し、自動で強制換気するような仕組みも実現出来そうです。


2020/10/28

コロナ禍にKeyeStudioのCCS811モジュール(KS0457)を入手しました。屋内環境モニタに組み込んでみることにしました。

MCUはESP32開発モジュールです。まずは単体で動作確認して見ます。

使用するライブラリですが、選択肢は少なくてAdafruit製かSparkFun製を使う事になるのですが幾つか注意が必要なようです。

と云う事でここではAdafruitのライブラリを使用し、サンプルスケッチをレタッチして動作確認して見ました。
『CCS811_OLED_Demo』というスケッチをレタッチしています。

https://github.com/adafruit/Adafruit_CCS811
https://github.com/adafruit/Adafruit_SSD1306
https://github.com/adafruit/Adafruit-GFX-Library

/* 
 *  20201028 T.Wanibe
 *  このデモは、Adafruit I2COLEDでCCS811の読み取り値を表示する方法を示しています。
 *  CCS811はKeyeStudioのKS0457を、OLCDはI2Cの互換機を使いました。
 *  配線ですが、KS0457のnWAKEをLOWに固定しています。
 *  最大1310720バイトのフラッシュメモリのうち、スケッチが238861バイト(18%)を使っています。
 *  最大327680バイトのRAMのうち、グローバル変数が16332バイト(4%)を使っていて、ローカル変数で311348バイト使うことができます。
 */
 
#include        <Wire.h>
#include        <Adafruit_GFX.h>
#include        <Adafruit_SSD1306.h>
#include        <Adafruit_CCS811.h>
#define         CSSADDR         0x5A                                    //0x5Aか0x5B
#define         OLCDAres        0x3C                                    //0x3Cか0x3D
#define         SCREEN_WIDTH    128                                     // OLED display width, in pixels
#define         SCREEN_HEIGHT   64                                      // OLED display height, in pixels
#define         OLED_RESET      -1                                      // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_CCS811 ccs;
//I2C(SDA、SCLピン)に接続されたSSD1306ディスプレイの宣言
Adafruit_SSD1306 display = Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//------------------------
void setup() {  
        Serial.begin(115200);
        if(!ccs.begin(CSSADDR)){
                Serial.println(F("Failed to start sensor! Please check your wiring."));
                while(1);
        }
        // デフォルトでは、3.3vラインから内部で高電圧を生成します! (きちんと!)
        display.begin(SSD1306_SWITCHCAPVCC, OLCDAres);              // I2Cアドレス0x3Cで初期化(128x64)
        // ディスプレイハードウェアに画像バッファを表示します。
        // バッファは内部でAdafruitスプラッシュ画面で初期化されるため、これによりスプラッシュ画面が表示されます。
        display.display();
        delay(500);
        // バッファクリア
        display.clearDisplay();
        display.display();
        //温度センサーの校正
        while(!ccs.available());
        float temp = ccs.calculateTemperature();
        ccs.setTempOffset(temp - 25.0);
        Serial.println("IO test");
        // テキスト表示テスト
        display.setTextSize(1);
        display.setTextColor(WHITE);
}
//------------------------
void loop() {
        display.setCursor(0,0);
        if(ccs.available()){
                display.clearDisplay();
                float temp = ccs.calculateTemperature();
                if(!ccs.readData()){
                        float eCO2 = ccs.geteCO2();
                        float TVOC = ccs.getTVOC();
                        display.print(F("eCO2: "));     display.print(eCO2);    display.println(F(" ppm"));
                        Serial.print(F("eCO2: "));      Serial.print(eCO2);     Serial.println(F(" ppm")); 
                        display.print(F("TVOC: "));     display.print(TVOC);    display.println(F(" ppb"));
                        Serial.print(F("TVOC: "));      Serial.print(TVOC);     Serial.println(F(" ppb"));
                        display.print(F("Temp: "));     display.print(temp);    display.println(F(" deg"));
                        Serial.print(F("Temp: "));      Serial.print(temp);     Serial.println(F(" deg"));
                        display.display();
                }else{
                        Serial.println(F("ERROR!"));
                        while(1);
                }
        }
        delay(500);
}

実行結果ですが、付近に人がいなければ 

eCO2 = 400(測定下限) TVOC=0(測定下限)

です。しかし、センサに対して息を吹きかけると

eCO2 = 1000ppm以上 TVOC=20ppb以上

になります。ちゃんと動いているようです。

このChipは5つの動作モードがあることが判りました。

デフォルトがどのモードなのか判りません。ライブラリ内を調べたところ、モード1で初期化していますので、1秒毎にデータ取得は出来そうです。

また、数値の判断ですが、以下のような資料がありました。

屋内の空気品質の悪化による影響
空気品質の表示 VOC濃度 VOCの影響 屋外濃度以上のCO2濃度 CO2の影響
悪 い 高 い 長期間身をさらす:発ガン性、肺、肝臓、
腎臓および中枢神経系
の損傷。
眼、鼻、のど、皮膚刺激、
頭痛、吐き気、めまい
> 2500 ppm 健康への影響(吐き気、頭痛、めまい)成績・生産性と判断力
の著しい障害。
中程度 中 位 目、鼻、のど、皮膚刺激頭痛、吐き気、めまい 1500〜2500 ppm 判断力の低下、疲労、
集中力の低下。
良 い 低 い 影響なし < 1500 ppm 健康や判断力に影響を
与えない

 

温 度

湿 度

二酸化炭素

厚生労働省 建築物環境衛生管理基準について

17℃以上28℃以下

40%以上70%以下

1,000ppm以下

事務所衛生基準規則

17℃以上28℃以下

40%以上70%以下

1,000ppm以下
(空気調和設備がない場合には5,000ppm以下)

学校環境衛生管理マニュアル

17℃以上28℃以下

30%以上80%以下

1,500ppm以下



2020/11/14

暫く使っているのですが、数値が安定しません。確かに反応は良くそこそこ正しい値のように思いました。
エージング期間が設定されており2日間程度はその期間としています。しかし、その後も突飛な値が戻ってきます。普通8000ppmを超えるような事はあり得ない環境で平気で取得出来てしまいます。最上位bitがうまく取得出来ないのかもしれません。
このデバイスは気体を扱うのでヒータ機能があり、20mA程度の消費をしてしまいます。そのためWAKE信号で制御出来るのですが、WAKEしてから20分待って取得しろとあり、一寸現実的でありません。
コロナ禍の状況で室内換気が重要です。その喚起タイミングをCO2濃度で判断しようと検討した場合、20分の待機は出来ません。
20mAなら、他のCO2センサのヒータ消費電力より小さいので許容するとしても、返ってくるデータが信用できないのは問題です。

息を吹きかければ大きく変化し2000ppmまで立ち上がることからこの点は問題ないです。

連続データ取得していると温度ドリフトがあるような、だんだんCO2濃度値が上がってゆき、正常値らしき値に戻ります。データの取得方法に問題があるのであればライブラリの問題かもしれません。直接レジスタを弄るコードを書いてみたのですがそんなに大きな改善があるわけではありません。

SparkFunのライブラリに変更して、IDを5Aに変更して一寸レタッチして動かしてみましたが、Adafruitのライブラリとは異なる傾向ですが安定しているとは云えません。
どこに原因があるのか?

別メーカのモジュールを購入してみる必要があるのかもしれません。ちなみにKeyeStudioのモジュールは回路図が提供されていません。I2CバスのPullUpの問題なのかもしれません。

もう少し調査が必要です。


2021/1/8

相変わらず数値が安定しません。先人が書いているようにCO2濃度計測にはNDIR方式で無いと安定しないのかもしれません。
そこでNDIRも検討開始しました、ネックは価格ですが。-->
NDIRの調査

戯言(nonsense)に戻る


免責事項

本ソフトウエアは、あなたに対して何も保証しません。本ソフトウエアの関係者(他の利用者も含む)は、あなたに対して一切責任を負いません。
あなたが、本ソフトウエアを利用(コンパイル後の再利用など全てを含む)する場合は、自己責任で行う必要があります。

本ソフトウエアの著作権はToolsBoxに帰属します。
本ソフトウエアをご利用の結果生じた損害について、ToolsBoxは一切責任を負いません。
ToolsBoxはコンテンツとして提供する全ての文章、画像等について、内容の合法性・正確性・安全性等、において最善の注意をし、作成していますが、保証するものではありません。
ToolsBoxはリンクをしている外部サイトについては、何ら保証しません。
ToolsBoxは事前の予告無く、本ソフトウエアの開発・提供を中止する可能性があります。

商標・登録商標

Microsoft、Windows、WindowsNTは米国Microsoft Corporationの米国およびその他の国における登録商標です。
Windows Vista、Windows XPは、米国Microsoft Corporation.の商品名称です。
LabVIEW、National Instruments、NI、ni.comはNational Instrumentsの登録商標です。
I2Cは、NXP Semiconductors社の登録商標です。
その他の企業名ならびに製品名は、それぞれの会社の商標もしくは登録商標です。
すべての商標および登録商標は、それぞれの所有者に帰属します。