今、まさにコロナ禍です。
このため職場では、部屋の換気をよくやります。
が、気温がまだ低い時期でもあるので、換気が終わればすぐに閉めたいところ。
その換気の目安に、この二酸化炭素濃度センサーが使えそうという話を聞いたので、さっそく買ってみました。
Keyestudio CCS811搭載のKS0457というセンサーです。
Amazonで1499円。ほかにもっと安いのがあったんですけど、Primeマーク付きじゃないところからはなるべく買わないようにしたら、これが最安値でした。
本当はRaspberry Piで使いたかったんですが、I2Cながらやや特殊な接続の仕方(通常のI2Cなら4本で済むところが、5本接続)だったので、Arduinoに接続して使用することに。
で、あとは下記のサイトに従って、使えるようにします。
[電子工作]Arduinoで二酸化炭素濃度測定器を作ってみた(Vol.1)|ホッタ|note
まず、Arudinoとこのセンサーを接続。メス-メスのジャンパー線で、それぞれ
センサー … Arduino
・GND … GND
・VCC … 5V
・SDA … A4
・SCL … A5
・WAKE … GND
に接続します。
続いて、メーカーの提供するコードとライブラリを以下からダウンロード。
Dropbox - KS0457 keyestudio CCS811 Carbon Dioxide Air Quality Sensor - 日常をシンプルに
得られたZipファイルを展開し、ライブラリフォルダにある「CCS811」というフォルダを丸ごとArduinoIDEのライブラリ用フォルダ(たいていはドキュメントの中の「Arduino」-「libraries」というフォルダ)に入れます。
で、ArduinoIDEを開き、以下のコードをコンパイルします。
#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.println(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);
}
実は元コードはCO2濃度とTVOC(総揮発性有機化合物濃度)の2種類を出力できるようになってますが、二酸化炭素濃度値しかいらないので、コメントアウトしてます。
これをArduinoIDEでArduinoに流し込んでおきます。
一方、Raspberry Pi側には、以下のコードを入れます。
co2sens_ar.py
import serial
import datetime
ser = serial.Serial('/dev/ttyACM0', 115200)
date_file = datetime.datetime.now()
while True:
with open("/home/pi/co2_{0:%Y%m%d%H%M%S}.csv".format(date_file),"a") as f:
now = datetime.datetime.now()
String_data = ser.readline().decode('utf-8').rstrip()
print(now," , ",String_data)
print(now," , ",String_data, file=f)
f.flush()
ser.close()
シリアルポート(USB)から値を読むだけなので、簡単なコードです。
なお、二酸化炭素濃度値の前に日付・時刻をつけるようにしてます。
これを使う前に、「pip3 install pyserial」を実行しておいてください。
あとはRaspberry PiのUSBにArduinoを接続し、上の「co2sens_ar.py」を実行します。
> python3 co2sens_ar.py
すると、以下のようにターミナル上に日付と二酸化炭素濃度が表示されるはずです。
※上はWindowsのTeraterm上
なお、このセンサーの下限値は400ppmだそうです。つまり、400ppm以下は測定不可。
実はこれを一晩ほど動かしてみましたが。
新室内の二酸化炭素濃度が2260ほどまで上昇。
えっ!?ちょっと待って、これほんと!?
ちなみに、労働衛生上の基準値は1000ppm以下です。これを倍ほど上回る値をたたき出してます。
が、ここで外からRaspberry Piにアクセスできなくなってしまったため、一旦、Raspberry Piを再起動して、もう一度値を取り直してみたら……
なぜかですね……400ppmからスタートしました。
それから何度かプログラムを起動してみたんですが、どうやらこれRaspberry PiのコードがArduinoにシリアル接続するたびに「400ppm」からスタートしてるみたいです。
ううん、なんか怪しいなぁ……
でも、息を吹きかけると一時的に1000ppm程度まで上昇し、その後は下がるという挙動を示すため、確かに二酸化炭素の濃度を即手はしているような気がします。
プログラムコードを読むと、Arduino側はシリアル接続したときに値を出力している節があります。つまり、シリアル接続するまではLEDがちかちかしているものの、値を取得していなさそう……ていう理解で、いいのかな?
まあ、ともかく、換気の目安として使えるかどうかが問題。二酸化炭素濃度を正確に測定することは、今回の狙いではないので。
ということで一度、部屋を閉め切ってしばらく二酸化炭素濃度を上昇させたのちに、部屋の窓を開けて一気に換気して、値がどう動くかを調べてみました。
1時間ほど寝そべって過ごした後、こんな勢いで部屋の窓を開けました。ちょっと雨が降り気味な日でしたが、構わず開けてます。
で、その時のグラフが以下。
ちょうどかくっと下がっているところがありますが、そこが換気した時間。
一気に二酸化炭素濃度は400程度まで下がるんですが……なぜかですね、2度ほど900ppmまで上昇しました。
何なのでしょう?ノイズでしょうか、それとも私の息でも降りかかったのか、あるいは外の排気ガスか何かでも拾ったんでしょうか……?
なんだかこのセンサー、ちょっと怪しい。
と思ったら、スイッチサイエンスのこんな記事を発見。
空気品質を測定し、記録する - AmbientでIoTをはじめよう
これを読むと、どうやらCSS811ってセンサーは、エージング(慣らし運転)というのをやらないといけない。
おまけに最初の20分は不安定らしいので、開始から20分の値はあてにしちゃだめだということのようです。
なんてこった……ということで、まず48時間のエージングというのを実施。
あまり意味はないですが、その48時間(正確には48時間と28分)の変化をグラフ化してみると、こんな感じに。
※ データが多すぎるので、ここだけGoogleスプレッドシートを使ってます
分かりにくいですが、最大6000ppm近くまで上昇してます。
労働安全衛生法での事務所の基準値は5000ppm以下(空調設備により調整可能ならば、1000ppm以下)とされているので、それを上回る値が出てますが……ただ、その時間が昼間の15時半ごろで、これを設置した部屋には誰もいないはずの時間。ちょっと怪しいです。
まあ、ともかく48時間のエージングを終えたので、測定を再開してみた。
30分ほど経過し、安定しているはずの時間での値は、大体600くらいになりました。
で、そのまま一晩動かした結果
こんな感じです。安定してますね。
ただ、逆に言うと安定しすぎ。
部屋を閉め切っているので、もうちょっと濃度が上昇してもおかしくはないかなぁと思うのですが。
とまあ、信用してよいのか悪いのか、よく分からないセンサーですね。
しばらく、様子見です。
最近のコメント