masayasanのアイコン画像

二酸化炭素濃度検出器

masayasan 2021年02月21日に作成  (2021年03月13日に更新)

制作概要

防音室内の二酸化炭素濃度を検出して、喚起を促す装置を製作しました。

使用部品
・KEYESTUDIO KS0457 (5V駆動) SEN-CCS811搭載
・3mm LED
・抵抗器
・スイッチなど

回路図

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

コード

#include <CCS811.h>

#define LED1 4
#define LED2 3
#define LED3 2
#define LED4 5
#define LEDcheck 10

int CO2Valu = 0;
int SETValu = 1500;//1500ppmで点灯開始

/*
   IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
*/
//CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
CCS811 sensor;

void setup(void)
{
  Serial.begin(115200);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

  pinMode(LEDcheck, INPUT_PULLUP);


  /*Wait for the chip to be initialized completely, and then exit*/
  while (sensor.begin() != 0) {
    Serial.println("failed to init chip, please check if the chip connection is fine");
    delay(1000);
  }
  /**
     @brief Set measurement cycle
     @param cycle:in typedef enum{
                      eClosed,      //Idle (Measurements are disabled in this mode)
                      eCycle_1s,    //Constant power mode, IAQ measurement every second
                      eCycle_10s,   //Pulse heating mode IAQ measurement every 10 seconds
                      eCycle_60s,   //Low power pulse heating mode IAQ measurement every 60 seconds
                      eCycle_250ms  //Constant power mode, sensor measurement every 250ms
                      }eCycle_t;
  */
  sensor.setMeasCycle(sensor.eCycle_250ms);
}
void loop() {
  delay(1000);
  if (sensor.checkDataReady() == true) {
    Serial.print("CO2: ");
    Serial.print(sensor.getCO2PPM());
    Serial.print("ppm, TVOC: ");
    Serial.print(sensor.getTVOCPPB());
    Serial.println("ppb");

    CO2Valu = sensor.getCO2PPM();

    if (CO2Valu >= SETValu  && CO2Valu < SETValu + 500) {
      digitalWrite(LED1, HIGH);
    }
    else if (CO2Valu >= SETValu + 500 && CO2Valu < SETValu + 1000) {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
    }
    else if (CO2Valu >= SETValu + 1000 && CO2Valu < SETValu + 1500) {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
    }
    else if (CO2Valu >= SETValu + 1500) {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
    }
    delay(500);
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);

    while (digitalRead(LEDcheck) == 0) {
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
    }
  } else {
    Serial.println("Data is not ready!");
  }


  /*!
     @brief Set baseline
     @param get from getBaseline.ino
  */
  sensor.writeBaseLine(0x847B);
  //delay cannot be less than measurement cycle
  //delay(1000);
}

製作品

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

センサーはCO2検出する為、Arduinoはハードリセットする為に基盤剥き出しにしてます。
KEYESTUDIOのKS0457ですが、どうもセンサーが暴走することがあるので、異常時はArduino側でハードリセットする様にします。
異常時はINT出力がOFFになる様なので、LEDを繋げてセンサー異常を知らせるようにしてます。

まとめ

比較対象がないのでセンサーの検出精度はどの程度か分かりませんが、密室でLEDランプが点灯していくのは面白いです。
定期的な喚起は習慣付けておくべきですが、視覚的に室内の状態が分かるのは良いですね。

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