M5STICK-CでCO2測定


M5STICKからM5STICK-Cに進化した部分で、ボタンが1つ増えたのと、GROVE以外に、接続できる端子が付加されたところなのかな?と思っています。
増えた端子を使って、I2C接続のセンサーを繋いでみます。
手元の部品箱から出てきたCO2センサーであるCSS811ブレイクボード(SparkFun Air Quality Breakout – CCS811)を使って、お部屋の二酸化炭素の濃度を測定して、M5STICK-Cのディスプレイに出力してみたいと思います。

CSS811ブレークボードとM5STICK-Cの接続は、下記の写真を参照ください。

M5STICK-Cの接続(SDAが黄色G0,SCLがオレンジG26)

ソースコード

SparkFun CS811のライブラリを利用してサクサクと!

// M5STICK-Cで、CCS811のセンサーの値を取得する
// Programed by Kazuyuki Eguchi

#include <M5StickC.h>
#include <Wire.h>
#include "SparkFunCCS811.h"

#define CCS811_ADDR 0x5B //Default I2C Address

CCS811 myCCS811(CCS811_ADDR);

void setup() {
  M5.begin();
  M5.Axp.ScreenBreath(9); // バックライトの明るさ(7-15)
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.setCursor(0, 0);
  
  Wire.begin(0,26);  // SCL-0,SDA-26

  CCS811Core::status returnCode = myCCS811.begin();
  if (returnCode != CCS811Core::SENSOR_SUCCESS) {
    Serial.println(".begin() returned with an error.");
    while (1);
  }
}

void loop() {
  if (myCCS811.dataAvailable()) {
    myCCS811.readAlgorithmResults();
    uint16_t co2 = myCCS811.getCO2();
    uint16_t tvoc = myCCS811.getTVOC();

    unsigned long sec = millis() / 1000;

    M5.Lcd.fillScreen(TFT_BLACK);
    
    if(sec >= 1200) {
      M5.Lcd.setTextColor(TFT_YELLOW);
    } else {
      M5.Lcd.setTextColor(TFT_BLUE);
    }

    M5.Lcd.setCursor(0, 0);
    M5.Lcd.print("Co2= ");
    M5.Lcd.print(co2);
    M5.Lcd.println(" ppm");

    M5.Lcd.print("TVOC= ");
    M5.Lcd.print(tvoc);
    M5.Lcd.println(" ppb");
    
    M5.Lcd.print("Time= ");
    M5.Lcd.print(sec);
    M5.Lcd.println(" sec");

    Serial.print("CO2[");
    Serial.print(co2);
    Serial.print("]ppm , tVOC[");
    Serial.print(tvoc);
    Serial.print("]ppb , Timec[");
    Serial.print(sec);
    Serial.println("]sec");
  }

  delay(10);
}

動作イメージ

センサーであるCS811は、20分経過しないと、まともな値を出力しないことになっているので、測定時間が1200秒を超えたのか?を文字の色でわかるようにしました。

測定時間が1200秒以内なので、青文字表示
測定時間が1200秒超えると、黄色でパラメータを表示します。

以上、ご参考までに