基于 DHT11 的温湿度检测(原理图+代码)


原标题:基于 DHT11 的温湿度检测(原理图+代码)
基于 DHT11 的温湿度检测系统
基于 DHT11 的温湿度检测系统是一种成本效益高且易于实现的方案,广泛应用于环境监测、智能家居、农业大棚等领域。它能够实时获取当前环境的温度和湿度数据,并通过微控制器进行处理和显示。本设计将详细阐述其工作原理、核心元器件的选择与功能、完整的硬件电路图以及相应的软件代码实现。
1. DHT11 温湿度传感器介绍
1.1 DHT11 传感器概述
DHT11 是一款常用的数字温湿度复合传感器,由一颗经过校准的数字信号输出的温湿度传感器和一个单片机连接。它采用专有的数字信号采集技术和温湿度传感技术,确保了产品的高可靠性与长期稳定性。DHT11 具有响应速度快、抗干扰能力强、性价比高等特点。
1.2 DHT11 工作原理
DHT11 内部集成了一个电容式湿度传感器和一个 NTC(负温度系数)热敏电阻。
湿度测量: DHT11 采用电容式湿度传感器。传感器的湿度敏感材料在吸收水蒸气后,介电常数会发生变化,导致电容值随之变化。DHT11 内部的 ASIC(专用集成电路)会将这个电容值的变化转换为数字信号输出。
温度测量: 温度测量则利用 NTC 热敏电阻的特性。NTC 热敏电阻的电阻值会随着温度的升高而降低。DHT11 内部的 ADC(模数转换器)会将热敏电阻的模拟电压信号转换为数字信号,进而得到温度值。
DHT11 传感器与微控制器之间采用单总线通信方式。传感器每次数据传输 40 位数据,高位在前,包括 16 位湿度数据(整数部分 8 位,小数部分 8 位)、16 位温度数据(整数部分 8 位,小数部分 8 位)以及 8 位校验和。校验和用于验证数据传输的正确性,即湿度整数部分 + 湿度小数部分 + 温度整数部分 + 温度小数部分 = 校验和。
1.3 DHT11 主要参数
供电电压: 3.3V - 5.5V
测量范围:
湿度:20% - 90% RH (±5% RH)
温度:0°C - 50°C (±2°C)
分辨率:
湿度:1% RH
温度:1°C
响应时间: 2秒
功耗: 测量时约 2.5mA,待机时 100μA - 150μA
引脚定义:
VCC:供电电源
DATA:数据引脚(需要接上拉电阻)
NC:空引脚
GND:接地
2. 系统硬件设计与元器件选型
一个完整的基于 DHT11 的温湿度检测系统通常包括微控制器、DHT11 传感器、显示模块以及必要的辅助电路。
2.1 微控制器(MCU)
微控制器是整个系统的核心,负责控制 DHT11 传感器的数据读取、处理、以及将数据显示到屏幕上。
优选元器件型号: STMicroelectronics STM32F103C8T6 或 Arduino UNO (基于 ATmega328P)。
为什么选择:
STM32F103C8T6: 这是一款基于 ARM Cortex-M3 内核的 32 位微控制器,具有高性能、低功耗和丰富的外设资源,如多个定时器、UART、SPI、I2C、ADC 等。它适用于需要更高处理能力和更复杂功能的项目,且其开发生态系统成熟,资料丰富。
Arduino UNO (ATmega328P): 对于初学者和简单的项目,Arduino UNO 是一个极好的选择。它基于 ATmega328P 8 位 AVR 微控制器,易于上手,拥有庞大的社区支持和丰富的库函数,简化了开发过程。其集成开发环境 (IDE) 使得编程和上传代码变得非常方便。
元器件功能: 微控制器负责发送启动信号给 DHT11,等待并接收 DHT11 返回的温湿度数据。接收到数据后,它会进行数据解析和校验。如果校验通过,则将温湿度值转换为易于理解的格式,并驱动显示模块进行显示。此外,它还可以根据需要进行数据存储、通过串口发送数据到上位机等。
2.2 显示模块
显示模块用于直观地显示测量到的温度和湿度数据。
优选元器件型号: LCD1602 液晶显示屏 或 OLED 0.96 寸显示屏 (SSD1306)。
为什么选择:
LCD1602: 这是一种经典的字符型液晶显示屏,价格低廉,易于驱动,适合显示简单的文本信息。它通常采用并行或 I2C 接口与微控制器连接。对于只显示温度和湿度数值的应用来说,LCD1602 足以满足需求。
OLED 0.96 寸显示屏 (SSD1306): OLED 显示屏具有自发光、高对比度、宽视角、低功耗的优点,显示效果更佳。0.96 寸的尺寸小巧,适合集成到紧凑型设备中。它通常采用 I2C 或 SPI 接口,其中 I2C 接口连接线更少,更方便。
元器件功能: 接收微控制器发送的待显示数据(如温度值、湿度值),并在屏幕上以字符或图形的形式显示出来,为用户提供直观的反馈。
2.3 DHT11 温湿度传感器
优选元器件型号: AM2302 (DHT22) 或 DHT11。
为什么选择:
DHT11: 对于成本敏感或对精度要求不高的应用,DHT11 是一个经济实惠的选择。它足够用于日常环境监测。
AM2302 (DHT22): 如果对测量精度和范围有更高要求,AM2302 (DHT22) 是更好的选择。它的测量精度更高(温度 ±0.5°C,湿度 ±2% RH),测量范围更广(温度 -40°C ~ 80°C,湿度 0% ~ 99.9% RH),但价格略高于 DHT11。两者在通信协议上高度相似,代码兼容性好。
元器件功能: 作为核心传感器,负责实时采集环境的温度和湿度数据,并通过单总线协议将数字信号传输给微控制器。
2.4 上拉电阻
优选元器件型号: 10kΩ 电阻。
为什么选择: DHT11 的 DATA 引脚需要连接一个上拉电阻,通常为 4.7kΩ 到 10kΩ 之间。这是因为 DHT11 的数据线在不传输数据时是高电平,通过上拉电阻可以确保在数据线空闲时保持高电平状态,避免信号浮动,提高通信的稳定性。
元器件功能: 提供一个稳定的高电平,确保 DHT11 的 DATA 引脚在空闲状态下保持高电平,便于微控制器和传感器之间的正常通信。
2.5 其他辅助元器件
面包板或 PCB: 用于搭建电路和固定元器件。
跳线: 用于连接各个元器件。
电源: 提供系统所需的工作电压,通常为 5V 或 3.3V。
2.6 系统硬件电路图
下图展示了基于 Arduino UNO 和 DHT11 以及 LCD1602 的典型连接方式。如果使用 STM32,引脚连接方式类似,但需要根据 STM32 的具体 GPIO 定义进行调整。
+-------------------+
| Arduino UNO |
| |
| 5V <-----> VCC (DHT11)
| GND <-----> GND (DHT11)
| Digital Pin X <-> DATA (DHT11) --+-- 10kΩ Resistor --+-- 5V
| |
| 5V <-----> VCC (LCD1602)
| GND <-----> GND (LCD1602)
| Digital Pin Y <-> RS (LCD1602)
| Digital Pin Z <-> EN (LCD1602)
| Digital Pin A <-> D4 (LCD1602)
| Digital Pin B <-> D5 (LCD1602)
| Digital Pin C <-> D6 (LCD1602)
| Digital Pin D <-> D7 (LCD1602)
| PWM Pin <-> Backlight (LCD1602) (可选,通过电位器或数字引脚控制亮度)
| A0 <-> RW (LCD1602) (GND或VCC,根据LCD模块确定)
| A1 <-> VO (LCD1602) (连接电位器,调节对比度)
+-------------------+
注释:
DHT11 DATA 引脚的上拉电阻: DHT11 的 DATA 引脚必须连接一个 10kΩ 的上拉电阻到 VCC。这对于确保单总线通信的正确性至关重要。
LCD1602 连接:
如果使用 I2C 模块的 LCD1602,则只需要连接 SDA 和 SCL 到 Arduino 的相应 I2C 引脚(UNO 上通常是 A4 和 A5),以及 VCC 和 GND。这将大大简化布线。
图示为并联模式下的连接,需要较多的 GPIO 引脚。
引脚分配: 数字引脚 X, Y, Z, A, B, C, D 均为示例,具体连接时请根据 Arduino UNO 的可用数字引脚进行选择,并在代码中相应配置。
3. 系统软件设计与代码实现
软件部分主要包括 DHT11 传感器的数据读取、解析、错误校验以及数据显示。这里以 Arduino 平台为例进行说明,因为它对 DHT11 和 LCD1602 都有成熟的库支持,非常便于开发。
3.1 引入必要的库文件
在 Arduino IDE 中,您需要安装 DHT sensor library
和 LiquidCrystal
(或 LiquidCrystal_I2C
如果使用 I2C LCD) 库。
打开 Arduino IDE。
点击
工具
->管理库...
。搜索
DHT sensor library
并安装 Adafruit 公司提供的库。搜索
LiquidCrystal
(如果使用并联 LCD) 或LiquidCrystal_I2C
(如果使用 I2C LCD) 并安装。
3.2 代码示例(基于 Arduino UNO + DHT11 + I2C LCD1602)
此代码示例假设您使用 I2C 接口的 LCD1602,这样可以节省大量的 GPIO 引脚。
#include <Wire.h>
// 引入I2C通信库#include <LiquidCrystal_I2C.h>
// 引入I2C LCD库#include <DHT.h>
// 引入DHT传感器库
// 定义DHT11传感器连接的数字引脚#define DHTPIN 2
// 将DHT11的数据引脚连接到Arduino的数字引脚2
// 定义DHT传感器的类型 (DHT11, DHT22, DHT21)#define DHTTYPE DHT11
// 如果使用DHT22,请改为DHT22// 初始化DHT传感器对象DHT dht(DHTPIN, DHTTYPE);
// 初始化I2C LCD1602对象
// 第一个参数是LCD的I2C地址,通常为0x27或0x3F,具体取决于您的LCD模块
// 第二个参数是LCD的列数,第三个参数是LCD的行数LiquidCrystal_I2C lcd(0x27, 16, 2);
// 假设I2C地址为0x27,16列2行void setup() {
Serial.begin(9600);
// 启动串口通信,用于调试输出
Serial.println("DHT11 I2C LCD 温湿度检测系统启动...");
dht.begin(); // 初始化DHT传感器
lcd.init(); // 初始化LCD
lcd.backlight(); // 打开LCD背光
// 在LCD上显示欢迎信息
lcd.setCursor(0, 0); // 设置光标到第一行第一列
lcd.print("正在初始化...");
lcd.setCursor(0, 1); // 设置光标到第二行第一列
lcd.print("请稍候...");
delay(2000); // 延时2秒
lcd.clear(); // 清空LCD屏幕}void loop() { // DHT11传感器两次读数之间至少需要2秒间隔,
否则可能会读到错误数据
delay(2000); // 读取湿度数据
float h = dht.readHumidity(); // 读取温度数据(摄氏度)
float t = dht.readTemperature(); // 读取温度数据(华氏度)
// float f = dht.readTemperature(true); // 如果需要华氏度
// 检查是否成功读取数据
if (isnan(h) || isnan(t)) {
Serial.println("DHT传感器读取失败!请检查接线。");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("读取失败!");
lcd.setCursor(0, 1);
lcd.print("请检查DHT11!"); return; // 退出当前循环,等待下次重试
} // 华氏度到摄氏度的转换示例 (如果需要)
// float hic = dht.computeHeatIndex(t, h, false);
// float hif = dht.computeHeatIndex(f, h, true);
Serial.print("湿度: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("温度: ");
Serial.print(t);
Serial.println(" *C "); // 在LCD上显示数据
lcd.setCursor(0, 0); // 设置光标到第一行第一列
lcd.print("湿度: ");
lcd.print(h, 1); // 显示湿度,保留一位小数
lcd.print("% "); // 添加单位和空格,覆盖可能残留的字符
lcd.setCursor(0, 1); // 设置光标到第二行第一列
lcd.print("温度: ");
lcd.print(t, 1); // 显示温度,保留一位小数
lcd.print((char)223); // 显示度数符号 '°'
lcd.print("C "); // 添加单位和空格,覆盖可能残留的字符}
3.3 代码详解
#include <Wire.h>
: 包含了 Arduino I2C 通信库,I2C LCD 模块需要使用此库进行通信。#include <LiquidCrystal_I2C.h>
: 包含了 I2C LCD 显示屏的库,提供了方便的函数来控制 LCD 显示内容。#include <DHT.h>
: 包含了 DHT 传感器库,提供了读取 DHT11/DHT22 等传感器数据的接口。#define DHTPIN 2
: 定义了 DHT11 传感器数据引脚连接到 Arduino 的数字引脚 2。您可以根据实际接线修改此值。#define DHTTYPE DHT11
: 定义了所使用的 DHT 传感器类型为 DHT11。如果您使用的是 DHT22,请将其修改为DHT22
。DHT dht(DHTPIN, DHTTYPE);
: 创建一个DHT
对象,用于与 DHT 传感器进行通信。LiquidCrystal_I2C lcd(0x27, 16, 2);
: 创建一个LiquidCrystal_I2C
对象,用于控制 LCD 显示屏。0x27
是 I2C LCD 模块的默认地址,有些模块可能是0x3F
。如果您的 LCD 不显示,请尝试更改此地址。16
表示 LCD 有 16 列。2
表示 LCD 有 2 行。void setup()
函数:Serial.begin(9600);
: 初始化串口通信,波特率为 9600 bps。这允许您通过 Arduino IDE 的串口监视器查看调试信息。dht.begin();
: 初始化 DHT 传感器。lcd.init();
: 初始化 LCD 屏幕。lcd.backlight();
: 打开 LCD 的背光。lcd.setCursor(0, 0);
和lcd.print();
: 在 LCD 上显示初始欢迎信息。void loop()
函数:delay(2000);
: 这是非常重要的。DHT11 传感器在两次读数之间需要至少 2 秒的间隔,否则可能会返回无效数据。float h = dht.readHumidity();
: 读取湿度值并存储在h
变量中。float t = dht.readTemperature();
: 读取温度值(摄氏度)并存储在t
变量中。if (isnan(h) || isnan(t))
: 检查读取到的数据是否为无效数字(Not-a-Number)。如果dht.readHumidity()
或dht.readTemperature()
返回NaN
,则表示读取失败,通常是由于接线错误或传感器故障。Serial.print(...)
和Serial.println(...)
: 将温湿度数据打印到串口监视器,方便调试。lcd.setCursor(...)
和lcd.print(...)
: 将温湿度数据显示到 LCD 屏幕上。lcd.print(h, 1);
:h
是浮点数,, 1
表示保留一位小数。lcd.print((char)223);
:(char)223
是 LCD 字符集中表示度数符号°
的 ASCII 值。
4. 系统测试与调试
在完成硬件连接和代码上传后,您需要进行测试和调试以确保系统正常工作。
检查接线: 仔细核对所有元器件的接线是否正确,特别是 DHT11 的 DATA 引脚是否连接了上拉电阻。
上传代码: 将上述代码通过 Arduino IDE 上传到您的 Arduino UNO 板。
串口监视器: 打开 Arduino IDE 的串口监视器(工具 -> 串口监视器),观察是否有温湿度数据输出,以及是否有错误信息。
LCD 显示: 检查 LCD 屏幕是否正常显示温湿度数据。如果显示乱码或无显示,请检查 I2C 地址是否正确(对于 I2C LCD),或并联连接是否正确(对于并联 LCD)。可以尝试调整 LCD 上的电位器来调节对比度。
数据准确性: 将 DHT11 传感器暴露在不同温度和湿度的环境中,观察数据的变化是否符合预期。例如,用手握住传感器会使温度升高。
5. 优化与扩展
数据存储与分析: 可以将温湿度数据存储到 SD 卡,或通过网络(例如 ESP8266/ESP32 Wi-Fi 模块)上传到云平台,进行长期的数据记录和分析。
报警功能: 根据预设的阈值,当温度或湿度超出范围时,可以触发蜂鸣器、LED 灯或发送短信/邮件进行报警。
供电优化: 对于电池供电的应用,可以考虑使用更低功耗的微控制器和传感器,并优化代码以进入低功耗模式。
用户界面: 可以添加按键,实现切换显示模式(例如显示最大/最小值)、校准等功能。
多传感器: 如果需要监测多个区域的温湿度,可以连接多个 DHT11 传感器,但需要注意每个 DHT11 都需要独立的 GPIO 引脚和数据读取逻辑。
显示升级: 如果需要更丰富的图形界面,可以考虑使用 TFT 彩色显示屏,但其驱动会更复杂。
6. 总结
基于 DHT11 的温湿度检测系统是一个典型的嵌入式应用案例,它结合了传感器技术、微控制器编程和人机交互。通过本设计,您不仅可以实现一个实用的温湿度监测设备,还能深入理解传感器数据采集、数字通信协议、微控制器编程以及外部设备驱动等核心概念。选择合适的元器件并理解其工作原理是构建稳定可靠系统的关键。此系统易于构建和扩展,为进一步的物联网项目奠定了基础。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。