Arduino と Pmod AQS を使って CO2 の測定を行います。
この記事では Arduino Nano を使用しています。配線は異なりますが、回路とプログラムは Arduino Uno にも対応しています。
Arduino 自体の使い方については他の記事をご参照ください。
Pmod AQS の特徴
- CCS811 使用
- I2C 接続
- 3.3V 駆動(5V不可)
- eCO2: 400~8,192 ppm の範囲で測定可
- TVOC: 0~1,187 ppb の範囲で測定可
eCO2 は 二酸化炭素相当量、TVOC は総揮発性有機化合物のことです。
このセンサは TVOC の値から CO2 の値を推測するため、eCO2 のように「相当量」と表現しています。
センサの精度について
CCS811って「二酸化炭素相当物(eCO2)」の計測なので、TVOCの量から類推して測るので、反応は速いのですが精度がよくなくてすぐ1500ppmとかになってしまいます。空気質からの制御とかにつかうならNDIR方式の https://t.co/qZtk5I3cgB こういうやつのほうがいいです。
— utaani (@utaani) January 23, 2019
上記ツイートの指摘通り、精度を求める用途には不向きです。
しかし「制御には使わないが、だいたいの値を知りたい」というユースケースであれば十分です。
また、このセンサの強みは I2C 接続です。配線量を少なくしつつ、他の I2C 接続のセンサICも並行して使いたい場合にはとても使いやすいセンサです。さらに秋月電子で取り扱いがあり、入手しやすいデバイスです。
用意するもの
部品名 | 画像 | はんだ付け | 入手先 (参考) |
---|---|---|---|
Arduino Nano (Arduino UNO でも可) |
![]() |
必要なし | 秋月電子 |
Pmod AQS | ![]() |
必要なし | 秋月電子 など |
AE-PCA9306 I2Cバス用双方向電圧レベル変換モジュール |
![]() |
必要 | 秋月電子 |
Arduino Nano は 5V で駆動し、ロジックレベル(IOピンの電圧レベル)も 5V のため、3.3V で駆動する Pmod AQS に直接接続できません。
3.3V は Arduino Nano に搭載されているレギュレータから供給しますが、5V <-> 3.3V のロジックレベル変換回路は別途用意しなくてはなりません。
ブレッドボード、ジャンパ、ケーブル、はんだ用具などは別途お好きなものをご用意ください。
回路
Arduino Uno も同様の配線となります。VREF1 に 5V、VREF2 に 3.3V を印加してください。
Pmod AQS の WAKE 側を短絡させると I2C との通信が有効になります。
Pmod AQSには JP1, JP2, JP3 のジャンパが存在します。
JP1, JP3 は常時短絡、JP2 は I2C のプルアップ抵抗が必要な場合のみ短絡してください。
今回はレベルシフタ側にプルアップ抵抗が内蔵されているため Pmod AQS 側のプルアップ抵抗は使わず、画像の通り JP2 は2つとも開放します。
スケッチ
Pmod AQS の公式サイトにライブラリがあります。
Library and example code からZIPファイルをダウンロードし、 PmodAQS.h と PmodAQS.cpp を参照可能なパスに置いてください。
以下のスケッチにて PmodAQS.h をインクルードしています。
#include "PmodAQS.h"
#define I2C_ADDRESS_CCS811 0x5b
PmodAQS ccs;
void setup() {
Serial.begin(9600);
if (!ccs.begin(I2C_ADDRESS_CCS811)) {
Serial.println("Failed to start sensor! Please check your wiring.");
while (1) ;
}
// calibrate temperature sensor
while (!ccs.available()) ;
ccs.setTempOffset(ccs.calculateTemperature() - 25.0);
}
void loop() {
delay(5000);
if (!ccs.available())
return;
ccs.calculateTemperature();
if (!ccs.readData())
return;
Serial.print("eCO2: ");
Serial.print(ccs.geteCO2(), DEC);
Serial.print("ppm, ");
Serial.print("TVOC: ");
Serial.print(ccs.getTVOC(), DEC);
Serial.println("ppb");
}
Arduino への書き込み後にシリアル通信を開くと 5 秒ごとに eCO2 と TVOC が表示されます。
以下のように表示された場合は接続を誤っています。電源を切って配線を再確認してください。
Failed to start sensor! Please check your wiring.
計測の注意点
電源投入から 10 分程度は値が不安定で最低値の 400ppm となることが多く、それまでは観測値を捨てる(無視する)などして対応してください。
一方でセンサの感度が高いため軽く息を吹きかけただけで eCO2 が瞬時に 1,000ppm を上回ります。人感センサの用途でない限りノイズ源(例えば人体)とは 1m 以上は離しておくとよいでしょう。