相変わらずのテレワーク・自粛生活が続いていますが、そのおかげか花粉症の症状が例年より軽くて助かっています。FMラジオの基板が届くまでしばらく時間がかかるので別の工作に手を出しました。
「密」の見える化で話題になったCO2センサです。秋月で取り扱いが始まっていたMH-Z19CというCO2センサを購入してみました(2,480円)。CO2濃度がPWMとUARTの2通りで出力されます。取り合えずSeeeduino XIAOとUARTで繋いで動かしてみました。TX,RXの2本の線で繋ぐだけです。あとは電源5VとGND。
CO2濃度は1,000ppm以下が望ましいようですが、部屋の中は丁度その位あって少し高めでした。グラフが下がっているのは、ドアを開けっぱなしにして部屋を出た様子。再び上昇しているのは部屋に戻ってきたからです。一人で居ても換気が必要なことが見えました。
以下、スケッチです。バグがあるかも知れません、無保証です。
//----------------------------------------------------------------
// '21.03.14 naka
// CO2センサー
//
// CO2 Sensor : MH-Z19C
// micro controler : Seeeduino XIAO (UART接続)
//----------------------------------------------------------------
#include<Wire.h>
void setup() {
Serial1.begin(9600); // TX(6),RX(7) <---> Co2 sensor MH-Z19C
Serial.begin(115200);
}
void loop() {
// Start,Reserved,Command, -, -, -, -, -, Checksum
byte Command[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
struct {
byte start;
byte command;
byte concentration_high;
byte concentration_low;
byte temp;
byte emp[3];
byte checksum;
} Return;
Serial1.write(Command, sizeof Command);
Serial1.readBytes((char *)&Return, 9);
if (Return.start!=0xff || Return.command!=0x86 ) {
return;
}
else {
byte checksum = getCheckSum((byte *)&Return);
if (Return.checksum!=checksum) {
return;
}
}
int ppm = Return.concentration_high*256 + Return.concentration_low;
// int temp = Return.temp - 40;
Serial.printf("%d\n",ppm);
delay(10000);
}
byte getCheckSum(byte *packet) {
byte i,checksum = 0;
for(i=1;i<8;i++) {
checksum += packet[i];
}
return (0xFF - checksum) + 1;
}
MH-Z19Cのデータシートには記載がなかったのですが、ネット情報だと温度も取れるようです。スケッチ内にコメントアウトして記載してあります。ただし、測定の補正用に使っているものらしく、高めにでるとのこと。確認したら確かに室温より少し高めでした。一応、動作確認できたので次は小型LCDを繋いで、数値表示とグラフ表示の切り替え機能を付けようかと思っています。

0 件のコメント:
コメントを投稿