User Tools

Site Tools


arduino:mh-z19b

MH-Z19B

co2

carbon dioxide

https://forum.arduino.cc/index.php?topic=525459.msg3587557#msg3587557

#include <SoftwareSerial.h>
SoftwareSerial co2Serial(7, 6); // define MH-Z19 RX TX
unsigned long startTime = millis();
 
void setup() {
  Serial.begin(115200);
  co2Serial.begin(9600);
  pinMode(9, INPUT);
}
 
void loop() {
  int ppm_uart = readCO2UART();
  //int ppm_pwm = readCO2PWM();
  delay(1000);
}
 
int readCO2UART(){
  byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
  byte response[9]; // for answer
  co2Serial.write(cmd, 9); //request PPM CO2
 
  // clear the buffer
  memset(response, 0, 9);
  int i = 0;
  while (co2Serial.available() == 0) {
//    Serial.print("Waiting for response ");
//    Serial.print(i);
//    Serial.println(" s");
    delay(100);
    i++;
  }
  if (co2Serial.available() > 0) {
      co2Serial.readBytes(response, 9);
  }
  // print out the response in hexa
  for (int i = 0; i < 9; i++) {
    //Serial.print(String(response[i], HEX));
    //Serial.print("   ");
  }
  //Serial.println("");
 
  // checksum
  byte check = getCheckSum(response);
  if (response[8] != check) {
    Serial.println("Checksum not OK!");
    Serial.print("Received: ");
    Serial.println(response[8]);
    Serial.print("Should be: ");
    Serial.println(check);
  }
 
  // ppm
  int ppm_uart = 256 * (int)response[2] + response[3];
  Serial.print(ppm_uart);
 
  // temp
  byte temp = response[4] - 40;
  Serial.print(",");
  Serial.println(temp);
 
  // status
  byte status = response[5];
  //Serial.println(status);
  if (status == 0x40) {
    Serial.println("Status OK");
  }
 
  return ppm_uart;
}
 
byte getCheckSum(char *packet) {
  byte i;
  unsigned char checksum = 0;
  for (i = 1; i < 8; i++) {
    checksum += packet[i];
  }
  checksum = 0xff - checksum;
  checksum += 1;
  return checksum;
}
 
int readCO2PWM() {
  unsigned long th, tl, ppm_pwm = 0;
  do {
    th = pulseIn(9, HIGH, 1004000) / 1000;
    tl = 1004 - th;
    ppm_pwm = 5000 * (th-2)/(th+tl-4);
  } while (th == 0);
  Serial.print("PPM PWM: ");
  Serial.println(ppm_pwm);
  return ppm_pwm; 
}
arduino/mh-z19b.txt · Last modified: by aistis