Arduino MH-Z19 CO2センサー完成 

中国製のMH-Z19赤外線co2センサー用を$24で購入。
Arduinoで測定できるようにした。

MH-Z19にはPWMとUARTの信号端子がある。
定時観測のためにはArduinoとはUARTでのデータのやり取りが必要だが、センサーのTXD、RXD端子を、誤ってArduinoのTXD,RXDにそれぞれつないでいたため通信できず。。。
気がつくまでに1日もかかり、その結果動作プログラムの完成に2日間費やしてしまった。

以下必要な手順を記す:

1、SoftwareSerial Libraryを準備
ArduinoのSoftwareSerial でなく、AltSoftSerial Libraryを活用
SoftwareSerial Library
AltSoftSerial Library

Basic Usage

AltSoftSerial mySerial;
Create the AltSoftSerial object. Only one AltSoftSerial can be used, with the fixed pin assignments shown

above.mySerial.begin(baud);
Initialize the port to communicate at a specific baud rate.

mySerial.print(anything);
Print a number or text. This works the same as Serial.print().

mySerial.available();
Returns the number of bytes received, which can be read.

mySerial.read();
Reads the next byte from the port. If nothing has been received, -1 is returned.

Example Program

#include <AltSoftSerial.h>

AltSoftSerial altSerial;

void setup() {
  Serial.begin(9600);
  Serial.println("AltSoftSerial Test Begin");
  altSerial.begin(9600);
  altSerial.println("Hello World");
}

void loop() {
  char c;

  if (Serial.available()) {
    c = Serial.read();
    altSerial.print(c);
  }
  if (altSerial.available()) {
    c = altSerial.read();
    Serial.print(c);
  }
}
Board Transmit Pin Receive Pin Unusable PWM
Arduino Uno, Duemilanove,
LilyPad, Mini (& other ATMEGA328)
9 8 10

2、UART通信
下記のURLのProgramを参考に、UART通信のProgram作成
CO2センサーから9バイトデータを読み込み、データ計算
センサーのTXD,RXDは3.3V I/Fのため、RXDへの入力信号は、510Ωと1kΩの抵抗分割で、3.3VMAXにレベル降圧させる。

arduino-esp8266-mhz-19-serial/arduino-esp8266-mhz-19-serial.ino

mh-z19-co2-manual(ver1_0)

2017-10-09追加 mh-z19b-co2-ver1_0

sensor

3、UART通信のProgram:

// command to ask for data
byte cmd[9] = {0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
//char buff[9]; // for answer
byte buff[9]; // for answer

co2Serial.write(cmd, 9); //request PPM CO2

if (co2Serial.available())
{
for(n = 0; n<=8; n++) {
buff[n] = co2Serial.read();
delay(100);
}
}

for(n=0; n<=8; n++) {
Serial.print(“n=”);
Serial.print(n);

Serial.print(” DEC=”);
Serial.print(buff[n]);
Serial.print(” HEX=”);
Serial.println(buff[n],HEX);
}

if (buff[0] != 255)
{
Serial.println(“Wrong starting byte from co2 sensor!”);
}

if (buff[1] != 134)
{
Serial.println(“Wrong command from co2 sensor!”);
}

int ppm = 256 * buff[2] + buff[3];
Serial.print(“ppm=”);
Serial.println(ppm);
Serial.println(“ppm ————— “);

———————————————————

bme280_co2sensor_solar_panel_fujimi_%e3%83%96%e3%83%ac%e3%83%83%e3%83%89%e3%83%9c%e3%83%bc%e3%83%89

 

カテゴリー: Arduino, ソフト・ハードウェア パーマリンク

Arduino MH-Z19 CO2センサー完成  への1件のフィードバック

  1. miyagawa のコメント:

    esp8266でも測定できました。参考スケッチです。

    #include
    #define ESP8266_USE_SOFTWARE_SERIAL
    #define MH_Z19_RX D7 // conect to TX pin of MH-Z19
    #define MH_Z19_TX D6 // conect to RX pin of MH-Z19

    //SoftSerial co2Serial; // define MH-Z19
    SoftwareSerial co2Serial(MH_Z19_RX,MH_Z19_TX);

    /////////////////////////////////
    void setup() {
    Serial.begin(9600);
    while (!Serial) ;
    delay(1000);

    Serial.println(“Setup started”);
    unsigned long previousMillis = millis();
    co2Serial.begin(9600); //Init sensor MH-Z19(14)
    delay(1000);
    }

    //// parameters for CO2 sensor
    int i;
    int n ;
    int ppm;

    /////////////////////////////////////////////////
    void loop()
    {
    co2sensor_read();
    Serial.print(“ppm=”);
    Serial.println(ppm);
    Serial.println(“ppm ————— “);
    delay(5000);
    i++;
    }

    /////////////////////////////////////////////////
    void co2sensor_read()
    {
    for (i=1;i<=3;i++)
    {

    byte cmd[9] = {0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // command to ask for data
    //char buff[9]; // for answer
    byte buff[9]; // for answer

    co2Serial.write(cmd, 9); //request PPM CO2

    if (co2Serial.available()) {
    //buff[9] = co2Serial.read();
    //Serial.println(buff[9]);

    for(n = 0; n<=8; n++) {
    buff[n] = co2Serial.read();
    delay(100);
    }
    }

    for(n=0; n<=8; n++) {
    Serial.print("n=");
    Serial.print(n);

    Serial.print(" DEC=");
    Serial.print(buff[n]);
    Serial.print(" HEX=");
    Serial.println(buff[n],HEX);
    }

    if (buff[0] != 255)
    {
    Serial.println("Wrong starting byte from co2 sensor!");
    }

    if (buff[1] != 134)
    {
    Serial.println("Wrong command from co2 sensor!");
    }

    ppm = 256 * buff[2] + buff[3];
    // Serial.print("ppm=");
    // Serial.println(ppm);
    Serial.println("ppm ————— ");
    }
    delay(500);
    }

    センサーの取説も更新されていました。
    http://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf

コメントを残す

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