Makato-kanのアイコン画像
Makato-kan 2021年02月11日作成 (2022年02月10日更新)
製作品 製作品 閲覧数 2690
Makato-kan 2021年02月11日作成 (2022年02月10日更新) 製作品 製作品 閲覧数 2690

Seeeduino XIAOを使って二酸化炭素測定する SparkFunライブラリVer

キャプションを入力できます

目的:

室内で石油ファンヒーター使います。冬になると部屋にいるだけで眠くなるので、多分そうだろうと思っていますが二酸化炭素濃度を測定してみたかったんです。

部品表:

  • Seeeduino XIAO 小さなマイコンです。
  • Aosong DHT11 格安の温度湿度センサーです
  • CCS811 ガスセンサーです色々な基板があるようです。
  • 0.96インチOLED 表示器ですコントローラーにSSD1306使っているとあれば多分大丈夫
  • ブレッドボード
  • 10kΩ抵抗 DHT11プルアップ用抵抗です
  • モバイルバッテリー 5v出力 できればスリープしないバッテリーが良いです。
  • 接続用ワイヤ いっぱい

概要:

CCS811を使ってeCO2 温度 湿度を測定し、OLEDに表示します。
 USBをパソコンに接続して シリアルモニターすればCSV形式で測定結果を受信できます
 CCS811は起動後安定するまで20分かかるのでカウントダウン表示も付いています。
 DHT 11は 温度・湿度測定と CCS811の補正用に使用しています。
 XIAOにarduinoIDEを使ってプログラム送信します。

接続:

1,OLED、CCS811はI2C 接続する
2,CCS811のnINT を1番 nWAKEを2番に接続する
3,DHT11のデータを3番に接続する
4,10kΩは DHT11のプルアップ用なのでDHT11のデータとVCCに接続します
 ※CCS811、DHT11、OLEDの電源はXAIOの3.3vからとりました。
 ※I2Cのプルアップ抵抗をつけておりませんが、使われるセンサーによってはプルアップ抵抗が必要な場合あります、自分の場合はつけなくても動作したので結果オーライとしています。(多分いずれかのセンサー基板にプルアップ抵抗ついていたのでしょう)

キャプションを入力できます

注意:

消費電流は0.05A程度なのでスリープ機能のあるモバイルバッテリーでは 電源が入らないまたは途中で電源OFFしてしまう事あります。
 CCS811 DHT11いずれも 早いタイミングで読み取り苦手なセンサーみたいなので 5秒に一回読むようにしています。
 DHT11の測定誤差は、高額のセンサーよりは多めです
 CCS811のライブラリとしてSparkFunのものを使用しました。
 CCS811のアドレスは0x5Aを使っていますが、使用される基板によっては0x5Bの場合もあるようです。
 プログラムの作法を全く勉強した事がないので色々変な部分あると思いますがコンパイルエラーが出なかったので良しとしています

arduinoIDEの設定:
 XIAOは環境設定から 追加するボードマネージャに
"https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json"を追加して
ArduinoIDEを再起動してから
 ツール→ボード→ボードマネージャを起動して 
  XIAOと検索して"Seeed SAMD Boards"Ver1.8.1をインストールします。

以下の部品はツールからライブラリを管理を選びライブラリマネージャを起動し
 CCS811は CCS811で検索して" Spark_Fun CCS811 Arduino Library"Ver2.0.1
 DHT 11は DHT11で検索して"DHT sensor library" 1.4.1 byAdafrult
 OLEDは SSD1306で検索して"ACROBOTIC SSD1306"Ver1.0.1
 をそれぞれインストールします。

#include "DHT.h" #include <Wire.h> #include <ACROBOTIC_SSD1306.h> #include "SparkFunCCS811.h" #define nINT 1 //CCS811 nINT #define nWAKE 2 //CCS811 nWAKE #define DHTPIN 3 #define DHTTYPE DHT11 #define CCS811_ADDR 0x5A DHT dht(DHTPIN, DHTTYPE); CCS811 myCCS811(CCS811_ADDR); int base=1; int down=1; int countdown=20; void setup() { Serial.begin(1200); Serial.print(""); delay(2000); Serial.println("CCS811 Basic Example"); pinMode(nWAKE,OUTPUT); Wire.begin(); oled.init(); // Initialze SSD1306 OLED display oled.clearDisplay(); // Clear screen oled.setTextXY(3,3); // Set cursor position, start of line 0 oled.putString("Hello, World"); delay(1000); dht.begin(); oled.clearDisplay(); oled.setTextXY(0,0); oled.putString("Temp"); oled.setTextXY(0,11); oled.putString("xxxxC"); oled.setTextXY(2,0); oled.putString("Humi"); oled.setTextXY(2,13); oled.putString("xx%"); //CCS811 CO2 status oled.setTextXY(4,0); oled.putString("CO2"); oled.setTextXY(4,9); oled.putString("xxxxppm"); oled.setTextXY(6,0); oled.putString("Heat Index"); oled.setTextXY(6,14); oled.putString("xx"); delay(4000); digitalWrite(nWAKE,LOW); delay(1000); //This begins the CCS811 sensor and prints error status of .beginWithStatus() CCS811Core::CCS811_Status_e returnCode = myCCS811.beginWithStatus(); //myCCS811.setDriveMode(1); Serial.print("CCS811 begin exited with: "); Serial.println(myCCS811.statusString(returnCode)); digitalWrite(nWAKE,HIGH); unsigned char brightness = 5; oled.setBrightness((unsigned char)brightness); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)) { oled.setTextXY(7,0); oled.putString("Status : NG"); return; }else { //Counter check and countdown 20min base=base+1; if(base>12) { base=1; } else { down=base/12; countdown=countdown-down; if(countdown<1){ oled.setTextXY(7,0); oled.putString(" "); }else{ oled.setTextXY(7,0); oled.putString("Wait"); oled.setTextXY(7,6); char strMIN[2]; sprintf(strMIN,"%2d",int(countdown)); delay(10); oled.putString(String(strMIN)); oled.setTextXY(7,8); oled.putString("min"); } } } float hic = dht.computeHeatIndex(t, h, false); //Display Temp oled.setTextXY(0,10); oled.putString(" "); delay(10); oled.setTextXY(0,10); oled.putFloat(float(t)); //Display Hume oled.setTextXY(2,11); oled.putString(" "); delay(10); oled.putNumber(int(h)); //Display Heat Index oled.setTextXY(6,14); char strHIC[2]; sprintf(strHIC,"%2d",int(hic)); delay(10); oled.putString(String(strHIC)); delay(10); //CSS811 data check and Humi Temp data set if(digitalRead(nINT) == LOW) { digitalWrite(nWAKE, LOW); delay(10); myCCS811.setEnvironmentalData(h,t); delay(10); // if (myCCS811.dataAvailable()) // { myCCS811.readAlgorithmResults(); //SerialOUT Temp Hume CO2 TVOC Serial.print(float(t)); Serial.print(","); Serial.print(int(h)); Serial.print(","); //Returns calculated CO2 reading Serial.print(myCCS811.getCO2()); Serial.print(","); //Returns calculated TVOC reading Serial.print(myCCS811.getTVOC()); Serial.println(""); //Display CO2 oled.setTextXY(4,9); oled.putString(" "); delay(10); oled.setTextXY(4,9); char strCO2[4]; sprintf(strCO2,"%4d",myCCS811.getCO2()); delay(10); oled.putString(String(strCO2)); oled.setTextXY(4,13); delay(10); oled.putString("ppm"); digitalWrite(nWAKE,HIGH); delay(5000); }

プログラムの説明:

setup迄の過程で ライブラリの読み込み ピンの設定 輝度の設定をしています
 loopで 温度湿度の読み取り OLEDに表示
 CCS811に温度湿度補正値を送り 計測値の取り出し OLEDへの表示をしています。
 最後に5秒スリープして 繰り返しします

バージョンアップ
そのうちやりたい事
 二酸化炭素濃度が1000ppm超えたら リレー接点をONにしたい。

2022-2-10 追記:
 この記事をアップして1年経ってしまいましたが、いまだ
 リレー接点をONにするプログラム作っていませんでした。
 部材は購入済みだったりするんですが、、、

今更ですが 使用するライブラリの違いがあるか確かめたかったので違うライブラリを
 使って測定した記事も書いていました。
 Seeeduino XIAOを使って二酸化炭素測定する AdafroutsライブラリVerです。

Makato-kanのアイコン画像
屋外で温度湿度を測定し記録するので、壊れやすいと思い大量にDHT11とESP-WROOM-02を購入したのですが思いのほか壊れなかったので、何にでもDHT11をくっつけています。
ログインしてコメントを投稿する