以前、CO2モニタ2号機を作ったら、どうも動作が安定しないと思ったらMH-Z19Bがフェイク品だった際に、悲しみに打ちひしがれて(大げさな^^;)MH-Z19Cを購入してしまいました。今度は、製造元のWinsen社がAliExpressに直接出店していたので、そちらから購入しています。(2月19日から秋月電子でも取扱を始めています)
直接購入すると、20個は入りそうな専用の梱包箱に入って、検査成績書がついて届きました。もちろん購入したのは1個です。
おもわず感動しましたw。
3号機の作成
で、こんな感じで組んで、ようやく動かしてみました。
MH-Z19Cの端子バージョンのものは端子が2.54mmのグリッドにあっていないため、通常の2.54mmピッチのユニバーサル基板には載せられませんので、1.27mmピッチのユニバーサル基板に搭載しました。隙間が大きめですが、ここには後でI2Cのキャラクタ液晶でも搭載して(電源は外付けですが)スタンドアローンでも動作できるようにしようかと思っています。
制御用のマイコンは当初はESP32-DevKitっぽいボードで始めたのですが、途中で電源周りできちんと5Vを出すために四苦八苦しているうちにESP32-DevKitを壊してしまいました。ですので、Seeeduino Xiaoで作り直しています。
MH-Z19Cに供給する電源については、MH-Z19Cは電源が5V±0.1Vという厳しい条件を要求しますので、USBで直接給電するとこの範囲から容易に外れてしまいます。ですので、USBのBUS電圧を一旦DC-DCステップアップコンバータモジュールで8Vに昇圧してから三端子レギュレータTA48M05Fで5Vを生成しています。
MH-Z19Cからのデータの読出しはUARTで行っています。
ソフトウェアは以前作ったMH-Z19B用で動かしてみると、ライブラリでエラーが発生しました。ですので、今回は直接コマンドを送受信することにしました。
/*
CO2ガスモニタ
*/
const int ledPin = LED_BUILTIN; // ボード上のLED(PIN_LED_13)
#define BAUDRATE 9600 // MH-Z19との通信速度(変更不可)
uint16_t CO2;
int8_t DEG;
byte ReadCO2[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
byte SCalOn[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6};
byte SCalOff[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};
byte RetVal[9];
bool errorstat = false;
void error(bool s){
errorstat = s;
if(s){
digitalWrite(ledPin, LOW); // エラー発生、LED点灯
} else {
digitalWrite(ledPin, HIGH); // エラーなし、LED消灯
}
}
void setup() {
delay(1000);
Serial.begin(115200);
// 基板上のLED消灯(出力HIGH=消灯)
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
delay(2000);
Serial1.begin(BAUDRATE, SERIAL_8N1); // MH-Z19Cへのシリアルポート
Serial1.write(SCalOn,sizeof SCalOn);
// Serial1.write(SCalOff,sizeof SCalOff);
}
void loop() {
// CO2センサ処理
Serial1.write(ReadCO2,sizeof ReadCO2);
memset(RetVal,0x00,sizeof RetVal);
Serial1.readBytes((char *)RetVal, sizeof RetVal);
if(RetVal[0] == 0xff && RetVal[1] == 0x86){
CO2 = RetVal[2]*256 + RetVal[3];
DEG = RetVal[4]-40;
error(false);
} else {
error(true);
}
if(Serial && !errorstat){
//Serial.print(DEG);
//Serial.print(",");
Serial.println(CO2);
}
delay(3000);
}
これで、MH-Z19Cからデータを読み出してCO2濃度を出力します。Arduino IDEのシリアルプロッタ機能を使えば、時系列での変化もグラフで見ることができます。
動作させるとかなり大きめの値が出ます。MH-Z19Bのときも同じでしたが、キャリブレーションが必要なようです。風通しのいいところで24時間動かせば多分収束すると思うのですが、今回は1時間ほど窓を開けておいて(寒い!)、センサのHd端子をGNDに落として初期のキャリブレーションを行いました。たぶん、400ppmよりはかなり悪い条件だとは思いますが、オートキャリブレーションをONにしているので、そのうち落ち着くだろう、という発想です。
実際にシリアルプロッタ機能で表示させてみたものです。途中、大きく跳ね上がっているのは、MH-Z19Cに息を吹きかけた際のものです。呼気の中のCO2に反応して大きく跳ね上がっているのがわかります。