二氧化碳传感器使用笔记

介绍

这是一款攀藤科技的二氧化碳传感器 链接 图片

DS-CO2-20 是一款基于非分光红外吸收原理的数字式二氧化碳浓度传感器,可连续采集并计算单位体积内空气中的二氧化碳浓度,并以通用数字接口形式输出。
本传感器可嵌入各种与二氧化碳浓度相关的仪器仪表或环境改善设备,为其提供及时准确的浓度数据。

硬件部分

它的针脚是2mm间距,接口朝下俯视角从左到右分别是pin1到pin7,需要注意的是5V供电

管脚 标号 说明
pin1 VCC 5V
pin2 GND
pin3 RXD TTL_3.3V
pin4 TXD TTL_3.3V
pin5 RESET TTL_3.3V
pin6 NC
pin7 NC

把NodeMCU和它连接使用,接法如下

NodeMCU DS-CO2-20
Vin(5V) VCC
GND GND
D5(IO14) RXD
D6(IO12) TXD

软件部分

通讯方式是串口通讯,默认波特率:9600bps,校验位:无,停止位:1 位
通讯协议是应答式,主机发送0x42, 0x4d, 0xe3, 0x00, 0x00, 0x01, 0x72
其中前两位是特征字节,第三位是指令字节,最后两位是校验字节

从机应答格式协议长度为12字节,从0x42, 0x4d开始二氧化碳数值的高低八位分别在第5、6位
最后两位是校验字节

程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <ESP8266WiFi.h>
#include <Thread.h>
#include <SPI.h>
#include <Wire.h>
#include <SoftwareSerial.h>

Thread CO2Thread = Thread();
SoftwareSerial CO2sensor(14, 12, false, 128);

//CO2
static unsigned int CO2ppm = 0;
const unsigned char CO2AskData[7] = {0x42, 0x4d, 0xe3, 0x00, 0x00, 0x01, 0x72};

struct _panteng {
unsigned char len[2];
unsigned char co2_cf[2];
unsigned char d[4];
unsigned char crc_cf[2];
} panteng;
char crc1,crc2;

void CO2Callback(){
unsigned char c;
static int state = 0;
static int count = 0;
CO2sensor.write(CO2AskData, 7);

while (CO2sensor.available()) {
c = CO2sensor.read();
//Serial.print(c,HEX);
switch (state) {
case 0:
if (0x42 == c)
state = 1;
break;
case 1:
if (0x4d == c) {
state = 2;
count = 0;
}
break;
case 2:

((unsigned char *) &panteng)[count++] = c;
if (count > 12) {
state = 0;

crc1 = panteng.crc_cf[0] * 256 + panteng.crc_cf[1];
crc2 = 0x42 + 0x4d + panteng.len[0]+ panteng.len[1]+panteng.co2_cf[0]+panteng.co2_cf[1]+panteng.d[0]+panteng.d[1]+panteng.d[2]+panteng.d[3];

//Serial.print("crc1 = ");Serial.println(crc1,HEX);
//Serial.print("crc2 = ");Serial.println(crc2,HEX);

if (crc1 == crc2){
CO2ppm = panteng.co2_cf[0] * 256 + panteng.co2_cf[1];
Serial.print("co2 = ");Serial.print(CO2ppm);Serial.println(" ppm");
}
}
break;
default:
break;
}
}
delay(1000);
}

void setup(){
CO2Thread.onRun(CO2Callback);
CO2Thread.setInterval(1000);

Serial.begin(115200);
CO2sensor.begin(9600);
}

void loop(){
if(CO2Thread.shouldRun())
CO2Thread.run();
}