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 によりどの程度消費電力を抑えられるかも試してみたいところ。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中