ラズパイ5 pythonの仮想環境 ⑪ CO2センサSCD41
Adafruitから入手したCO2センサ SCD41(Sensirion)を利用します。温度と湿度、そしてCO2が測定できます。
●AdafruitのStemma QT/Qwiicボード
Stemma QT/Qwiic(JST SH 4ピン)コネクタは2か所に装着されていて、どちらにつないでもかまいません。このコネクタを使ってI2Cで制御する場合、特に、ジャンパ線をつなぐなどは不要です。
コネクタは、表と裏のどちらも差し込めそうですが、ピンが内部の上部に並んでいるので、差し込める方向は一意です。ロック機構はないですが、すぐに抜けるということはありません。
●CO2センサSCD41のおもなスペック
- 電源電圧 2.4~5.5V
- 消費電流 17mA
- 温度測定範囲 -10~+60℃、確度;±0.8℃
- CO2測定範囲 400~5000ppm、確度;±(40ppm + 読み取り値の5%)
- 湿度測定範囲 0~100%、確度;±6%
- インターフェース I2C(最大400kHz)
- スレーブ・アドレス 0x62
●環境
- ハードウェア Raspberry Pi 5(4GBモデル)
- OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
- Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている
●接続
●テスト環境envtestで、ライブラリのインストールの実験
仮想環境enctestを作って入ります。smbus2が残っていました。
$ source envtest/bin/activate
(envtest) yoshi@ras05:~ $ pip list
Package Version
---------- -------
pip 23.0.1
setuptools 66.1.1
smbus2 0.4.3
(envtest) yoshi@ras05:~ $ pip install scd4x
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting scd4x
Using cached https://www.piwheels.org/simple/scd4x/scd4x-0.0.2-py3-none-any.whl (6.7 kB)
Requirement already satisfied: smbus2 in ./envtest/lib/python3.11/site-packages (from scd4x) (0.4.3)
Installing collected packages: scd4x
Successfully installed scd4x-0.0.2
(envtest) yoshi@ras05:~ $ pip list
Package Version
---------- -------
pip 23.0.1
scd4x 0.0.2
setuptools 66.1.1
smbus2 0.4.3
サンプル・プログラムをダウンロードしてきます。
python-i2c-scd/examples/example_usage_linux_scd4x.py
scd41.pyで保存しました。
# (c) Copyright 2023 Sensirion AG, Switzerland import time parser = argparse.ArgumentParser() # Connect to the I2C 1 port # Make sure measurement is stopped, else we can't read serial number or print("scd4x Serial Number: {}".format(scd4x.read_serial_number())) scd4x.start_periodic_measurement() # Measure every 5 seconds for 5 minute |
動作させると足りないライブラリが2点あったのでインストールします。
(envtest) yoshi@ras05:~ $ pip install sensirion_i2c_driver
(envtest) yoshi@ras05:~ $ pip install sensirion_i2c_scd
(envtest) yoshi@ras05:~ $ pip list
Package Version
-------------------- -------
pip 23.0.1
scd4x 0.0.2
sensirion-i2c-driver 1.0.0
sensirion-i2c-scd 0.1.2
setuptools 66.1.1
smbus2 0.4.3
実行した様子です。
●測定結果をグラフィック・ディスプレイに表示
上記のテスト環境でインストールしたライブラリを、前回まで使っていた仮想環境encadcにインストールします。
yoshi@ras05:~ $ source envadc/bin/activate
(envadc) yoshi@ras05:~ $ pip list
Package Version
---------- -------
i2cdevice 1.0.0
numpy 1.26.4
pillow 10.2.0
pip 23.0.1
setuptools 66.1.1
smbus2 0.4.3
spidev 3.6
ST7789 0.0.4
(envadc) yoshi@ras05:~ $ pip install scd4x
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting scd4x
Using cached https://www.piwheels.org/simple/scd4x/scd4x-0.0.2-py3-none-any.whl (6.7 kB)
Requirement already satisfied: smbus2 in ./envadc/lib/python3.11/site-packages (from scd4x) (0.4.3)
Installing collected packages: scd4x
Successfully installed scd4x-0.0.2
(envadc) yoshi@ras05:~ $ pip install sensirion_i2c_driver
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting sensirion_i2c_driver
Using cached https://www.piwheels.org/simple/sensirion-i2c-driver/sensirion_i2c_driver-1.0.0-py3-none-any.whl (16 kB)
Installing collected packages: sensirion_i2c_driver
Successfully installed sensirion_i2c_driver-1.0.0
(envadc) yoshi@ras05:~ $ pip install sensirion_i2c_scd
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting sensirion_i2c_scd
Using cached https://www.piwheels.org/simple/sensirion-i2c-scd/sensirion_i2c_scd-0.1.2-py3-none-any.whl (13 kB)
Requirement already satisfied: sensirion-i2c-driver~=1.0.0 in ./envadc/lib/python3.11/site-packages (from sensirion_i2c_scd) (1.0.0)
Installing collected packages: sensirion_i2c_scd
Successfully installed sensirion_i2c_scd-0.1.2
(envadc) yoshi@ras05:~ $ python scd41.py
scd4x Serial Number: 33787350563647
968 ppm, 24.7 ツーC, 42.6 %RH
942 ppm, 24.2 ツーC, 43.6 %RH
●関数化
いくつかのエラーがI2Cバスのアクセス時に時々発生したので、try文を追加しました。
# (c) Copyright 2023 Sensirion AG, Switzerland parser = argparse.ArgumentParser() co2 = CO2 = '' def readData(): #main |
得られる測定値は、123.4ppmなどというオブジェクトなので、文字列にし、小数点を含む数字だけを取り出し、floatで数値化しました。
readData()中のtry文は、I2Cバスのアクセスでエラーが出たのをスキップするため、CO2 =float(Co2)などの数値化でのtry文は、re.sub()がまれに '' を返すこときにスキップするためです。
●グラフィック・ディスプレイに表示
前回のst7789のライブラリを利用します。
# (c) Copyright 2023 Sensirion AG, Switzerland parser = argparse.ArgumentParser() co2 = CO2 = '' def readData(): MESSAGE01 = "SCD41 " disp = ST7789.ST7789( height=240,width=320,rotation=0, disp.begin() while 1: |
実行中の様子です。