Arduino nano + CCS811で二酸化炭素濃度を測定する
目次
はじめに
今回は、Arduino nano に CCS811(空気品質センサー) を接続し、部屋の二酸化炭素濃度を測定してみます。
使用したパーツ
- Arduino Nano:COODENKEY Mini ATmega328P Nano V3.0 互換 マイクロコントローラーボード1
Arduino Nano V3.0互換機
- ディスプレイモジュール: OLED 1.3 インチ 7 Pin SPI SH11062
1.3インチOLEDディスプレイ
- 空気品質センサ:CJMCU-8113
CCS811ガスセンサー
(補足)CCS811 センサー、CJMCU-811 について
http://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/CCS811/CCS811_test.html の情報を読むと、CCS811 センサーは Cambridge CMOS Sensors Ltd という会社が開発したものと思われます。同社の Web サイトとして、www.ccmoss.comという記載もありますが、現在このURLにアクセスしてもWebサイトが表示されません。
一方、CCS811 センサーについてはScioSense の商品紹介ページに詳細に情報がでていました。 このページの[Dashboard Software]のリンクをクリックすると https://downloads.sciosense.com/ccs811/ のページが表示されます。そこには、C++用ドライバーがsciosense の Github リポジトリにMIT ライセンスとして公開されていることが記述されていました。
接続準備
ピンヘッダのハンダ付け
先の機材を購入すると OLED ディスプレイモジュールを除き、Pin ヘッダーが同封されてきます。 今回、ブレッドボードを使って配線しますので、Pin ヘッダーをハンダ付けします。
- Arduino Nano 互換ボードに Pin ヘッダーをハンダ付け
互換ボード(横から)w/ピンヘッダ
互換ボード(下から) w/ピンヘッダ
- CJMCU-811(CCS811 センサー)に Pin ヘッダーをハンダ付け
CJMCU-811(横から) w/ピンヘッダ
CJMCU-811(下から) w/ピンヘッダ
配線
ハンダ付けした Pin ヘッダーをブレッドボードに差し、下記のように配線します。配線検討図
- Arduino Nano - SH1103 間
- 5V - VDO
- GND - GND
- D8 - RES
- D9 - DC
- D10 - CS
- D11 - SDA
- D13 - SCK
- Arduino Nano - CJMCU-811 間
- 5V - VCC
- GND - GND
- GND - WAK(WAK を GND に接続しないと動作せず)
- A3 - SCL
- A4 - SDA
実際に配線したものを下記に掲載します。実際の配線(5VとGNDは上側に持っていきました)
eCO2 値の取得
利用する CCS811 センサー用ライブラリ
今回 AliExpress で購入した CJMCU-811 は使用するライブラリーに関する情報が提供されていませんでした。そこで、Google 検索をして、CCS811 センサーを扱うライブラリーとして MIT ライセンスで公開されている SparkFun CCS811 Arduino Library4 を使用することにしました。
実装例を用い eCO2 値が取得できるか確認する
同 GitHub リポジトリには Arduino で CCS811 のセンサー値を読み取り、シリアル通信でその値を確認できる実装例:Example1_BasicReadings.ino が公開されています。 そこで、まずこの実装例を利用し、今回利用する Arduino Nano + CJMCU-811 で動作するように変更しました。
尚、実装例のコメントに下記が記載されていました。実際に 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 ドライバー
今回購入した AliExpress で購入した SH1106 OLED ディスプレイについても、ライブラリーに関する情報が提供されていませんでした。 そこで、こちらも Google 検索したところ、Arduino-er の Hello World 1.3 inch IIC/SPI 128x64 OLED x Arduino, using u8glib library という記事 で u8glib ライブラリを使用した解説がされていました。 u8glib は BSD ライセンスでhttps://github.com/olikraus/u8glib にて公開されていますが、既に開発は止まっているようです。 u8g2 ライブラリの開発へ移行しているのでそちらを使うようにとの記載がありますが、今回は u8glib を使いました。
u8glib の GitHub リポジトリには使い方の説明もドキュメント化されていますので、https://github.com/olikraus/u8glib/wiki/thelloworld を参考に、先ほどの CCS811 のコードに実装を追加しました。
尚、20 分間の暖気が必要ということで、起動後 20 分間は OLED の 1 行目の表示を
“= CO2 Monitor *=”
としています。20 分経過後すると、
“= CO2 Monitor =”
と表示するようにしています。
実行結果
上記コードを Arduino IDE に張り付け、コンパイルエラー等発生しないことを「検証・コンパイル」で確認し、「マイコンボードに書き込む」を実行しました。
その結果、下記のように SH1106 OLED ディスプレイに eCO2 値が表示されました。CCS811センサー値をSH1106 OLEDディスプレイに表示
最後に
二酸化炭素濃度を測定できる MH-Z19B と CCS811 が入手できましたので、どこかでこれらの比較ができるとよいですね。