ラズパイでさまざまなセンサーを取り扱ってきましたが、CO2センサーはやってていなかったので買ってみました。
CCS811が主流みたいですが、後続版?のENS160の基板を購入しています。
https://amzn.to/3W6fMLW ちょっとピン配置は難しいのですが、VINに5V SDAを2ピン SCLを3ピン GNDをラズパイのgroundに接続します。はじめ3.3Vにつないでいたのですが、I2C通信ができませんでした。ラズパイ5だけかもしれませんが注意が必要です。
そして下記コマンドをLXterminalにて入力します。
sudo i2cdetect 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- 53 -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
53と38が認識されればOKです。
あとはpythonのライブラリをインストールします。
https://pypi.org/project/ens160/下記コマンドにてインストールします。
pip install ens160
あとは下記サンプルコードでCO2濃度が取得できます。
import sys
from time import sleep
from ens160 import Driver, OpModes
from ens160.i2c import SMBusRetryingI2C
dev = Driver(SMBusRetryingI2C(0x53, 1))
dev.init()
part_id = dev.get_part_id()
if part_id != Driver.PART_ID:
print(f"Part not found, expected {Driver.PART_ID} got {part_id}.")
sys.exit(-1)
print(f"Part Id {part_id}")
print(f"Firmware version {dev.get_fw_version()}")
dev.set_rh_compensation(55.0)
dev.set_temp_compensation_fahrenheit(72.5)
print(dev.get_device_status())
dev.set_operating_mode(OpModes.STANDARD)
print("Operating Mode: ", dev.get_operating_mode())
while True:
status = dev.get_device_status()
print(status)
if status.new_data:
print(
f"AQI={dev.get_aqi()}, eCO2={dev.get_eco2()}ppm, TVOC={dev.get_tvoc()}ppb"
)
else:
sleep(0.1)
関数としてはdev.get_eco2()が二酸化炭素濃度[ppm]です。