ITmedia NEWS > STUDIO >

部屋の二酸化炭素濃度を測定しよう ラズパイでCO2センサーを作る名刺サイズの超小型PC「ラズパイ」で遊ぶ(第47回)

» 2021年09月18日 09時00分 公開
[岩泉茂ITmedia]

 新型コロナウイルスの影響で緊急事態宣言が発令され、在宅勤務をしている人も多いでしょう。そこで気になるのは部屋の空気品質です。空気の品質というと真っ先に思い出すのは二酸化炭素の量でしょうか。そこでラズパイを使ってCO2を計測し、部屋の換気をする目安してはいかがでしょうか。

 今回使うデバイスは「CSS811」というセンサーが載っている「SEN-CCS811」(1499円)です。SEN-CCS811はI2Cを利用するので、電源とGNDの他、SDAとSCLの2本で接続できます。SDAとSCLを使って他のデバイスとデイジーチェーン接続も可能です。

SEN-CCS811 SEN-CCS811

 SEN-CCS811は二酸化炭素相当物(eCO2)や金属酸化物(MOX)レベルを含む、総揮発性有機化合物(TVOC:Total Volatile Organic Compounds)を感知できます。TVOCはペンキ塗料、カーペットといった建設資材などやコピー機に加工機械、またはヒトの呼気やタバコからも発生します。

CircuitPythonのインストール

 SEN-CCS811を使ってCO2を測定する方法はいろいろありますが、今回紹介するのは「CircuitPython」を使った測定法です。CircuitPythonはその名前の通り、Pythonをベースとして作られている言語です。ArduinoやRaspberry Piなどのデバイスを製作・販売しているAdafruitが開発を支援しているため、同社が販売しているデバイスのモジュールが数多く用意されており、扱いやすいのが特徴です。今回使うSEN-CCS811はAdafruit製のものではありませんが、きっちりと動作します。

 SEN-CCS811は、基板中央にある「CCS811」というセンサーで、二酸化炭素相当物(eCO2)のほか、金属酸化物を含む総揮発性有機化合物(TVOC)を検知します。TVOCにはトルエンやキシレン、アセトアルデヒド、パラジクロロベンゼンといった物質が含まれます。二酸化炭素の測定基準として「400ppm」という数値がありますが、CCS811ではこの400ppmという値から、どれくらい部屋の二酸化炭素量が増えたのか測定できます。TVOCの基準も同じく「ppb」での測定結果を表示してくれます。

 ラズパイとは以下のような形で接続します。VCCはラズパイの3.3Vに、GNDはラズパイのGNDに、SDAは3ピンに、SCLは5ピンに接続するあたりは通常のI2C接続と同じですが、これに加えてRSTをVCCに、WAKEをGNDに接続する必要があります。

SEN-CCS811 ラズパイとの接続

 接続したら「i2cdetect」コマンドで認識しているか確かめてみましょう。以下のように表示されていればOKです。なおSEN-CCS811で測定するには、測定前48時間から接続して通電している必要があるほか、接続後20分間放置したあとから測定することになっているので注意しましょう。

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

 まずはラズパイのシステムを最新にします。

$ sudo apt update
$ sudo apt upgrade -y

 続いてCircuitPythonをインストールします。以下のコマンドを順番に入力してください。

$ cd ~
$ sudo pip3 install --upgrade adafruit-python-shell
$ wget https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/raspi-blinka.py
$ sudo python3 raspi-blinka.py

 raspi-blinka.pyを実行すると、PythonのシステムをVersion3にアップデートするという警告が出ますので、「y」を押して進めます。最後に「REBOOT NOW?」と表示されたら「y」を入力してEnterキーを押し、ラズパイを再起動します。再起動したら以下のコマンドでI2CとSPIが動作しているかチェックします。

$ ls /dev/i2c* /dev/spi*

 以下のように表示されればOKです。

/dev/i2c-1 /dev/spidev0.0 /dev/spidev0.1

 では、CircuitPythonのライブラリが正しくインストールされたか確認します。下記のプログラムをnanoなどで記述し、「blinkatest.py」とファイル名をつけて保存しましょう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import board
import digitalio
import busio
print("Hello blinka!")
# Try to great a Digital input
pin = digitalio.DigitalInOut(board.D4)
print("Digital IO ok!")
# Try to create an I2C device
i2c = busio.I2C(board.SCL, board.SDA)
print("I2C ok!")
# Try to create an SPI device
spi = busio.SPI(board.SCLK, board.MOSI, board.MISO)
print("SPI ok!")
print("done!")
blinkatest.py

 保存したら以下のコマンドを実行します。

$ python blinkatest.py

 以下のように表示されていればOKです。

Hello blinka!
Digital IO ok!
I2C ok!SPI ok!
done!

 ではCCS811のライブラリをインストールしましょう。以下のコマンドを入力してください。

$ sudo pip3 install adafruit-circuitpython-ccs811

 インストールしたら続いて「/boot/config.txt」に以下の項目を追加します。これは、SEN-CCS811とのI2C通信が、通常の速度だと上手くいかないので、スピードを下げて通信させるためです。/boot/config.txtの最後に追記する形で問題ありません。

core_freq=500
core_freq_min=500
i2c_arm_baudrate=10000

 追記したら「sudo reboot」で、いったんラズパイを再起動します。再起動したら「ccs811test.py」のサンプルプログラムをnanoなどで記述します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import board
import adafruit_ccs811
i2c = board.I2C()  # uses board.SCL and board.SDA
ccs811 = adafruit_ccs811.CCS811(i2c)
# Wait for the sensor to be ready
while not ccs811.data_ready:
    pass
while True:
    print("CO2: {} PPM, TVOC: {} PPB".format(ccs811.eco2, ccs811.tvoc))
    time.sleep(1)
ccs811test.py

 記述して保存したら、以下のコマンドでプログラムを走らせます。

$ sudo python3 ccs811test.py

 すると1秒おきに二酸化炭素とTVOCの値を測定して表示します。先ほども述べた通り、ちゃんとした結果を得るためには20分以上の時間が必要なので注意してください。以下のように最初は安定しませんが、時間が経過すると近似値を示すようになります。

CO2: 400 PPM, TVOC: 0 PPB
CO2: 400 PPM, TVOC: 128 PPB
CO2: 405 PPM, TVOC: 128 PPB
CO2: 408 PPM, TVOC: 1 PPB
CO2: 33173 PPM, TVOC: 0 PPB
CO2: 405 PPM, TVOC: 0 PPB
CO2: 33254 PPM, TVOC: 13 PPB
CO2: 33206 PPM, TVOC: 5 PPB
CO2: 425 PPM, TVOC: 33023 PPB
CO2: 417 PPM, TVOC: 2 PPB
CO2: 422 PPM, TVOC: 3 PPB
CO2: 33216 PPM, TVOC: 7 PPB
CO2: 518 PPM, TVOC: 17 PPB
CO2: 33254 PPM, TVOC: 13 PPB
CO2: 33224 PPM, TVOC: 8 PPB
CO2: 443 PPM, TVOC: 6 PPB
CO2: 438 PPM, TVOC: 130 PPB
CO2: 438 PPM, TVOC: 5 PPB
……

 二酸化炭素の濃度ですが、400ppmを基準として設定されています。それよりも上昇していたら空気が汚染されていると考えてよいでしょう。

Copyright © ITmedia, Inc. All Rights Reserved.