アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

CO2 センサー S300 で Arduino と i2c 通信を行う

ELT SENSOR というところが売っている CO2 センサーの一種で S300 というものがある。

eltsensor.co.kr

これを Arduino と i2c で通信するためのコードを書いた。
データシートを読むと Slave のアドレスが 0x31だと分かる。それと、周期を 3 秒おき(ランプの点滅も 3 秒おき)にしてあげることがポイント。

苦戦した事として、中華製の Arduino nano 互換を使って i2c を行った場合、S300 のランプが 1 秒おきに点滅しており、デフォルト値である 500 しかさなかったため、コードが間違ってるのか、配線が間違っているのかすごく悩んだ。結局 Arduino uno に切り替えて解決。

ちなみに Arduino nano の i2c 関連の pin は

SCL → A5
SDA → A4

コードでもわからないことがあればコメント大歓迎です。

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);
}

void loop() {
  Serial.print(getCO2ppm());
  Serial.println(" ppm");
  delay(3000);
}

long getCO2ppm() {
  byte tmpBuf[7];
  sendCommand('R');

  Wire.requestFrom(0x31, 7);
  
  for (int i = 0; Wire.available(); i++) {
    tmpBuf[i] = Wire.read();
    delay(1);
  }

  if (tmpBuf[0] != 0x08 ||
      tmpBuf[3] == 0xff ||
      tmpBuf[4] == 0xff ||
      tmpBuf[5] == 0xff ||
      tmpBuf[6] == 0xff) {
        return 0;
  }
      
  return (tmpBuf[1] << 8) | tmpBuf[2];
}

void sendCommand(byte val) {
  Wire.beginTransmission(0x31);
  Wire.write(val);
  Wire.endTransmission();
}

void sleep() {
  sendCommand('S');
  delay(4000);
}

void wakeup() {
  sendCommand('W');
  delay(6000);
}