当前位置:网站首页>【Arduino 连接DHT11 湿度和温度传感器】
【Arduino 连接DHT11 湿度和温度传感器】
2022-08-02 03:29:00 【WENJIE科技】
Arduino 连接DHT11 湿度和温度传感器
前言
DHT11 模块具有温度和湿度传感器复合体,带有校准的数字信号输出。独有的数字信号采集技术和温湿度传感技术确保高可靠性和出色的长期稳定性。该传感器包括一个用于温度测量的 NTC 和一个用于湿度测量的电阻式湿度测量组件。它们连接到高性能 8 位微控制器,提供卓越的质量、快速的响应、抗干扰能力和成本效益。
DHT11 模块引脚
DHT11 模块共有 3 个引脚。其中两个用于电源,一个用于通信。DHT11 Sensor 模块的引脚排列如下:
DHT11 模块
DHT11 模块只有极少的零件,包括 DHT11、上拉电阻、旁路电容和带限流电阻的电源 LED。
DHT11模块电路图
DHT11 模块的原理图如下所示。如前所述,该板的组件数量非常少。VCC 和 GND 直接连接到 DHT11,并且在 DATA 引脚上增加了一个上拉电阻。钽电容器和多层电容器提供了足够的滤波。带有限流电阻的 LED 用作电源指示灯。
关于 DHT11 传感器的常见问题
问:DHT11 有什么作用?
DHT11 是一款基本的、超低成本的数字温湿度传感器。它使用电容式湿度传感器和热敏电阻来测量周围的空气,并通过 1-wire 协议发送数据。
问:DHT11 的准确度如何?
DHT11 可以测量 0-50⁰C 的温度,精度为 2%,相对湿度测量范围为 20-80%,精度为 5%。
问:DHT11 防水吗?
不,它不防水。
问:DHT11 传感器的采样率是多少?
DHT11 的采样率为 1Hz。
DHT11 是如何工作的?
湿度传感组件由夹在两个电极之间的水分保持基板组成。当基材吸收水分时,两个电极之间的电阻会降低。两个电极之间的电阻变化与相对湿度成正比。较高的相对湿度会降低电极之间的电阻,而较低的相对湿度会增加电极之间的电阻。使用板载 MCU 的 ADC 测量电阻变化并计算相对湿度。
每个DHT11元件都经过实验室严格校准,湿度校准极其准确。校准系数作为程序存储在 OTP 存储器中,供传感器的内部信号检测过程使用。
DHT11 1-Wire 通讯协议
单总线数据格式用于 MCU 和 DHT11 传感器之间的通信和同步。一个通信过程大约是4ms。数据由小数部分和整数部分组成。完整的数据传输为40bit,传感器先发送高位数据。数据格式如下:8bit积分RH数据+8bit十进制RH数据+8bit积分T数据+8bit十进制T数据+8bit校验和。如果数据传输正确,校验和应该是“8bit RH 积分+8bit RH 十进制数据+8bit 积分T 数据+8bit 十进制T 数据”的最后8bit。
当 MCU 发出启动信号时,DHT11 从低功耗模式切换到运行模式,等待 MCU 完成启动信号。完成后,DHT11 会向 MCU 发送一个包含相对湿度和温度信息的 40 位数据的响应信号。用户可以选择收集(读取)一些数据。没有来自 MCU 的启动信号,DHT11 不会给 MCU 响应信号。数据采集完毕后,DHT11 将切换到低功耗模式,直到再次收到来自 MCU 的启动信号。上图显示了通信时序图。
将 DHT11 传感器与 Arduino 连接的电路图
现在我们已经完全了解了 DHT11 传感器的工作原理,我们可以将所有必需的电线连接到 Arduino 并编写代码以从传感器中获取所有数据。下图显示了将 DHT11 传感器模块与 Arduino 连接的电路图。连接非常简单,只需要三根线。将模块的 VCC 和 GND 连接到 Arduino 的 5V 和 GND 引脚。然后将 DATA 引脚连接到 Arduino 的数字引脚 2。我们通过此引脚与 DHT11 通信。
用于连接传感器模块的 Arduino DHT11 代码
现在让我们看看连接 DHT11 传感器的代码。为此,首先通过库管理器安装 Adafruit 的DHT 传感器库和Adafruit 统一传感器驱动程序。
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTTYPE DHT11 // DHT 11
#define DHTPIN 2
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
一开始,我们已经包含了所有必要的库,并将传感器类型定义为 DHT11,将传感器引脚定义为数字引脚 2。然后为 DHT 库创建了一个实例。还创建了一个变量来声明最小延迟。
void setup() {
Serial.begin(9600);
dht.begin();
sensor_t sensor;
delayMS = sensor.min_delay / 1000;
}
在setup函数中,我们已经初始化了串行通信和 DHT 库。然后是数据刷新的最小延迟。
void loop()
{
sensors_event_t event;
dht.temperature().getEvent(&event);
Serial.print(F("Temperature: "));
Serial.print(event.temperature);
Serial.println(F("°C"));
dht.humidity().getEvent(&event);
Serial.print(F("Humidity: "));
Serial.print(event.relative_humidity);
Serial.println(F("%"));
delay(delayMS);
}
在循环函数中,我们创建了一个事件,并使用该事件从 DHT11 传感器读取温度和湿度数据。然后将该值打印到串行监视器。下图显示了 DHT11 界面。
代码和库文件
代码和库文件已上传至个人主页。
边栏推荐
猜你喜欢
随机推荐
(不重点考)试算平衡的分类
挖矿是什么意思?矿工都做了什么?
【一句话攻略】彻底理解JS中的回调(Callback)函数
研发过程中的文档管理与工具
TimeSformer视频理解框架:视频理解中的Transformer
centos8 安装搭建php环境
Go中的一些优化笔记,简约而不简单
win10内存占用很高,关闭所有应用程序依然降不下来(win11)
Kotlin - 静态方法
RecyclerView使用和原理解析
最简单的FRP内网穿透教程
Kotlin - 标准函数(with、run和apply)
Debian 12 Bookworm 尝鲜记
uniapp发布到微信小程序:分包、删减代码全过程
《scala 编程(第3版)》学习笔记3
[Spark]-协同过滤
Laravel 验证唯一时排除修改时的数据
Larave 自定义公共函数以及引入使用
分布式消息队列平滑迁移技术实战
Binder机制详解(一)