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) 原理解释

浙公网安备 33010602011771号