#始めに
以前の記事でGroveのCo2センサの使い方を解説しましたが、Groveではないですが他のCo2を借りたので出力される値の比較を行ってみました。
#NDIR式CO2(二酸化炭素)センサモジュール CDM7160
もう一つのCo2センサはフィガロ技研のCDM7160というセンサです。I2CやUARTでマイコンと繋げられるので、Wio LTEにも接続可能です。ただし、このセンサも5Vで動作するため、繋ぐためには5Vを用意する必要があります。
CDM7160で計測できる範囲はGrove Co2センサが400ppm~2000ppmなのに対し300~5000ppmという広い範囲になっています。
#接続
Grove Co2センサはUART、CDM7160はI2CでWio LTEに接続します。
CDM7160は借り物のため回路部分は非公開とさせてください。3.3Vから5Vにする回路があるぐらいです。
Grove Co2センサも3.3Vから5Vにする回路を間に挟んでいます。
#スケッチ
GroveのCo2センサもCDM7160もライブラリを作りましたので、公開してます。
-
Grove Co2センサ https://github.com/junichikatsu/Grove_Co2
あと出力値をグラフで見るため以前に作ったAmbientのライブラリも使いました。
試したスケッチは30秒ごとにそれぞれのCo2センサの値をAmbientにアップするようにしました。
#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;
// 2つのセンサ共に値が取れたら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上でグラフを確認したところ次のようになりました。
青がCDM7160で、赤がGroveのCo2センサです。
変化の過程は同じに見えますが、ちょっとオフセットがのったような形になってます。
ほぼ同じ場所に置いていたので、センサの構造上のセンサに当たる空気の度合いの違いか、ソフトウェアのバグかは別途調査していきます。
とりあえず変化の具合が同じなのでセンサ自体は正常に動作してそうです。
次は市販のCo2センサと比較して、確認したいと思います。
#最後に
執筆しているWio LTEのkindle書籍については近々出版予定です。Groveの種類が多く、ページ数も膨らんでしまったので何冊かに分けて出版することにしました。
今回紹介したCo2センサの詳細な扱い方なども掲載しています。
出版形式: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モジュールの繋げ方