CO2測定のセンサとして、CCS811も買ってあったので、そちらを動かしてみます。CCS811はTVOCという値も測定できるのですが、代わりにCO2の濃度がCO2自体ではなく、eCO2という代替値になります。
CCS811は温度と湿度を補正用のパラメータとして設定してやる必要がありますので、そのためのセンサーも必要になります。湿度まで取るのが大変、という場合には、サーミスタを接続して温度を取得することはできそう。それすらケチりたい、という場合には、温度も湿度も決め打ちで動かすことになります。
今回、CCS811を取り付けた基板は、BME280を搭載可能なオリジナルのESP8266ボード(回路図)で、CCS811に必要になるnWAKEとnINTはそれぞれ、GPIO15とGPIO14に割り振ってあります。(まあ、実際のところは追加の2本は必要なかったようで)
で、ソフトウェアの方は、やはりBME280のデータをMQTTで送信するArduino環境のソースを改造して使用します。ただし、CCS811は継続的に動作させないといけないようなので、DeepSleepは使用しません。また、CCS811の方はライブラリとして、AdafruitのCCS811のライブラリを使用させてもらいました。
そんなこんなで、
#include "Adafruit_CCS811.h"
(中略)
//----------------------------------------------
Adafruit_CCS811 ccs811;
uint16_t ccs811co2;
uint16_t ccs811tvoc;
void CCS811_setup(){
Serial.println("CCS811 start");
if (!ccs811.begin()) {
Serial.println("CCS811 Initialization failed.");
delay(1); // avoid WDT Reset
while (1);
}
//wait for ccs811 to be available
while(!ccs811.available()){
delay(1); // avoid WDT Reset
}
Serial.println("CCS811 started.");
}
void CCS811_loop(bool dbg){
if(dbg) Serial.println("CCS811: Set environment.");
ccs811.setEnvironmentalData(humidity, temperature);
//wait for ccs811 reading
if(dbg) Serial.println("CCS811: Start to measure.");
while(ccs811.readData()){
delay(1); // avoid WDT Reset
}
if(dbg) Serial.println("CCS811: Finish to measure.");
ccs811co2 = ccs811.geteCO2();
ccs811tvoc = ccs811.getTVOC();
if(dbg) Serial.println("CCS811: Read data.");
Serial.print("CO2 concentration : ");
Serial.print(ccs811co2);
Serial.println(" ppm");
Serial.print("TVOC concentration : ");
Serial.print(ccs811tvoc);
Serial.println(" ppb");
}
といった感じでコードを追加しました。CCS811から応答が返ってくるまでは結構時間がかかるようですので、ループで待っている箇所については delay(1) を入れて、ウォッチドッグリセットがかかるのを防止しています。あと、デバッグメッセージがたくさん入っていますが、意外に動かすのに苦労した跡です(笑)。
あ、あと、AdafruitのCCSライブラリのbegin()の中に、
setDriveMode(CCS811_DRIVE_MODE_10SEC);
というような箇所があります。初期値は1SECなのですが、これだとCCS811の寿命が長くなさそうなので、10SECに変更しています。実際の運用では60SECでもいいかもしれません。
これで、Arduino上のシリアルモニタには以下のような計測結果が出るようになりました。
BME280: Start to measure.
BME280: Finish to measure.
BME280: Read data.
Temperature : 30.96 degree
Humidity : 43.99 percent
Pressure : 1010.36 hPa
CCS811: Set environment.
CCS811: Start to measure.
CCS811: Finish to measure.
CCS811: Read data.
CO2 concentration : 445 ppm
TVOC concentration : 6 ppb