ArduinoとPmod AQSでCO2を測定する

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30370/7819fb7d-8e37-6510-e6a2-0f8c0c99dfe2.jpeg)


Arduino と [**Pmod AQS**](https://reference.digilentinc.com/reference/pmod/pmodaqs/start) を使って CO2 の測定を行います。
この記事では Arduino Nano を使用しています。配線は異なりますが、回路とプログラムは Arduino Uno にも対応しています。

Arduino 自体の使い方については他の記事をご参照ください。

# Pmod AQS の特徴

- CCS811 使用
- I<sup>2</sup>C 接続
- 3.3V 駆動（**5V不可**）
- eCO2: 400～8,192 ppm の範囲で測定可
- TVOC: 0～1,187 ppb の範囲で測定可

eCO2 は 二酸化炭素相当量、TVOC は総揮発性有機化合物のことです。
このセンサは TVOC の値から CO2 の値を推測するため、<i>e</i>CO2 のように「相当量」と表現しています。

## センサの精度について

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">CCS811って「二酸化炭素相当物（eCO2）」の計測なので、TVOCの量から類推して測るので、反応は速いのですが精度がよくなくてすぐ1500ppmとかになってしまいます。空気質からの制御とかにつかうならNDIR方式の <a href="https://t.co/qZtk5I3cgB">https://t.co/qZtk5I3cgB</a> こういうやつのほうがいいです。</p>&mdash; utaani (@utaani) <a href="https://twitter.com/utaani/status/1087972154786893824?ref_src=twsrc%5Etfw">January 23, 2019</a></blockquote>

上記ツイートの指摘通り、精度を求める用途には不向きです。

しかし「制御には使わないが、だいたいの値を知りたい」というユースケースであれば十分です。
また、このセンサの強みは I<sup>2</sup>C 接続です。配線量を少なくしつつ、他の I<sup>2</sup>C 接続のセンサICも並行して使いたい場合にはとても使いやすいセンサです。さらに秋月電子で取り扱いがあり、入手しやすいデバイスです。

# 用意するもの

|部品名|画像|はんだ付け|入手先 (参考)|
|---|:--:|---|---|
|**Arduino Nano**<br/>(Arduino UNO でも可)|<img width="240" alt="Arduino Nano" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30370/ff90ed3f-6be4-a534-6dbd-45beba4906d2.jpeg">|必要なし|[秋月電子](https://akizukidenshi.com/catalog/g/g109059/) |
|**Pmod AQS**|<img width="240" alt="Pmod AQS" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30370/b39d6787-d8d3-6437-1ac8-aca7a40fc321.jpeg">| 必要なし | [秋月電子](https://akizukidenshi.com/catalog/g/g114144/) など |
|**AE-PCA9306**<br/>I<sup>2</sup>Cバス用双方向電圧レベル変換モジュール|<img width="240" alt="AE-PCA9306" src="https://qiita-image-store.s3.amazonaws.com/0/30370/bfa1e1d3-eddf-803b-7af8-18d0ee8078dd.jpeg">|**必要**|[秋月電子](https://akizukidenshi.com/catalog/g/g105452)

Arduino Nano は 5V で駆動し、ロジックレベル（IOピンの電圧レベル）も 5V のため、3.3V で駆動する Pmod AQS に**直接接続できません**。
3.3V は Arduino Nano に搭載されているレギュレータから供給しますが、5V <-> 3.3V のロジックレベル変換回路は別途用意しなくてはなりません。

ブレッドボード、ジャンパ、ケーブル、はんだ用具などは別途お好きなものをご用意ください。

# 回路

![回路図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30370/8a437b94-dac0-c029-8487-1825490c3771.png)

Arduino Uno も同様の配線となります。VREF1 に 5V、VREF2 に 3.3V を印加してください。
Pmod AQS の WAKE 側を短絡させると I<sup>2</sup>C との通信が有効になります。

![Pmod AQSのジャンパ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30370/22f71c46-c184-5c87-6429-7964832d0430.jpeg)

Pmod AQSには JP1, JP2, JP3 のジャンパが存在します。

JP1, JP3 は常時短絡、JP2 は I<sup>2</sup>C のプルアップ抵抗が必要な場合のみ短絡してください。
今回はレベルシフタ側にプルアップ抵抗が内蔵されているため Pmod AQS 側のプルアップ抵抗は使わず、画像の通り JP2 は2つとも開放します。


# スケッチ

Pmod AQS の[**公式サイト**](https://reference.digilentinc.com/reference/pmod/pmodaqs/start)にライブラリがあります。
**Library and example code** からZIPファイルをダウンロードし、 **PmodAQS.h** と **PmodAQS.cpp** を参照可能なパスに置いてください。

以下のスケッチにて PmodAQS.h をインクルードしています。

```cpp:pmod_aqs.ino
#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 が表示されます。

![動作風景](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30370/371da47a-b3d3-f926-1772-8121324532f0.gif)

以下のように表示された場合は接続を誤っています。電源を切って配線を再確認してください。

```
Failed to start sensor! Please check your wiring.
```

# 計測の注意点

電源投入から 10 分程度は値が不安定で最低値の 400ppm となることが多く、それまでは観測値を捨てる（無視する）などして対応してください。

一方でセンサの感度が高いため軽く息を吹きかけただけで eCO2 が瞬時に 1,000ppm を上回ります。人感センサの用途でない限りノイズ源（例えば人体）とは 1m 以上は離しておくとよいでしょう。

# 参考

- [**秋月電子 Pmod AQS**](https://akizukidenshi.com/catalog/g/g114144/)<br />
  https://akizukidenshi.com/catalog/g/g114144/
- [**DIGILENT Pmod AQS**](https://reference.digilentinc.com/reference/pmod/pmodaqs/start)<br />
  https://reference.digilentinc.com/reference/pmod/pmodaqs/start