SCD41 CO2センサーとラズパイで二酸化炭素濃度を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、SCD41 CO2センサーで二酸化炭素濃度を測定したり、センサーの校正や設定を変更する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定や記録ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

更新日 : 2024年2月13日

概要

現在様々な場面でCO2測定の重要性が高まっています。例えば、以下のような分野です。

  • 感染症対策のための換気の見える化
  • オフィス環境を改善し集中力、生産性の向上
  • CO2をコントロールして収穫量や品質を高めるスマート農業

SCD41センサーを搭載した「RPZ-CO2-Sensor」拡張基板を用いることで、Raspberry PiでCO2を測定することが可能になります。一方で、ハードウェアがあっても、センサーを制御するソフトウェアがなければ測定を行うことはできません。

そこで、Indoor Corgi製のRaspberry Pi拡張基板に搭載されているセンサーを一括して制御できるソフトウェア「cgsensor」を開発しました。

コマンドラインツールを使えば1行もコードを書かずに測定や記録ができるほか、Pythonパッケージでご自身のプログラムから簡単にセンサーを制御できます。本記事ではCO2センサー SCD41を制御する方法について解説します。

拡張基板

赤外線送受信機能、および温度測定機能が搭載されている拡張基板「RPZ-CO2-Sensor」を装着します。セットアップは製品ページをご参照下さい。

RPZ-CO2-Sensor拡張基板

I2C有効化

センサーとはI2Cで通信しますので、以下の記事を参考にI2Cを有効化して下さい。




インストール

センサー制御ソフトウェア「cgsensor」をインストールするには、以下のコマンドを実行します。ターミナルを開き、$に続くコマンドを実行して下さい。最新版へのアップグレードも同じコマンドで可能です。

ソースコードやサンプル、ライセンスはGitHubページに公開しています。

$ sudo python3 -m pip install -U cgsensor --break-system-packages

エラーが出る場合は最後のオプションを指定せずにお試しください。

$ sudo python3 -m pip install -U cgsensor

インストールが完了すると、cgsensorコマンドが使用可能になります。以下のように-hオプションを指定すると、使い方が画面に表示されます。

$ cgsensor -h

CO2の測定

SCD41関連の操作は、cgsensor scd41 … のように指定します。

まずは一番シンプルな測定方法を紹介します。以下のコマンドで、1回のみの測定が可能です(シングルショット)。1回の測定には5秒かかるので、コマンド実行後に測定のため5秒待機し、その後結果が表示されます。

$ cgsensor scd41
SCD41 測定
  CO2濃度[ppm]: 481

データシートによると、電源投入後は、値が正確になるまで最低3回の測定が必要です。後述する定期測定中に上記コマンドを実行した場合、定期測定は終了します。

シングルショットは下位バージョンのSCD40ではサポートされていません。

CO2の定期測定

シングルショットだと、コマンドから結果が得られるまで5秒かかってしまいます。そこで、センサーに定期的に測定させておき、必要なときに値を読み出すようにすれば、結果がすぐに得られます。これを定期測定と呼びます。

定期測定の開始

まず、以下のscd41 startコマンドを実行して定期測定を開始します。すると、センサーは最短の測定間隔5秒おきに自動的に測定を行います。

$ cgsensor scd41 start
SCD41 定期測定(5秒おき)を開始しました.
測定結果の読み出し

次に、scd41 readコマンドで測定した値を読み出して表示します。一度読み出しを行うと、次の定期測定が行われるまでは待つ必要があります。

$ cgsensor scd41 read
SCD41 測定結果の読み出し
  CO2濃度[ppm]: 761
定期測定の終了

scd41 stopコマンドで定期測定を終了できます。定期測定中は、後述するconfig(設定変更)やfrc(手動キャリブレーション)、省電力モードの測定などができないので、定期測定を終了しておく必要があります。

$ cgsensor scd41 stop
SCD41 定期測定を停止しました. 
省電力モード

scd startコマンドにlpオプションを指定すると、30秒おきの測定になり、省電力になります。頻繁な測定が不要の場合はこちらを使うと良いでしょう。

$ cgsensor scd41 start --lp
SCD41 定期測定(省電力30秒おき)を開始しました. 

全センサーの一括測定、記録

cgsensorには、対応する全センサーを一括で測定したり、連続で測定、結果をファイルに保存するといった、便利な機能が備わっています。cgsensor all … コマンドを利用します。

1回のみの測定

オプションを指定しない場合は、対応するセンサーを検出して測定し、結果を表示します。SCD41は必要に応じて定期測定を開始します。

$ cgsensor all
BME280
  温度[°C]:  29.3
  湿度[%]:   59.1
  気圧[hPa]: 1022.1
BME280#2
  温度[°C]:  34.0
  湿度[%]:   41.1
  気圧[hPa]: 1022.8
TSL2572
  明るさ[lux]:  149.3
SCD41
  CO2濃度[ppm]: 472
連続測定

-cオプションに続けて秒数を指定すると、指定した秒数おきに測定を連続して行い、時刻と測定結果を画面に表示します。値の変化を画面上でモニターしたい場合に便利です。SCD41は最短でも5秒の間隔が必要です。Ctrl+Cで終了します。

$ cgsensor all -c 10
時刻, SCD41 CO2濃度[ppm]
2021/10/12 15:02:28, 471
2021/10/12 15:02:38, 471
2021/10/12 15:02:48, 475
2021/10/12 15:02:58, 529
2021/10/12 15:03:08, 595
...
ファイルに保存

-fオプションに続けてファイル名を指定すると、時刻と測定結果をcsv形式で保存します。結果の保存や解析に便利です。

ファイルが既に存在する場合は、最後の行に追記していきます。追記する場合は、センサーの増減が無いようにして下さい。増減があると列がずれる場合があります。

以下のコマンドで、1回測定を行って結果を「sensor_log.csv」に保存します。

$ cgsensor all -f sensor_log.csv

-cオプションを併用すると、一定間隔で測定を行い、かつ結果を「sensor_log.csv」に保存していきます。

$ cgsensor all -c 60 -f sensor_log.csv

きっちりと決まった時刻に測定したい場合はcronなどの定期実行ソフトウェアと連携させて下さい。以下を/etc/crontabに追記すると、毎時0分、10分、20分、30分、40分、50分に測定を行い、結果を/home/pi/sensor_log.csvに保存します。

*/10  *  * * * pi cgsensor all -f sensor_log.csv

設定ファイルの編集方法が分からない場合は、以下の記事を参考にして下さい。




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

自動キャリブレーション

キャリブレーションには自動(ASC)と手動(FRC)の2種類があります。まずは自動キャリブレーションについて説明します。

自動キャリブレーションは、過去の測定データをもとに自動的に行われます。デフォルトで自動キャリブレーションは有効になっています。以下に判定表を用意しました。

上記の条件3つを全て満たす場合(ケース1)、自動キャリブレーションを利用できます。初めて使う際や、必要に応じて手動キャリブレーションも実施しても構いません。

常時電源ONで運用しない場合(ケース2)、自動キャリブレーションが動作しない可能性があるので、手動キャリブレーションが必須です。

1つめか2つめの条件に当てはまらない場合(ケース3、4)自動キャリブレーションが適正に動かない可能性があります。自動キャリブレーションを無効に変更した上で、手動キャリブレーションが必須です。

自動キャリブレーションの無効化

自動キャリブレーションが有効か無効かは、scd41 configコマンドで確認できます。定期測定は終了しておいて下さい。

$ cgsensor scd41 config
SCD41 コンフィグ情報
  シリアル番号: 0x631CC7DF074B
  自動キャリブレーション(ASC): 有効
  標高設定[m]: 0
  温度オフセット[°C]: 4.0

自動キャリブレーションを無効にするには、ascオプションに続けてoffと指定し、さらに-pオプションを指定します。-pオプションを指定すると、電源OFF後も変更が保持されます。有効に戻したい場合はascオプションでonとします。

$ cgsensor scd41 config --asc off -p
SCD41 自動キャリブレーション(ASC)を無効にしました. 
SCD41 コンフィグ情報
  シリアル番号: 0x631CC7DF074B
  自動キャリブレーション(ASC): 無効
  標高設定[m]: 0
  温度オフセット[°C]: 4.0
SCD41 EEPROMにコンフィグ情報を保存しました. 
手動キャリブレーション

手動キャリブレーションには、CO2濃度が分かっている環境にセンサーを配置する必要があります。そういった環境が無い場合は、外気(400-450ppm)の下に配置するようにして下さい。近くに人や排気口などのCO2排出源が無いようにして下さい。また、直射日光がセンサーに当たらないようにすることが推奨されています。

Raspberry Piをモニター等に繋いでいると外気環境下に移動させることが難しいこともあると思います。リモート操作するには以下の記事を参考にして下さい。電源はモバイルバッテリーを利用すると便利です。

次に、3分以上CO2の測定を行います。以下のコマンドを実行して3分以上待機します。

$ cgsensor scd41 start

3分以上経過したら、定期測定を停止します。

$ cgsensor scd41 stop

最後に、手動キャリブレーションコマンドを実行します。scd41 frcに続けて、準備した環境のCO2濃度[ppm]を入力します。省略した場合は、外気相当として450になります。

$ cgsensor scd41 frc 450
SCD41 450[ppm]を基準に手動リキャリブレーション(FRC)を実行しました. 

以上で手動キャリブレーションの手順は終了です。

温湿度の測定

SCD41には温度と湿度を計測する機能もあります。

温湿度の測定は、SCD41自身の発熱や、Raspberry Piの発熱の影響を受けます。より正確に測定したい場合は、外付BME280センサーの利用をおすすめします。

シングルショット

シングルショットで-vオプションを指定すると、温度と湿度も表示されます。

$ cgsensor scd41 -v
SCD41 測定
  CO2濃度[ppm]: 527
  温度[°C]:     34.9
  湿度[%]:      41.3
定期測定

定期測定中は、scd41 readコマンドに-vオプションを指定すると、温度と湿度も表示されます。

$ cgsensor scd41 read -v
SCD41 測定結果の読み出し
  CO2濃度[ppm]: 604
  温度[°C]: 32.7
  湿度[%]: 47.5
温度の補正

SCD41には自身の発熱を補正する機能が備わっています。センサーの温度測定値から一定の値(オフセット値)を引くことができます。現在のオフセット値は、scd41 configコマンドを実行し、「温度オフセット」の値を確認します。デフォルトで4[°C]の補正に設定されています。定期測定は終了させておいて下さい。

$ cgsensor scd41 config
SCD41 コンフィグ情報
  シリアル番号: 0x631CC7DF074B
  自動キャリブレーション(ASC): 有効
  標高設定[m]: 0
  温度オフセット[°C]: 4.0

オフセット値を変更するには、toffオプションに続けて値を入力します。以下は7.5[°C]に変更する例です。電源OFF後も変更を保持したい場合は、追加で-pオプションを指定します。-pオプションを使った設定の変更は最大2000回までとなっているので、必要な時だけ指定して下さい。

なお、温度オフセットの値はCO2の測定には影響しません。

$ cgsensor scd41 config --toff 7.5
SCD41 温度オフセットを7.5[°C]に変更しました. 
SCD41 コンフィグ情報
  シリアル番号: 0x631CC7DF074B
  自動キャリブレーション(ASC): 有効
  標高設定[m]: 0
  温度オフセット[°C]: 7.5

工場出荷時リセット

scd41 factoryコマンドで工場出荷時状態にリセットできます。確認が表示されたら「y」を入力してEnterを押して下さい。

$ cgsensor scd41 factory
SCD41 工場出荷時にリセットしてよろしいですか? [y/N]: y
SCD41 工場出荷時設定にリセットしました. 

Pythonパッケージの利用

これまでコマンドラインツールでセンサーを制御する方法について解説しました。一方、ご自身のPythonプログラムからセンサーを使いたい場合は、cgsensorパッケージを利用することで簡単に制御することができます。

1度だけ測定して結果を表示するサンプルコードを用意しています。

インポート

使用前の準備として、cgsensorパッケージをインポートしておきます。

import cgsensor  # インポート
SCD41クラス

SCD41の機能はSCD41クラスにまとめられています。まずは以下のようにインスタンスを作成します。

scd41 = cgsensor.SCD41()  # SCD41制御クラスのインスタンス
定期測定

SCD41クラスの各種メソッドや変数にアクセスしてセンサーを制御できます。

ここではstart_periodic_measurementで定期測定を開始したあとにread_measurementでセンサーから結果を読み出しています。timeoutを指定すると、センサーが測定完了になるのを一定時間待つことができます。

read_measurementが正常に完了すると、co2変数に測定結果[ppm]が入るので、それを画面に表示しています。

scd41.start_periodic_measurement()  # 5秒おきの定期測定を開始
scd41.read_measurement(timeout=10)  # 測定完了を待ってから測定結果の読み出し
print('CO2濃度 {}ppm'.format(scd41.co2))  # CO2濃度を取得して表示
scd41.stop_periodic_measurement()  # 定期測定を終了
例外

センサーとの通信に失敗するとIOError例外が発生します。センサーが接続されていない場合の他、定期測定中に実行できないコマンドを使った場合にも発生します。定期測定中に使用できるコマンドは以下のものだけです。例外は必要に応じて処理して下さい。

  • read_measurement
  • stop_periodic_measurement
  • set_ambient_pressure
  • get_data_ready_status
その他の機能

センサーの大半の機能を網羅しています。ソースコードのコメントを参照してください。また、メソッドの多くはセンサーのコマンドに対応しているので、SCD41データシートも合わせてご確認下さい。




注意事項

本ページの内容は、SCD41に関する資料をIndoor Corgiが解釈した結果、および実際に動作させた結果をもとに記載しております。センサーに関する情報の正確性を保証するものではありません。

センサーについての情報はSENSIRION社の資料をご確認下さい。

まとめ

センサー制御ソフトウェア「cgsensor」を利用して、SCD41 CO2センサーで二酸化炭素濃度を測定したり、センサーの校正や設定を変更する方法の解説は以上です。Pythonプログラムや他のソフトウェアと連携することで、センサーを使った様々なシステムを簡単に実装することができます。

また、「RPZ-PowerMGR」拡張基板と組み合わせると、指定した時刻だけ起動して測定することもできます。モバイルバッテリーを使った電源の確保できない環境でのセンシングも可能になるので、検討してみてはいかがでしょうか?

TSL2572センサーとラズパイで明るさ(照度)を測定する

Indoor Corgiのセンサー制御ソフトウェア「cgsensor」を利用して、TSL2572センサーで明るさを測定する方法を解説します。コマンドラインツールを使って1行もコードを書かずに測定ができるほか、Pythonパッケージを使えばご自身のプログラムから簡単にセンサーを制御できます。

ラズパイで赤外線制御 (家電、エアコン、照明、テレビなどを制御するホームIoT)

Pythonとpigpioを使ってRaspberry Piで赤外線の送受信を行う方法について解説しています。サンプルプログラムを用意しているので、簡単に受信、登録、送信動作をさせることができるほか、データ解析も可能です。赤外線を使ってエアコン、照明、テレビなどの家電を制御することが可能になります。

RPZ-PIRS (Raspberry Pi用 人感/明るさセンサー/赤外線 拡張基板)

Raspberry Pi(ラズパイ)に人感、明るさセンサー、赤外線送受信機能を搭載できる拡張基板です。人感センサーで人や動物を検知してカメラで撮影したり、赤外線で照明をONするような使い方が可能です。周囲の明るさをモニターできる他、外付温湿度/気圧センサー(別売り)を接続することで、温度、湿度、気圧の測定機能を追加できます。7色表示可能なRGB LEDにステータスを表示したり、スイッチを押すことで特定の動作をさせることができます。