Wio LTEで複数のCo2センサを比較してみた

#始めに
[以前の記事](https://qiita.com/jksoft/items/0e385eec06dd146b836f)で[GroveのCo2センサ](http://wiki.seeed.cc/Grove-CO2_Sensor/)の使い方を解説しましたが、Groveではないですが他のCo2を借りたので出力される値の比較を行ってみました。

#NDIR式CO2（二酸化炭素）センサモジュール CDM7160
もう一つのCo2センサはフィガロ技研の[CDM7160](http://www.figaro.co.jp/product/feature/cdm7160.html)というセンサです。I2CやUARTでマイコンと繋げられるので、Wio LTEにも接続可能です。ただし、このセンサも5Vで動作するため、繋ぐためには5Vを用意する必要があります。
CDM7160で計測できる範囲はGrove Co2センサが400ppm～2000ppmなのに対し300～5000ppmという広い範囲になっています。

#接続
Grove Co2センサはUART、CDM7160はI2CでWio LTEに接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/27082e07-1f98-f402-0910-ab5545b22e14.png)
CDM7160は借り物のため回路部分は非公開とさせてください。3.3Vから5Vにする回路があるぐらいです。
Grove Co2センサも3.3Vから5Vにする回路を間に挟んでいます。

#スケッチ
GroveのCo2センサもCDM7160もライブラリを作りましたので、公開してます。

- Grove Co2センサ  https://github.com/junichikatsu/Grove_Co2

- CDM7160  https://github.com/junichikatsu/CDM7160

あと出力値をグラフで見るため以前に作ったAmbientのライブラリも使いました。

- Ambient https://github.com/junichikatsu/Ambient_Wio_LTE_lib

試したスケッチは30秒ごとにそれぞれのCo2センサの値をAmbientにアップするようにしました。

```Arduino
#include <WioLTEforArduino.h>
#include <Co2Sensor.h>
#include <CDM7160.h>
#include <Wire.h>
#include "Ambient.h"

#define APN               "soracom.io"
#define USERNAME          "sora"
#define PASSWORD          "sora"
#define INTERVAL          (30 * 1000)

Co2Sensor grove_co2;

CDM7160 cdm7160_co2;

WioLTE Wio;
WioLTEClient WioClient(&Wio);

unsigned int channelId = 100;
const char* writeKey = "...writeKey...";
const char* userKey = "...userKey...";
Ambient ambient;

bool connectLTE() {

  SerialUSB.println("");
  SerialUSB.println("--- Connect LTE ---------------------------------------------------");

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return false;
  }

  SerialUSB.println("### Connecting to \""APN"\".");
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    SerialUSB.println("### ERROR! ###");
    return false;
  }

  SerialUSB.println("### Connect completed.");

  return true;
}

void setup() {
  // 初期化
  Wio.Init();
  // Groveの電源をON
  Wio.PowerSupplyGrove(true);
  // I2C開始
  Wire.begin();
  
  // CMD7160 Co2センサとの通信準備
  cdm7160_co2.begin();

  // Grove Co2センサとの通信準備
  grove_co2.begin(&Serial);
  grove_co2.calibration();

  // LTEに接続
  connectLTE();
  // Ambientへの接続準備
  ambient.begin(channelId, writeKey, &WioClient);  
}

void loop() {
  unsigned long stime = millis();
  
  // CDM7160からデータが取れるかチェック
  if(!cdm7160_co2.readData()) return;
  
  // Grove Co2センサからデータが取れるかチェック
  if(grove_co2.readData()){
    // Co2センサが初期化完了してない場合はAmbientに送信しない
    if(!grove_co2.getInitEndStatus())  return;
  }
  else return;

  // ２つのセンサ共に値が取れたらAmbientへ送信    
  // 取得したデータをシリアルモニタに表示
  SerialUSB.print("CDM7160 CO2: ");
  SerialUSB.print(cdm7160_co2.getCo2());
  SerialUSB.println("");
  SerialUSB.print("Grove   CO2: ");
  SerialUSB.print(grove_co2.getCo2());
  SerialUSB.println("");
  
  // Ambientに送信
  ambient.set(1, cdm7160_co2.getCo2());
  ambient.set(2, grove_co2.getCo2());
  ambient.send();

  // インターバル時間に合うように残り時間をディレイする
  unsigned long elapse = millis() - stime;
  if (elapse < INTERVAL) delay(INTERVAL - elapse);

}
```

#出力されたグラフ
Ambient上でグラフを確認したところ次のようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/deab80c1-63ae-b7e9-6447-ac6fca8ed952.png)

青がCDM7160で、赤がGroveのCo2センサです。
変化の過程は同じに見えますが、ちょっとオフセットがのったような形になってます。
ほぼ同じ場所に置いていたので、センサの構造上のセンサに当たる空気の度合いの違いか、ソフトウェアのバグかは別途調査していきます。
とりあえず変化の具合が同じなのでセンサ自体は正常に動作してそうです。
次は市販のCo2センサと比較して、確認したいと思います。

#最後に
#
執筆しているWio LTEのkindle書籍については近々出版予定です。Groveの種類が多く、ページ数も膨らんでしまったので何冊かに分けて出版することにしました。
今回紹介したCo2センサの詳細な扱い方なども掲載しています。

以下、書籍の情報です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/e7adb811-470f-36a4-3975-61803ae4f8ea.png)

出版形式：kindle(電子書籍)
価格：1,000円（予定）
その他：書籍の中で、扱っているライブラリやスケッチ例はGitHubからダウンロードできるようにします。
〇目次
  Groveとは
  Groveの種類
  　電圧の違い
  　インターフェースの違い
  Groveリファレンス
   　Grove IoT Starter kit
    　　Grove - ボタン
    　　Grove - ブザー
    　　Grove - 磁気スイッチ
    　　Grove - 温湿度センサー
    　　Grove - 超音波距離センサー
    　　Grove - GPS
    　　Grove - 3軸デジタル加速度センサー(±16g) 
   　さまざまなGroveモジュール
    　　Grove - 水センサ
    　　Grove - I2C タッチセンサ
   　そのまま繋げられないGroveモジュール
    　　Grove - CO2センサー 
   　自作Groveモジュール
    　　e-DISP4
    　　BME680 温湿度・気圧・ガスセンサモジュール
    　　VEML6070 UV紫外線センサ・モジュール
　付録
　　ライブラリの追加方法
　　複数のI2Cモジュールの繋げ方