CO2センサー Sensirion SCD4x の校正(キャリブレーション)を試してみる

SCD4x の校正方法は、Forced recalibration (FRC) と、Automatic self-calibration (ASC) の 2つ。FRC は リファレンスの CO2値を指定して校正する方法、ASC は 1週間の間で最も低い値を 400ppm とみなして自動校正する方法。詳細は データシート の “3.7 Field Calibration” を参照。

今回 ASC だと時間がかかるので、既にある空気質モニター Awair の値をリファレンスとして FRC による校正を試してみた。FRC を行うプログラムは、 評価キットページ からのリンク先の、Arduinoサンプル にある SCD4x_I2C_FRC_Forced_Recalibration_Example.ino をベースに、M5StickC で動作するように修正して使用。 FRC の実際の手順は “3.7.1 perform_forced_recalibration” に記載されていて、以下のような流れ。

  1. periodic measurement mode で 3分以上 CO2 が一定の環境で動作させる
  2. periodic measurement mode を止めて、500ms 待つ
  3. perform_forced_recalibration コマンドを実行

具体的な perform_forced_recalibration の実装は、サンプルコードの 111行目~ で行っている。calibration で指定した値を、I2C の、perform_forced_recalibration コマンド(0x362f) の 3バイトのパラメーターに指定して書き込みを行う流れ。
今回は、calibration の値を、リファレンスの Awair の値に修正して実行してみた。

  // assuming an external reference shows 650 ppm
  calibration = 650;
  
  // prepare buffer with data for calibration
  // calculate CRC for each 2 bytes of data
  data[0] = (calibration & 0xff00) >> 8;
  data[1] = calibration & 0x00ff;
  data[2] = CalcCrc(data);
  
  // send command for perform_forced_recalibration
  Wire.beginTransmission(SCD_ADDRESS);
  Wire.write(0x36);
  Wire.write(0x2F);
  // append data for calibration
  // 2 bytes calibraion, CRC
  Wire.write(data[0]);
  Wire.write(data[1]);
  Wire.write(data[2]);
  ret = Wire.endTransmission();

M5StickC に書き込んでいる間にも CO2 の値は変化してしまうので、多少のずれは発生してしまう。今回はおおよそ合っていれば良いということで、以下は校正後の Awair との比較してみた結果。
Awair が 875ppm に対して、SCD41 が 887ppm、2000ppmくらいまで変化した場合でも、ほぼ同じくらいの値になることも確認。

一旦、それなりの値が取れるようになったので、次はクラウドサービス ThingSpeak や、Ambient へのデータ蓄積を行えるようにして、Awair ともう少し長い時間での比較ができるようにするのと、SCD41 の Low Power operation によりどの程度消費電力を抑えられるかも試してみたいところ。

CO2センサー SCD41 を試してみる

在宅時間が増え、特に冬場は部屋を閉め切ることが多いので、CO2濃度が気になるところ。以前から、低コストで CO2モニターが作れなか、色々と調べてみると非分散型赤外線(NDIR)方式のCO2センサーだと 6,000円 を超えてしまう。CO2相当の eCO2が計測可能なセンサーもあるけど、それなりの精度は欲しいところなので、NDIR方式で調べてみる。

候補としては、Sensirion の SCD30、SeeedStudio の Arduino用 Grove CO2&温度&湿度センサー(SCD30)が良さそうで、購入しようとしたところ在庫なし。
もう少し調べていたところ、Sensirion の SCD4x という新製品が出ているとのこと。まだモジュールとしては見つからず、さらに調べたところ Sensirion から SCD4x Evaluation Kit(SEK-SCD41-Sensor) という SCD41モジュール を含む評価キットを発見。
国内で取り扱っているところは見つからず、DigiKey は在庫なし、在庫があった Mouser から購入。価格は 5,651円で 2つ購入、送料は 6,000円以上で無料、3/4に注文して、届いたのが 3/13 なので 10日ほど。現時点(3/20)だと在庫なしで、次回入荷予定は 4/14 とのこと。

この SCD4x は、NDIR方式ではなく、Sensirion 独自の PASens技術 という、光音響検出原理により NDIR方式のようにある程度の光学ビーム経路を必要としないため、構造もシンプルで体積も 約1cm3 と小型で、コスト効率が良いとのこと。また、CO2 以外に温度、湿度センサーも内蔵。

評価キットの Webサイト には、クイックスタートやデータシートへのリンクや、Arduino などのサンプルコードへのリンクが分かりやすくまとめられている。キットには SCD41 development board/Jumper wireset/Adapter cable が含まれていて、Adapter cable は SensorBridge に接続するためのものとのことで今回は未使用。通信方式は I2C で、接続に関しては M5StickC の Groveポートと、SCD41モジュールのJSTコネクタのピンの並びが異なるので注意。Grove の白(SDA)を SCD41モジュールの緑に、後は同じ色(黄:SCL/赤:VDD/黒:GND)で接続。

早速 Arduino のサンプルコード をベースに、M5StackC での表示の処理を追加して試してみる。以下のような感じで、無事表示を確認。ただ CO2 がかなり高めなので、校正が必要。

以下、SCD30 と、SCD4x の仕様を比較してみた。(データシートより)
CO2含め、温度・湿度の測定範囲/精度は SCD30 が高いけど、実用的な測定範囲と精度で問題なければ、サイズ・コスト面では SCD4x が良さそう。

型番CO2
指定測定範囲 / 精度
温度
測定範囲 / 精度
湿度
測定範囲 / 精度
SCD30400ppm~10,000ppm /
±(30ppm +読み取り値の3%)
-40~70 ℃ /
±(0.4℃ + 0.023 × (T[℃]-25℃))
0%~100%RH /
± 3%RH
SCD40400ppm~2,000ppm /
±(50ppm +読み取り値の5%)
-10~60 ℃ /
0.8℃ (15~35 ℃)
1.5℃ (-10~60 ℃)
0%~100%RH /
6%RH (15~35 ℃)
9%RH (-10~60 ℃)
SCD41400ppm~5,000ppm
±(40ppm +読み取り値の5%)
-10~60℃ /
0.8℃ (15~35℃)
1.5℃ (-10~60℃)
0~100%RH /
6%RH (15~35℃)
9%RH(-10~60℃)
SCD30 と SCD4x の仕様比較