Arduino Nano に CCS811(空気品質センサー) を接続し、部屋の二酸化炭素濃度を測定する #2/2
eCO2値の取得
利用するCCS811センサー用ライブラリ
今回購入したAliExpressで購入したCJMCU-811については、ライブラリーに関する情報が提供されていませんでした。そこで、Google検索をして、CCS811センサーを扱うライブラリーとしてMITライセンスで公開されているSparkFun CCS811 Arduino Library *5 を使用することにしました。
*5 参照URL https://github.com/sparkfun/SparkFun_CCS811_Arduino_Library
実装例を用いeCO2値が取得できるか確認する
同GitHubリポジトリにはArduinoでCCS811のセンサー値を読み取り、シリアル通信でその値を確認できる実装例:Example1_BasicReadings.ino が公開されています。そこで、まずこの実装例を利用し、今回利用するArduino Nano+CJMCU-811で動作するように変更しました。
尚、実装例のコメントに下記が記載されていました。
A new sensor requires at 48-burn in. - 新しいセンサーは48時間の「慣らし」が必要。
Once burned in a sensor requires 20 minutes of run in before readings are considered good. - 一度慣らしを終えたセンサーは、良好な値を得るため使用前に20分間の暖気が必要。
#include <wire.h>
#include "SparkFunCCS811.h" //Click here to get the library: http://librarymanager/All#SparkFun_CCS811
//#define CCS811_ADDR 0x5B //Default I2C Address
#define CCS811_ADDR 0x5A //Alternate I2C Address
CCS811 mySensor(CCS811_ADDR);
void setup()
{
Serial.begin(115200);
Serial.println("CCS811 Basic Example");
Wire.begin(); //Inialize I2C Hardware
if (mySensor.begin() == false)
{
Serial.print("CCS811 error. Please check wiring. Freezing...");
while (1)
;
}
}
void loop()
{
//Check to see if data is ready with .dataAvailable()
if (mySensor.dataAvailable())
{
//If so, have the sensor read and calculate the results.
//Get them later
mySensor.readAlgorithmResults();
Serial.print("CO2[");
//Returns calculated CO2 reading
Serial.print(mySensor.getCO2());
Serial.print("] tVOC[");
//Returns calculated TVOC reading
Serial.print(mySensor.getTVOC());
Serial.print("] millis[");
//Display the time since program start
Serial.print(millis());
Serial.print("]");
Serial.println();
}
delay(10); //Don't spam the I2C bus
}
尚、実装例のコメントに下記が記載されていましたので、CCS811を使用するには注意が必要です。
- A new sensor requires at 48-burn in. - 新しいセンサーは48時間の「慣らし」が必要。
- Once burned in a sensor requires 20 minutes of run in before readings are considered good. - 一度慣らしを終えたセンサーは、良好な値を得るため使用前に20分間の暖気が必要。
実行結果
上記コードをArduino IDEに張り付け、コンパイルエラー等発生しないことを「検証・コンパイル」で確認し、「マイコンボードに書き込む」を実行しました。
その後、シリアルポートの出力を確認すると、下記のようになり、無事CCS811センサーよりeCO2値を取得できていることが確認できました。
12:26:56.013 -> CCS811 Basic Example 12:27:00.012 -> CO2[400] tVOC[0] millis[3997] 12:27:01.008 -> CO2[400] tVOC[0] millis[4994] 12:27:02.009 -> CO2[400] tVOC[0] millis[5989] 12:27:03.012 -> CO2[400] tVOC[0] millis[6975] 12:27:04.011 -> CO2[400] tVOC[0] millis[7970] 12:27:04.965 -> CO2[400] tVOC[0] millis[8967] 12:27:05.968 -> CO2[400] tVOC[0] millis[9962] 12:27:06.971 -> CO2[400] tVOC[0] millis[10958] 12:27:07.969 -> CO2[400] tVOC[0] millis[11943] 12:27:08.968 -> CO2[400] tVOC[0] millis[12940] 12:27:09.970 -> CO2[400] tVOC[0] millis[13936]
SH1106 OLEDへの表示
利用するSH1106ドライバー
#include <wire.h>
#include <u8glib.h> // https://github.com/olikraus/u8glib
#include <sparkfunccs811.h> //Click here to get the library: http://librarymanager/All#SparkFun_CCS811
// CCS811 sensor
//#define CCS811_ADDR 0x5B //Default I2C Address
#define CCS811_ADDR 0x5A //Alternate I2C Address
#define WARMUP_TIME 1200000ul // センサーウォームアップ時間 20min*60s*1000msec
CCS811 mySensor(CCS811_ADDR);
//OLEDモニタ使用のワイヤ定義
U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9, 8);
#define UPDATE_INTERVAL 1000ul // 表示更新間隔 1s*1000msec
unsigned long previous_time = 0ul;
void setup()
{
Serial.begin(115200);
Serial.println("CCS811 Basic Example");
Wire.begin(); //Inialize I2C Hardware
if (mySensor.begin() == false)
{
Serial.print("CCS811 error. Please check wiring. Freezing...");
while (1)
;
}
}
//画面表示
void draw(void) {
//1列目:CO2 Meter
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(2,14);
if (millis() <= WARMUP_TIME) { // センサWARM UP中
u8g.print("= CO2 Monitor *=");
}
else {
u8g.print("= CO2 Monitor =");
}
//2列目:二酸化炭素PPM実数表示
u8g.setPrintPos(2,28);
u8g.print("CO2:");
u8g.print(mySensor.getCO2());
u8g.print(" ppm");
//3列目:総揮発性有機化合物PPB実数表示
u8g.setPrintPos(2,42);
u8g.print("TVOC:");
u8g.print(mySensor.getTVOC());
u8g.print(" ppb");
}
void loop()
{
//Check to see if data is ready with .dataAvailable()
if (mySensor.dataAvailable())
{
//If so, have the sensor read and calculate the results.
//Get them later
mySensor.readAlgorithmResults();
// 表示更新間隔を過ぎていたらOLEDの表示を更新する
if (millis() - previous_time > UPDATE_INTERVAL) {
Serial.print("eCO2[");
//Returns calculated CO2 reading
Serial.print(mySensor.getCO2());
Serial.print("] tVOC[");
//Returns calculated TVOC reading
Serial.print(mySensor.getTVOC());
Serial.print("] millis[");
//Display the time since program start
Serial.print(millis());
Serial.print("]");
Serial.println();
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
}
delay(10); //Don't spam the I2C bus
}尚、20分間の暖気が必要ということで、起動後20分間はOLEDの1行目の表示を
= CO2 Monitor *=
としています。20分経過後すると、
= CO2 Monitor =
と表示されます。
実行結果
![]() |
| CCS811センサー値をSH1106 OLEDディスプレイに表示 |

コメント
コメントを投稿