-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathm_CO2.h
75 lines (57 loc) · 1.77 KB
/
m_CO2.h
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
#include <Arduino.h>
// 基于 https://github.com/RobTillaart/MTP40F/blob/master/examples/MTP40F_PWM_demo/MTP40F_PWM_demo.ino
// 由于上面的示例,关于PWM计算,不符合文档下列所说,因此修改之。
// 【PWM 功能详解】
// PWM 的周期是 1004ms
// 起始阶段高电平输出 2ms
// 中部周期 1000ms
// 结束阶段低电平输出 2ms
// 通过 PWM 获得当前 CO2
// 浓度值的计算公式:
// Cppm = 5000*(TH-2ms)/(TH+TL-4ms)
// Cppm 为计算得到的 CO2
// 浓度值,单位是 ppm
// TH 为一个输出周期中输出为高电平的时间
// TL 为一个输出周期中输出为低电平的时间
// PWM端口:3、5、6、9、10、11、13
// 二氧化碳
// 型号:mtp_40_f
// 接口:G+->VCC(5V)、G->GND、PWM->D3
// 协议:PWM
#define _Pin_CO2 3
namespace Module {
namespace MTP_40_F {
unsigned long start = 0;
unsigned long duration = 0;
// 计算高电平持续时间
void Interrupt() {
if (digitalRead(_Pin_CO2) == HIGH) start = millis();
else duration = millis() - start;
}
// 浓度值的计算公式:
// Cppm = 5000*(TH-2ms)/(TH+TL-4ms)
// 单位是 ppm
unsigned int DurationToPPM() {
return 5000 * (float)(duration - 2) / (1004 - 4);
}
}
struct _CO2 {
void init() {
pinMode(_Pin_CO2, INPUT_PULLUP);
// 中断服务例程(ISR),当连接到引脚电平变化时,Arduino会调用这个函数。
attachInterrupt(digitalPinToInterrupt(_Pin_CO2), MTP_40_F::Interrupt, CHANGE);
}
int lastValue = 400;
int getValue() {
int value = MTP_40_F::DurationToPPM();
// 容错交给网页处理,这里只保证在量程之内
if (value < 400 || value > 5000) {
value = lastValue;
} else {
lastValue = value;
}
return value;
}
char unit[6] = "ug\/m";
} CO2;
}