Пример опроса датчика MH-Z19b

После замены MH-Z19b на другой датчик, начал с ним экспериментировать самостоятельно, ранее использовал его в связке с ESPEasy и не задумывался, что под капотом. Если кому-то будет интересно, вот минимальный код для опроса датчика по UART на уровень CO2 и вывод полученного результата в консоль.

#include <SoftwareSerial.h>

#define MH_Z19_RX D4
#define MH_Z19_TX D0


byte cmd_z19[]    = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
byte rpl_z19[]    = {0,0,0,0,0,0,0,0,0};

#define CO2_HBYTE 2
#define CO2_LBYTE 3

int z19_co2;

unsigned long mTXRXData(byte cmd[], int tx_len, int rx_len, int hi_byte, int lo_byte) {
  SoftwareSerial z19Serial(MH_Z19_RX, MH_Z19_TX);
  z19Serial.begin(9600);
  while(!z19Serial.available()) {
    z19Serial.write(cmd, tx_len); 
    delay(50); 
  }
  int timeout=0;
  while(z19Serial.available() < rx_len ) {
    timeout++; 
    if(timeout > 10) {
      while(z19Serial.available()) {
        z19Serial.read();
        break;
      }
    } 
    delay(50); 
  } 
  for (int i=0; i < rx_len; i++) { 
    rpl_z19[i] = z19Serial.read(); 
  }  
  z19Serial.end();

  int high = rpl_z19[hi_byte];
  int low = rpl_z19[lo_byte];
  unsigned long val = high*256 + low;

  return val;
}  

void co2_measure() {
  z19_co2 = mTXRXData(cmd_z19, sizeof(cmd_z19)/sizeof((cmd_z19)[0]), sizeof(rpl_z19)/sizeof((rpl_z19)[0]), CO2_HBYTE, CO2_LBYTE);
  Serial.printf("CO2 value: %d \n", z19_co2);
  return;
}


void setup() {
  Serial.begin(115200);
  delay(10);
}

void loop() {
  co2_measure();
  delay(10 * 1000L);

}

Датчик подключено к D0 (RX на датчике) и к D4 (TX на датчике) esp8266, опрос происходит каждые 10 секунд.

Один ответ к «Пример опроса датчика MH-Z19b»

Добавить комментарий

Ваш адрес email не будет опубликован.