MH-Z19B co2 carbon dioxide https://forum.arduino.cc/index.php?topic=525459.msg3587557#msg3587557 {{:arduino:pasted:20200302-213502.png}} {{:arduino:pasted:20200302-213536.png}} #include 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; }