
[電子工作]Arduinoで二酸化炭素濃度測定器を作ってみた(Vol.1)
今回は初めて電子工作の記事書きます。ArduinoとCO2センサーを使って二酸化炭素(CO2)濃度測定器を作って、動かすところまでをやってみました。
そもそもの始まりは
2019年10月頃から、ノンプロ研でプログラミング等の勉強をしています。
そのノンプロ研で去年の夏くらいに電子工作のイベントがあり、そこで遊ぶためにGrove Beginner Kit For Arduinoというマイコンボードを買っていました。
時は流れ、最近知人が某ウイルス対策で換気ができているかを測定できるためにCO2濃度測定器を買ったという話を聞き、Amazonでどんなもんか見てたら、ふと以下の商品が目に付きました。
普通のCO2濃度測定器は数千円~1万円以上してとても買う気はしませんが、これは1500円程度(購入時)です。ちょうど外出自粛で週末を持て余す日もあるので、久しぶりにArduinoで遊んでみようと思ってポチってみました。
センサーモジュールのManualは以下で見れます。
これを参考にしてCO2濃度が測定できるようになったので、手順をまとめてみました。まとめと言いつつスクショ多めなので長いです。。
手順1.ソースコード・ライブラリをダウンロード
まず、製品ページのリンク記載のDropboxから、右上の「ダウンロード」ボタンを押してダウンロードします。
そうすると、KS0457 keyestudio CCS811 Carbon Dioxide Air Quality Sensor.zipというファイルがダウンロードされます。
次に、ダウンロードしたzipファイルを展開します。エクスプローラーで、zipファイルを右クリックして、「すべて展開」を選択します。
(Windowsでの手順です)
展開先の選択とファイルの展開というウィンドウが出るので、そのまま右下の「展開」ボタンを押します。
そうすると、KS0457 keyestudio CCS811 Carbon Dioxide Air Quality Sensorというフォルダに展開されます。
展開したフォルダ構成は以下のようになっています。
KS0457 keyestudio CCS811 Carbon Dioxide Air Quality Sensor
├Libraries
│└CCS811 #CCS811を使用するためのライブラリ
│ ├examples
│ │└readData
│ │ └readData.ino #サンプルコード
│ ├CCS811.cpp #ライブラリソースファイル
│ └CCS811.h #ライブラリヘッダファイル
├Test Code
│└Code
│ └readData
│ └readData.ino #サンプルコード(上のCCS811フォルダ内のものと同じ)
└KS0457 keyestudio CCS811 Carbon Dioxide Air Quality Sensor.docx # Manual
サンプルコードの中身は以下。
#include <CCS811.h>
/*
* IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
*/
//CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
CCS811 sensor;
void setup(void)
{
Serial.begin(115200);
/*Wait for the chip to be initialized completely, and then exit*/
while(sensor.begin() != 0){
Serial.println("failed to init chip, please check if the chip connection is fine");
delay(1000);
}
/**
* @brief Set measurement cycle
* @param cycle:in typedef enum{
* eClosed, //Idle (Measurements are disabled in this mode)
* eCycle_1s, //Constant power mode, IAQ measurement every second
* eCycle_10s, //Pulse heating mode IAQ measurement every 10 seconds
* eCycle_60s, //Low power pulse heating mode IAQ measurement every 60 seconds
* eCycle_250ms //Constant power mode, sensor measurement every 250ms
* }eCycle_t;
*/
sensor.setMeasCycle(sensor.eCycle_250ms);
}
void loop() {
delay(1000);
if(sensor.checkDataReady() == true){
Serial.print("CO2: ");
Serial.print(sensor.getCO2PPM());
Serial.print("ppm, TVOC: ");
Serial.print(sensor.getTVOCPPB());
Serial.println("ppb");
} else {
Serial.println("Data is not ready!");
}
/*!
* @brief Set baseline
* @param get from getBaseline.ino
*/
sensor.writeBaseLine(0x847B);
//delay cannot be less than measurement cycle
//delay(1000);
}
このままArduino IDEでコンパイルすると、いきなり1行目のincludeでライブラリがないぞとエラーが出るので、先程ダウンロードしたライブラリをインストールしていきます。
手順2.ライブラリのインストール
ライブラリのインストールといっても、実際はフォルダをコピーするだけなので簡単です。
先程ダウンロードして展開したフォルダのLibrariesフォルダにあるCCS811というフォルダを丸ごとArduinoのライブラリ格納場所にコピーします。
Arduinoのライブラリ格納場所は、ArduinoIDEのメニューから、ファイル→環境設定→”スケッチブックの保存場所”に記述してあるフォルダ名の下のにあるlibrariesというフォルダです。
コピーするとこんな感じです。今までにインストールしたライブラリに、CCS811というフォルダが追加されます。
インストール(ただコピーするだけ)に成功すると、Arduino IDEのメニューから、スケッチ→ライブラリのインクルードを選択したときに表示される「提供されたライブラリ」にCCS811という項目が追加されていることが確認できます。これでライブラリのインストールは完了です。
手順3.CCS811をArduinoに接続
Manualに従って、こんな感じにつなぎます。左がArduinoで、右がセンサーです。
私の持っているGrove Beginner Kit For Arduinoとは見た目が違いますがピンは同じように出ているので以下の写真のように問題なくつなげます。接続している線はジャンパーワイヤ(メス-オス)を使いました。
なお、Grove Beginner Kit For Arduinoについているケーブル(白いソケットに差すやつ)ではセンサー側の端子と合わないため接続できませんので、注意して下さい。
手順4.サンプルコードをコンパイルして書き込み
ダウンロードしてきたサンプルコード「readData.ino」をArduino IDEでコンパイルして書き込んでみます。
Arduino IDEがインストールされていれば、ファイルをダブルクリックすると開けます。そのままメニューの下のレ点のアイコンをクリックします。メニューからであれば、スケッチ→検証・コンパイルでもOKです。
そうすると、以下のように下の方に「スケッチをコンパイルしています...」と表示されます。
コンパイルが終了したら「コンパイルが完了しました」と表示されます。
次に、Arduinoに書き込みます。先程のコンパイルの右にある「→」のアイコンを押します。メニューからであれば、スケッチ→マイコンボードに書き込むでもOKです。
書き込みが終わると、「ボードへの書き込みが完了しました」と表示が出ます。これでセンサの動作が開始されていますので、結果を見ていきます。
手順5.測定結果をシリアルモニタで確認
サンプルコードは、測定結果をシリアルモニタに出力しているので、Arduino IDEからシリアルモニタを起動して確認してみます。
シリアルモニタは、メニューからツール→シリアルモニタで起動します。
シリアルモニタでは、こんな感じで表示されます。文字化けしていますね。
これは、シリアルモニタの通信速度がソースコードで設定している値と合っていないためです。ウィンドウ右下で設定できるシリアルモニタの通信速度を115200bpsに変えるとちゃんと表示されます。
おー!なんかそれっぽい!!
これを見ると、CO2が400ppm台、TVOCが数ppb台です。
ちなみに、CO2が二酸化炭素濃度で、TVOC(Total Volatile Organic Compounds)は総揮発性有機化合物濃度です。(なんかヤバそうなやつ)
ちなみに、地球上のCO2濃度は、大体400ppm(0.04%)程度とのことで、数値的にも大体合ってそうです。ちなみにこのセンサーで測定できる下限値は400ppmです。
では実際に数値の変わり具合を見てみましょう。一番身近なCO2発生源は、私です。(笑)
センサーに直接息を吹きかけてみると、めっちゃ数値が上がります。吐息なので安定はしませんが、1500~3000ppmの間くらいでしょうか。
比較対象が無いので絶対値が合っているかはわかりませんが、これくらい差が出れば、換気が悪くなっていることくらいは判定できそうですね。
ちなみに、学校環境衛生基準には「換気の基準としてCO2は1500ppm 以下であることが望ましい。」と書かれています。まあそんなもんかなという数値ですね。
手順6.二酸化炭素濃度が一定以上になったらブザーとLEDでアラームを鳴らす
このままだと常時PCにつなげて数値を見守り続ける必要があり、全く仕事になりません。
幸いGrove Beginner Kit For ArduinoにはブザーとLEDが付いていますので、サンプルコードを改造して、CO2濃度が一定以上になったらブザーを鳴らして、LEDも点灯させるようにしてみます。なんか電子工作っぽいですね~
ブザーやLEDの使い方は、Grove Beginner Kit For Arduinoのチュートリアルにも載っていますし、ノンプロ研でHiroCom777先生による電子工作イベントでもやったことがあるので、改造は楽勝です。
コードを以下のように変更してみました。変えたところは、以下の4箇所です。
・ 最初(9行目~)の変数設定(基準値は1000ppmで設定)
・setupの最後(34行目)にLEDピン設定pinMode()を追加
・void loop()内(40,43行目)でsensor.getCO2PPM()を変数に格納
・void loop()最後(60行目~)にif文を追加しブザーとLEDをON/OFFする
#include <CCS811.h>
/*
* IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
*/
//CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
CCS811 sensor;
//Buzzer setting
const int co2_limit = 1000;
//LED pin setting
const int ledPin = 4;
void setup(void)
{
Serial.begin(115200);
/*Wait for the chip to be initialized completely, and then exit*/
while(sensor.begin() != 0){
Serial.println("failed to init chip, please check if the chip connection is fine");
delay(1000);
}
/**
* @brief Set measurement cycle
* @param cycle:in typedef enum{
* eClosed, //Idle (Measurements are disabled in this mode)
* eCycle_1s, //Constant power mode, IAQ measurement every second
* eCycle_10s, //Pulse heating mode IAQ measurement every 10 seconds
* eCycle_60s, //Low power pulse heating mode IAQ measurement every 60 seconds
* eCycle_250ms //Constant power mode, sensor measurement every 250ms
* }eCycle_t;
*/
sensor.setMeasCycle(sensor.eCycle_250ms);
pinMode(ledPin, OUTPUT); // LED端子設定追加
}
void loop() {
int co2; // CO2測定結果格納用変数定義
delay(1000);
if(sensor.checkDataReady() == true){
co2 = sensor.getCO2PPM(); // CO2測定結果を変数に格納
Serial.print("CO2: ");
Serial.print(co2); // 変数の内容を表示する
Serial.print("ppm, TVOC: ");
Serial.print(sensor.getTVOCPPB());
Serial.println("ppb");
} else {
Serial.println("Data is not ready!");
}
/*!
* @brief Set baseline
* @param get from getBaseline.ino
*/
sensor.writeBaseLine(0x847B);
//delay cannot be less than measurement cycle
//delay(1000);
// If the CO2 concentration is higher than the specified value,
// Buzzer and LED will be turned on.
if(co2 > co2_limit){ // CO2濃度が既定値を超えたら
tone(5, 440); // ブザーを鳴らす
digitalWrite(ledPin, HIGH); // LED点灯
} else { // CO2濃度が既定値以下だったら
noTone(5); // ブザーを止める
digitalWrite(ledPin, LOW); // LED消灯
}
}
このコードを実行してみます。息を吹きかけると、ブザーが鳴ってLEDが光りました。吹きかけるのをやめてCO2濃度1000ppmを下回るとブザーとLEDが消えます。かなりいい感じです!
これで、シリアルモニタで値を見なくても、CO2濃度が判定できます。ということは、ArduinoをPCに繋がなくても、USBで電源つないでおけば動き続けるということです。これで測定しながら仕事ができます。
まとめ
ということで、CCS811を使ってCO2濃度を測定し、一定値以上の濃度を検出したらアラームを出すところまでやってみました。
今回は、Arduinoを使うのが久しぶりだったのと、スクショ撮ったりまとめたりしながらだったので数時間かかってしまいましたが、単に使うだけなら1時間もかからないですし、Arduinoに慣れてる人なら数分で動かせると思います。
Arduinoに興味があったり、既にArduinoを持っていて、安価で簡易的なCO2濃度測定器を使ってみたい人はぜひやってみて下さい。(精度は知らん)
今回はCO2濃度を測定してアラーム鳴らすところまででしたが、Grove Beginner Kit For ArduinoにはOLEDディスプレイがついているので、次はこのディスプレイにCO2濃度の数値を表示してみることにチャレンジしてみようかと思います。
最後まで読んでいただき、ありがとうございました。
おまけ
今回初めてAmazonアソシエイト(アフィリエイト)に登録して、リンク貼ってみました。とはいっても、まだ登録しただけで『180日以内に3商品を売ってから審査』となるらしいですが。。。
ということで、
『Amazonアソシエイトプログラム』
当ブログはamazon.co.jpを宣伝しリンクすることによって、サイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。
いいなと思ったら応援しよう!
