MH-Z19Cをとりあえず動かしてみた

以前、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に反応して大きく跳ね上がっているのがわかります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)