SCD41でつくるCO2 & 温湿度計

[企画・制作] ZEPエンジニアリング

Groveで直結!新定番センサ SCD41で作るCO2&温湿度計

 新型コロナウイルス感染防止対策や良好な空気環境の維持を目的に、CO2濃度を基準とする密状態の把握や換気の実施などが呼びかけられています。CO2濃度を測定するためのCO2センサには、NDIR方式や光音響方式がありますが、その他にH2(水素)をベースとして、二酸化炭素量を算出するCO2eq(等価二酸化炭素)センサがあります。それらの代表的なセンサデバイスとして、Sensirion社SCD30、SCD41、SGP30があり、それらをモジュール化した製品が販売されています。


CO2センサ・モジュール例

SCD30センサモジュール
CO2センサモジュール【SCD30】

(二酸化炭素+温度/湿度センサ)
(NDIR方式)
SCD41センサモジュール
Grove-CO2/温/湿度センサ【SCD41】

(二酸化炭素+温度/湿度センサ)
(Photoacoustic:光音響方式)
SCP30センサモジュール
TVOC/eCO2 ガスセンサ【SGP30】

(TVOC/CO2eqセンサ)
(CO2eq:等価二酸化炭素算出方式)

 3回に分けて、それぞれのモジュールの基本的な仕様と使い方、M5Stackで制御する方法についてご紹介します。 第2回の今回はPhotoacoustic(光音響)方式のSCD41モジュールを取り上げます。動作させるためのプログラムの開発環境として、Arduino IDEを使用しましたので、M5Stackだけでなく、少しの変更で各種ArduinoボードやRaspberry Pi Pico等でも同様に使用することができます。

SCD41の測定方式

 一般的なCO2センサーは、前回のSCD30のようにNDIR方式が用いられますが、センサーの感度を高めるためには測定セル(筐体)を大きくする必要がありました。SCD41では、Photoacoustic(光音響)方式という測定技術を用いることにより、センサーの性能を損なうことなく、NDIR方式に比べて大幅な測定セルの小型化を実現しています。(デバイスサイズ:10.1×10.1×6.3mm)
 Photoacoustic(光音響)方式の測定原理は、IRエミッターより波長4.26μmの狭帯域光を測定セル内に照射すると、その光をCO2分子だけが吸収します。その結果、CO2分子の並進運動エネルギーが増加し、それに応じて測定セル内の圧力も増加します。つまり、CO2分子が多ければ多いほど、測定セル内の圧力が高まります。測定セル内の圧力測定は、光源を変調することで、その変調成分をマイコロフォンで測定します。測定した信号の振幅は圧力と比例しますので、その値により、CO2濃度の計算をする仕組みとなっています。
SCD41の構造マイクロフォンの信号強度

SCD41の外観とピンアサイン、基本仕様

 今回はSCD41を用いた、SeeedStudio社製のGroveモジュールを使用しました。SCD41デバイス単体の仕様については、Sensirion社のデータシートをご参照ください。
SCD41SCD41
SeeedStudio社Webページより引用

 SCD41の基本仕様は以下のとおりです。CO2センサの他に温度、湿度センサ機能もあり、環境モニター用センサとして最適です。
SCD30 Specification

SCD41をM5Stackに接続して使用する

 M5Stackには、Groveインターフェースがありますので、SeeedStudio社製のSCD41モジュールを直接接続可能です。接続例の写真を以下に示します。接続例の写真を以下に示します。
Schematic

制御ソフトウェア

(1)開発環境構築

 今回はArduino IDE環境で制御プログラムを作成します。M5StackのArduino IDE開発環境の構築については、別記事「いろいろなマイコンボードに使えるArduino IDE。環境構築メモ」の「M5StackをArduino IDEで使う」の章を参考にしてください。

 M5Stack用のArduino IDE環境が構築できたら、今回のSCD41用のI/Oライブラリを以下の手順でインストールします。
 ・Arduino IDEメニューで ツール ⇒ ライブラリを管理 を選択。
 ・検索欄に「SCD41」と入力し検索されたものの中から「SparkFun SCD41 Arduino Library」をインストールする。
 以上でSCD30を使用する開発環境が整いました。続いてサンプルプログラムを入力し、動かしてみます。

 ※なお。ライブラリには、他にSensirion社製もあります。前回のSCD30でSparkFun社のライブラリを使用したので、 今回も使用しましたが、Sensirion社のライブラリでも問題なく動作することを確認しています。ただし、関数名が 異なりますので、使用する場合はサンプルプログラムの修正が必要です。

(2)サンプルプログラム

 SCD41で取得したデータをM5StackのLCDに表示するとともにArduino IDEのシリアルモニタ、シリアルプロッタで表示できるようにシリアル出力をするものです。また後述するSCD41を強制リキャリブレーション(FRC: Forced Re-Calibration)するためのプログラムコードも含まれており、SCD41の校正も可能です。

サンプルプログラムリスト

  1. #include <M5Stack.h>
  2. #include "SparkFun_SCD4x_Arduino_Library.h" //Click here to get the library: http://librarymanager/All#SparkFun_SCD4x
  3. SCD4x mySensor;
  4. float correction_;
  5. #define FRC 413 //FRCのターゲット値
  6. void setup() {
  7.   M5.begin(true, false, true, true);
  8.   if (mySensor.begin() == false){
  9.     Serial.println(F("Sensor not detected. Please check wiring. Freezing..."));
  10.     while (1);
  11.   }
  12.   M5.Lcd.fillScreen(TFT_BLACK); //M5Stackの画面初期化
  13.   M5.Lcd.setTextFont(4);
  14.   M5.Lcd.setTextSize(1);
  15.   M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  16.   M5.Lcd.setTextDatum(TL_DATUM);
  17.   if(M5.BtnA.isPressed()){ //左のボタンが押下されているか判定
  18.     Serial.println("FRC started... PLS wait 3 min."); //押下されていればFRCを実行
  19.     M5.Lcd.setCursor(20, 20);
  20.     M5.Lcd.printf("FRC started...");
  21.     mySensor.stopPeriodicMeasurement(); //定期測定モードを停止
  22.     delay(500);
  23.     mySensor.performFactoryReset(1200); //設定の初期化
  24.     mySensor.startPeriodicMeasurement(); //定期測定モードを開始
  25.     delay(3*60*1000); //3分間通常動作させる
  26.     mySensor.stopPeriodicMeasurement(); //定期測定モードを停止
  27.     delay(500);
  28.     mySensor.performForcedRecalibration(FRC, &correction_); //FRCを実行
  29.     delay(1000); //FRC後1秒待つ
  30.     if(mySensor.startPeriodicMeasurement() == false) while(1); //通常モードでの測定開始
  31.     Serial.println("Completed."); //FRC完了表示
  32.     M5.Lcd.setCursor(20, 20);
  33.     M5.Lcd.printf("Completed. %4.1f",correction_); //FRC補正値を表示
  34.   }
  35.   mySensor.stopPeriodicMeasurement(); //定期測定モードを停止
  36.   mySensor.setAutomaticSelfCalibrationEnabled(1,10); //ASCの有効化
  37.   Serial.printf("SCD41:ASC:%d\n",mySensor.getAutomaticSelfCalibrationEnabled());
  38.   mySensor.startPeriodicMeasurement(); //定期測定モードを開始
  39. }
  40. void loop() {
  41.   if (mySensor.readMeasurement()){ //測定値の有無を判定
  42.     M5.Lcd.setCursor(0, 160); //あれば画面表示
  43.     M5.Lcd.printf("SCD41:CO2 : %4d ppm ", mySensor.getCO2());
  44.     M5.Lcd.setCursor(0, 200);
  45.     M5.Lcd.printf("Temp: %2.1f 'C %2.1f %c ", mySensor.getTemperature(), mySensor.getHumidity(), '%');
  46.   }
  47.   Serial.print("SCD41 "); Serial.print(mySensor.getCO2()); Serial.print("\n"); //測定データをシリアル出力
  48.   delay(1000); //1秒ウェイト
  49. }

  • 8~18行目は、M5StackとSCD41の初期化です。
  • 19~37行目は、M5Stack電源投入時にM5Stackの3つのボタンのうち、左のボタンが押下されているか否かを判定し、押下されていればFRC(強制リキャリブレーション)を行います。 26行目で、SCD41の設定値を工場出荷時設定にリセットしていますが、FRC実行後に挙動がおかしい場合があったので、実行しています。これにより、FRC、ASCアルゴリズム履歴も消去されます。
  • 38~41行目でASC(Automatic Self Calibration:自動自己キャリブレーション)の有効化をしています。  
  • 44~53行目が、メインルーチンで、1秒ごとにSCD41の測定データ(CO2、温度、湿度)があるか否かを調べ、あれば、M5StackのLCDに表示します。SCD41では5秒ごとにデータが上がってきます。シリアル出力は1秒ごとにデータ送信しますが、SCD41からのデータがないときは、前回SCD41から取得したデータを送信します。※シリアル出力はCO2データのみ送信しています。温度、湿度データは送信していませんので、必要に応じて追加してください。  

※サンプルプログラムで使用したSCD41用のライブラリの詳細については、GitHub上のドキュメントを参照してください。

(3)サンプルプログラムの実行例

 サンプルプログラムを実行したときのM5StackのLCD表示とシリアルモニタ表示を以下に示します。

Data display Serial output

 また、下のグラフは、シリアルプロッタで部屋の中のCO2濃度の変化をグラフ化したものです。シリアルプロッタは、Arduino IDEのメニューで ツール ⇒ シリアルプロッタ を選択することによって表示できます。
Data plot
 この例は、6畳程の部屋で換気を行ったときの測定値をグラフ化したものです。はじめCO2濃度は約1,180ppmでしたが、4分程、窓を20cm開けると、すぐに約820ppmまで下がりました。その後、窓を閉じると再び上昇し、約990ppmに戻ったことがわかります。 

キャリブレーション(校正)

 SCD41には、自動でキャリブレーションを行う、ASC(Automatic Self Calibration:自動自己キャリブレーション)と強制的にキャリブレーションを行うFRC (Forced Re-Calibration:強制リキャリブレーション)機能があります。

  • ASC フィールドキャリブレーションアルゴリズム

 ASCは、外気のCO2濃度が約400ppmであることを利用して、SCD41が、ある期間(1週間程度)に測定したデータのうち一番低い値を外気同等とみなし400ppmに補正する機能です。したがって、一度も外気が入らない密閉空間では、実際には高いCO2濃度も低く400ppmと補正されてしまい、正しく校正されないため注意が必要です。この機能はプログラムで以下関数を用いることによって、無効/有効化することができます。

   setAutomaticSelfCalibrationEnabled(引数,10)
   引数:ASC機能 0:無効 1:有効 第二引数の10はコマンド発行後のディレィタイム(mS)です。

 サンプルプログラムのsetupルーチン中に上記関数がありますので、必要に応じて設定してください。

  • FRC 強制リキャリブレーション

 

FRCを実行するには、既知のCO2環境下で、既知のCO2濃度を第一引数として、  

   performForcedRecalibration(FRC, &correction_)

 を実行することによって、SCD41をその値に補正することができます。補正した値は、EEPROMに記録され次回の電源オン時から使用されます。(第二引数は、どれだけ補正したかの戻り値です)
 既知のCO2濃度環境を構築できないときは、外気を400ppmと見なして、SCD41を外気中に置き補正します。サンプルプログラムでは、気象庁の最近の観測データを見ると413ppm前後なので413を引数としてみましたが、あまり気にせず400で良いでしょう。※ASCがオンの場合は400ppmに補正されるので、整合性を取って400にするのが良いと思われます。
 FRCを実行するには、既知のCO2濃度環境で少なくとも3分間SCD41を通常モードで動作させておく必要があり、サンプルプログラムでは、3分間動作させた後にFRC関数を呼んでいます。このときセンサに風が当たっていたり、直射日光下では、正しい値が設定されない可能性があるので注意が必要です。

SCD30(NDIR方式)と測定データの比較とFRC実行結果

 前回紹介したSCD30と測定データの比較をしました。M5StackにSCD30とSCD41を同時に接続し、測定データをクラウドサービスにアップロードし、履歴をグラフ化したものを以下に示します。

 測定開始後、測定値の増減は、SCD30とSCD41で同じような傾向を示すものの測定値は、最大で200ppm程度の差がありました。そこで、近傍に置いた市販のCO2計の値を元にSCD30、SCD41共にFRCを実行したところ、それ以降の両デバイスの測定数値の差は、ほぼスペック内の誤差範囲に収まりました。

CO2センサを使用する上での注意点

 センサは、人間の呼気や振動にも敏感に反応します。実験する際には、それらの影響が無いようにセンサと十分に距離をとるなどの配慮が必要です。特にSCD41に強く息を吹き掛けるなどすると高いCO2濃度を示し、しばらく正常値を出力しなくなったり、FRCを実行しない限り、測定値が異常のままになったりします。機能確認ができたら、正式な筐体などに入れて実験することをおすすめします。

次回の予告

 次回は、CO2eq(等価二酸化炭素)センサーSGP30の基本的な仕様と使い方、M5Stackで制御する方法について紹介します。 

マルツで購入できるCO2センサ

 マルツで購入できるCO2センサは、こちらのリンクをクリックしてください。多数表示されますが、今回紹介したSCD41をはじめ、様々な製品があります。データシートを参照の上、選択してください。

©2022ー @logic_star All rights reserved.



Page Top