Arduino SoftwareSerial + CO2传感器模组MH-Z14

MH-Z14是基于非色散红外(NDIR)原理的CO2浓度传感器模组,由郑州炜盛电子生产。其主要特性有:

  • 工作电压:4.5 ~ 6V
  • 工作电流:平均85mA
  • 接口类型:模拟/UART/PWM信号输出
  • 接口电平:3.3V (模组背面有颗STM32的MCU)
  • 测量范围:可订制,如0~2000ppm/0~5000ppm等。一般室内外环境,0~5000ppm足够。
  • 分辨率:0~5000ppm测量范围时分辨率为1ppm
  • 自动背景校准(Automatic Background Calibration):将一段时间内的CO2浓度最低点,自动校正为户外大气CO2浓度(约400ppm)。该功能有利于传感器的长期稳定性,适用于日常有通风的场合,不适用于通风不良的储藏室、大棚等。
  • 温度补偿
  • 预热时间:3min
  • 响应时间:< 90s
  • 尺寸:57.2mm(L) x 34.7mm(W) x 约15mm(H)
  • 重量:23g

管脚定义

  • V+:电源,4.5 ~ 6V
  • V-:地
  • T:串口发送(TX)
  • R:串口接收(RX)
  • D1、D2:模拟信号输出
  • PWM:脉冲宽度调制信号输出
  • HD:校零,低电平有效
  • NC:不连接

可能是为了方便连接,大部分管脚功能在排针孔上有重复。

与Arduino的连接

采用串口方式与Arduino UNO通讯。考虑到Arduino仅有一个硬件串口(D0、D1),并且该串口还要用于程序更新或打印,因此利用官方SoftwareSerial库在其他管脚上实现uart的功能。

MH-Z14      Arduino UNO

V+   <------> 5V

V-    <------> GND

T     <------> D2 (可代码指定)

R     <------> D3 (可代码指定)

功能调试

1. SoftwareSerial库采用的Serial buffer大小为64字节,使用该库时,串口收到的数据最好尽快读出来,不然buffer很容易用完。

2. 模块刚上电时有一个预热过程,此时读取测量结果,可能一直返回浓度值为“400ppm”。

3. 手册中说模块还会返回传感器温度和环境温度值,但实际调试时温度值读出来都是0。

4. 发送读取命令后,应延迟一小段时间再读取返回结果,不然模块可能还未来得及返回结果。

测试代码

 1 /*
 2     Measurement of CO2 concentration using MH-Z14 sensor
 3 */ 
 4 #include <SoftwareSerial.h>
 5 
 6 byte cmd[] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
 7 byte buffer[20]; 
 8 
 9 int backNum = 0;
10 int co2 = 0; //ppm
11 
12 SoftwareSerial mySerial(2, 3); // RX, TX
13 
14 void setup()
15 {
16     Serial.begin(9600);
17     
18     // set the data rate for the SoftwareSerial port
19     mySerial.begin(9600);
20     mySerial.listen();
21 }
22 
23 void loop()
24 {
25     // send the command
26     for(int i = 0; i < sizeof(cmd); i++)
27     {
28         mySerial.write(cmd[i]);
29     }
30 
31     delay(100);
32     backNum = mySerial.available();
33 
34     // get the result
35     for(int i = 0; i < backNum; i++)
36     {
37         buffer[i] = mySerial.read();
38     }
39     co2 = buffer[2]*256 + buffer[3];
40 
41     // print
42     Serial.print("CO2 = "); Serial.print(co2); Serial.print(" ppm   ");
43     
44     // check the value
45     if ((buffer[1] == 0x86) && (CheckVal(buffer, 9) == 0xFF))
46     {
47         Serial.println("value checked.");
48     }
49     else
50     {
51         Serial.println("error");
52     }
53 
54     delay(2000);
55 }
56 
57 byte CheckVal(byte data[], byte len)
58 {
59     byte result = 0;
60     for(int i = 0; i < len; i++)
61     {
62         result = result + data[i];
63     }
64     return result;
65 }

Arduino每隔2秒钟读取一次测量结果,并将结果打印。

参考资料

MH-Z14 CO2传感器模组 - 郑州炜盛
Arduino - SoftwareSerial
Automatic Background Calibration (ABC) 原理解释

posted @ 2026-03-14 20:23  zelu  阅读(6)  评论(0)    收藏  举报