Makato-kanのアイコン画像

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

Makato-kan 2021年02月11日に作成  (2021年03月24日に更新)

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

目的:

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

部品表:

  • 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にしたい。

ログインしてコメントを投稿する