Arduino 温湿度传感器 DHT11
摘要
这里介绍关于 DHT11 温湿度传感器在 arduino 上的使用方法,附头文件
知识准备
–单线串口
所谓单线串口(全称为单线异步串行通讯接口),不同于标准串口的两根数据线( Txd 和 Rxd ),单线串口只有一根数据线来同时兼备发送和接收功能,系统的数据交换、控制均由单总线完成。因此,单线串口采用半双工的通讯方式(能双向通信,但一方发送信息的时候另一方不能发送信息,毕竟只有一根线)。单总线通常要求外接一个上拉电阻,以确保当总线闲置时,其状态为高电平,如图以 DHT11为例。
还可以在 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.
简单点说,相对湿度就是空气中水蒸气的量与空气中水蒸气的饱和点(饱和点:水蒸气开始凝结并积聚在形成露水的表面,其值随气温变化)的比值。
相对湿度计算公式:
100%RH 下,会发生凝结;0% 下,空气完全干燥。
–数字温湿度传感器及原理
温度传感器组件有很多种,像热敏电阻、DS18B20 、TMP36 、LM335A 等。DHT11 其实是一款结合温湿度传感器及信号处理 IC 的感测模块,外观如下。
连接 arduino 时。建议在电源与数据输出脚连接一个 10kΩ 电阻,电源和接地脚之间接一个 0.1μF(104) 电容,原因在上文有提及。怕麻烦可以直接买最右侧的。
那么它是如何从测量温度和湿度的?
DHT11 通过测量两个电极之间的电阻来检测水蒸气。两个电极之间的电阻变化与相对湿度成正比。较高的相对湿度会降低电极之间的电阻,而较低的相对湿度会增加电极之间的电阻。
DHT11 通过 NTC温度传感器(热敏电阻)来测量温度 。
设计方案
材料清单
材料 | 数量 |
---|---|
Arduino Uno | 1 |
DHT11 | 1 |
10kΩ 电阻(三脚的 DHT11不需要,但四脚的 DHT11 也非强制需要) | 1 |
导线 | 3 |
代码
这里需要引入 DHT11 第三方库。下载链接
打开压缩包有两个文件
找到 Arduino 的 libraries 地址,一般默认会在 C:\Documents\Arduino\libraries (因人而异),里面有不少已经安装好的官方库。
我们新建一个文件夹dth11
,名字随意取,不一定要我这个。
把压缩包里的两个文件复制进去,大功告成。
测试程序:
1 |
|
成果展示
这里不打算拍视频了。
运行一切正常,随意拔出一根线随即输出 ”无法从DHT传感器读取!“
侵删