User Tools

Site Tools


arduino:mh-z19b

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
arduino:mh-z19b [2020/03/02 21:35] – created aistisarduino:mh-z19b [2020/03/02 21:36] (current) – aistis
Line 4: Line 4:
  
 carbon dioxide carbon dioxide
 +
 +https://forum.arduino.cc/index.php?topic=525459.msg3587557#msg3587557
  
 {{:arduino:pasted:20200302-213502.png}} {{:arduino:pasted:20200302-213502.png}}
  
 +{{:arduino:pasted:20200302-213536.png}}
 +
 +<code cpp>
 +#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; 
 +}
 +</code>
arduino/mh-z19b.1583177702.txt.gz · Last modified: by aistis