将 DHT11 的温度,用 LCD1602 展现

是用Arduino实现的

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
Author:ZhangSiyang[[email protected]]
LICENSE:MIT
DATE:201806
*/
#include <LiquidCrystal.h>
#include <DHT.h>
#define LCDHORIZONTAL 16 /*LCD横向分辨率*/
#define LCDVERTICAL 2 /*LCD竖向分辨率*/
#define LCDLED 10
#define CUSTOMCHARCOUNT 4
byte customChars[CUSTOMCHARCOUNT][8] = {{
/*LCD1602 自定义字符*/
B00000,
B10000,
B01000,
B00100,
B00010,
B00001,
B00000,
B00000
/*反斜杠*/
}, {
B00100,
B01010,
B01010,
B01010,
B01110,
B11111,
B11111,
B01110
/*温度计*/
}, {
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110
/*水滴*/
}, {
B00100,
B00100,
B01010,
B11011,
B00100,
B00100,
B01010,
B01010
/*体感温度*/
}
};
char title[] = "TEMP RH @DHT11"; /*显示在第一行的标题*/
char err_cant_con[] = "E!Can't Connect."; /*无法连接至DHT11时的错误提示*/
uint8_t flag[4] = {0, '|', '/', '-'}; /*用于表示程序运行状态,大概进度条的意思*/
uint8_t pointToFlag = 3; /*指针,用于运行指示*/
String Separator = String(' '); /*信息输出用的分割符,预先定义好后节省空间也直观一点*/
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#define DHTPIN 1 /*DHT Data针脚*/
#define DHTTYPE DHT11 /*DHT型号*/
#define DHTDELAYLIMIT 1000
DHT dht(DHTPIN, DHTTYPE);
float t, h, hic; /*t:温度, h:相对湿度, hic:热度指数(体感温度,摄氏记)*/
uint32_t nowORdelayMS; /*存储当前时间或需延时的时间(DHT有时间分辨率的概念)*/
void setup() {
dht.begin();
lcd.begin(LCDHORIZONTAL, LCDVERTICAL);
lcd.print(title); /*lcd.begin 后光标定在1行1列, 这时打印标题*/
for (int i = 0; i < CUSTOMCHARCOUNT; i++) { /*自定义字符*/
lcd.createChar(i, customChars[i]);
}
pinMode(LCDLED, OUTPUT); /*由PWM而非5V针脚供电*/
analogWrite(LCDLED, 120); /*可调节的亮度,60一般,120上档次, 190+照顾弱视*/
}
void loop() {
refreshFlag(); /*更新运行状态显示*/
nowORdelayMS = millis(); /*记录本次获取数据开始时间*/
t = dht.readTemperature(); /*获取摄氏温度*/
h = dht.readHumidity(); /*获取相对数度*/
lcd.setCursor(0, 1); /*设定光标,打印信息用*/
if (isnan(h) || isnan(t)) { /*错误数据,告知无法连接传感器*/
lcd.print(err_cant_con);
return; /*直接进入下一个loop,*/
} else {
hic = dht.computeHeatIndex(t, h, false); /*计算hic*/
String info = /*生成温湿度信息*/
String(char(1)) + Separator + String(t, 0) + Separator + /*有危险!char(1)是为了让 LCD 输出第二个用户自定义字符,需要与前方 lcd.createChar 相绑定*/
String(char(2)) + Separator + String(h, 0) + Separator + /*同上, 这一个是湿度*/
String(char(3)) + Separator + String(hic, 0) /*同上,这个是体感温度(hic)*/
+ Separator + Separator
;
lcd.print(info); /*输出已经准备好的温湿度信息*/
}
nowORdelayMS = DHTDELAYLIMIT - (millis() - nowORdelayMS); /*计算应延迟的时间。注意,参与运算的 nowORdelayMS/millis() 有溢出的可能*/
if (nowORdelayMS > 1000) { /*防止溢出,不然一延时延时个50天谁受得了……*/
delay(1000);
} else {
delay(nowORdelayMS);
}
}
void refreshFlag() {
lcd.setCursor(LCDHORIZONTAL - 1, 0); /*设定运行状态指示位*/
lcd.write(flag[pointToFlag-- % CUSTOMCHARCOUNT]); /*pointToFlag 是 uint8_t , 利用溢出和对四取模的特点使 (flag[pointToFlag-- % CUSTOMCHARCOUNT]) 在0到(CUSTOMCHARCOUNT - 1)之间循环*/
}