ELT SENSOR というところが売っている CO2 センサーの一種で S300 というものがある。
これを 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); }