Arduino 温湿度传感器 DHT11

本文最后更新于:2021年2月23日 凌晨

摘要
这里介绍关于 DHT11 温湿度传感器在 arduino 上的使用方法,附头文件

知识准备

–单线串口

所谓单线串口(全称为单线异步串行通讯接口),不同于标准串口的两根数据线( Txd 和 Rxd ),单线串口只有一根数据线同时兼备发送和接收功能,系统的数据交换、控制均由单总线完成。因此,单线串口采用半双工的通讯方式(能双向通信,但一方发送信息的时候另一方不能发送信息,毕竟只有一根线)。单总线通常要求外接一个上拉电阻,以确保当总线闲置时,其状态为高电平,如图以 DHT11为例。

image-20210223000826563

还可以在 VDD 和 GND 直接加一个电容 ,来去耦滤波。

–单总线数据位的定义

这里以 DHT11 来说明。(科协给的数据手册确实有点意思,上面讲的比较详细,,这里挑重点说明)

DHT11 和主机的通信,一次传送 40 位数据,高位先出,一次通讯 4ms 左右。

数据格式:8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据 + 8bit校验位

校验位等于 “8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据” 所得结果的末8位。

通讯过程:

主机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11 发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据,DHT11 采集数据后转换到低速模式。所以我们每一次读取的数据是上一次的采集结果

时序图:

数据时序图

起始信号:微处理器把数据总线(SDA)拉低一段时间至少 18ms(最大不得超过30ms)。通知传感器准备数据。

响应信号:传感器把数据总线(SDA)拉低 83μs,再接高 87μs 以响应主机的起始信号。

数据:传感器一次性从数据总线(SDA)串出40 位数据,高位先出

最后从机拉低 50μs ,随后总线由上拉电阻拉高释放总线进入空闲状态。

–相对湿度

Relative humidity is the amount of water vapor in air vs. the saturation point of water vapor in air. At the saturation point, water vapor starts to condense and accumulate on surfaces forming dew.

The saturation point changes with air temperature. Cold air can hold less water vapor before it becomes saturated, and hot air can hold more water vapor before it becomes saturated.

简单点说,相对湿度就是空气中水蒸气的量与空气中水蒸气的饱和点(饱和点:水蒸气开始凝结并积聚在形成露水的表面,其值随气温变化)的比值。

相对湿度计算公式:

image-20210223004500927

100%RH 下,会发生凝结;0% 下,空气完全干燥。

–数字温湿度传感器及原理

温度传感器组件有很多种,像热敏电阻、DS18B20 、TMP36 、LM335A 等。DHT11 其实是一款结合温湿度传感器及信号处理 IC 的感测模块,外观如下。

image-20210223003652245

连接 arduino 时。建议在电源与数据输出脚连接一个 10kΩ 电阻,电源和接地脚之间接一个 0.1μF(104) 电容,原因在上文有提及。怕麻烦可以直接买最右侧的。

那么它是如何从测量温度和湿度的?

DHT11 通过测量两个电极之间的电阻来检测水蒸气。两个电极之间的电阻变化与相对湿度成正比。较高的相对湿度会降低电极之间的电阻,而较低的相对湿度会增加电极之间的电阻。

DHT11 通过 NTC温度传感器(热敏电阻)来测量温度 。

设计方案

image-20210223005003510

材料清单

材料 数量
Arduino Uno 1
DHT11 1
10kΩ 电阻(三脚的 DHT11不需要,但四脚的 DHT11 也非强制需要) 1
导线 3

代码

这里需要引入 DHT11 第三方库。下载链接

打开压缩包有两个文件

image-20210223005614566

找到 Arduino 的 libraries 地址,一般默认会在 C:\Documents\Arduino\libraries (因人而异),里面有不少已经安装好的官方库。

image-20210223005902472

我们新建一个文件夹dth11,名字随意取,不一定要我这个。

把压缩包里的两个文件复制进去,大功告成。

image-20210223010041145

测试程序:

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
#include <DHT.h>        //引用dht11库文件,使得下面可以调用相关参数
#define DHTPIN 8 //定义温湿度针脚号为8号引脚
#define DHTTYPE DHT11 // DHT 11 实例化一个对象

DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600); //设置波特率参数
Serial.println(F("数据接收开始!"));
dht.begin();
}

void loop() {
delay(2000); //在测量之间等待几秒钟,因为测量速度超级慢。
float h = dht.readHumidity();
//读取温度为摄氏度(默认值)
float t = dht.readTemperature();
//检查是否有任何读取失败并提前退出(再试一次)。
if (isnan(h) || isnan(t)) {
Serial.println(F("无法从DHT传感器读取!"));
return;
}
// Humidity湿度
Serial.print(F("Humidity: "));
Serial.print(h);
//Temperature 温度
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print("\n");
}

成果展示

这里不打算拍视频了。

运行一切正常,随意拔出一根线随即输出 ”无法从DHT传感器读取!“

image-20210223011114797

侵删


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!