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ディスプレイに表示 |
コメント
コメントを投稿