0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于 DHT11 的温湿度检测(原理图+代码)

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

来源: 电路城
2021-11-17
类别:工业控制
eye 47
文章创建人 拍明

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

基于 DHT11 的温湿度检测系统


基于 DHT11 的温湿度检测系统是一种成本效益高且易于实现的方案,广泛应用于环境监测、智能家居、农业大棚等领域。它能够实时获取当前环境的温度和湿度数据,并通过微控制器进行处理和显示。本设计将详细阐述其工作原理、核心元器件的选择与功能、完整的硬件电路图以及相应的软件代码实现。

image.png

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 STM32F103C8T6Arduino 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 libraryLiquidCrystal (或 LiquidCrystal_I2C 如果使用 I2C LCD) 库。

  1. 打开 Arduino IDE。

  2. 点击 工具 -> 管理库...

  3. 搜索 DHT sensor library 并安装 Adafruit 公司提供的库。

  4. 搜索 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 代码详解

  1. #include <Wire.h>: 包含了 Arduino I2C 通信库,I2C LCD 模块需要使用此库进行通信。

  2. #include <LiquidCrystal_I2C.h>: 包含了 I2C LCD 显示屏的库,提供了方便的函数来控制 LCD 显示内容。

  3. #include <DHT.h>: 包含了 DHT 传感器库,提供了读取 DHT11/DHT22 等传感器数据的接口。

  4. #define DHTPIN 2: 定义了 DHT11 传感器数据引脚连接到 Arduino 的数字引脚 2。您可以根据实际接线修改此值。

  5. #define DHTTYPE DHT11: 定义了所使用的 DHT 传感器类型为 DHT11。如果您使用的是 DHT22,请将其修改为 DHT22

  6. DHT dht(DHTPIN, DHTTYPE);: 创建一个 DHT 对象,用于与 DHT 传感器进行通信。

  7. LiquidCrystal_I2C lcd(0x27, 16, 2);: 创建一个 LiquidCrystal_I2C 对象,用于控制 LCD 显示屏。

    • 0x27 是 I2C LCD 模块的默认地址,有些模块可能是 0x3F。如果您的 LCD 不显示,请尝试更改此地址。

    • 16 表示 LCD 有 16 列。

    • 2 表示 LCD 有 2 行。

  8. 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 上显示初始欢迎信息。

  9. 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. 系统测试与调试

在完成硬件连接和代码上传后,您需要进行测试和调试以确保系统正常工作。

  1. 检查接线: 仔细核对所有元器件的接线是否正确,特别是 DHT11 的 DATA 引脚是否连接了上拉电阻。

  2. 上传代码: 将上述代码通过 Arduino IDE 上传到您的 Arduino UNO 板。

  3. 串口监视器: 打开 Arduino IDE 的串口监视器(工具 -> 串口监视器),观察是否有温湿度数据输出,以及是否有错误信息。

  4. LCD 显示: 检查 LCD 屏幕是否正常显示温湿度数据。如果显示乱码或无显示,请检查 I2C 地址是否正确(对于 I2C LCD),或并联连接是否正确(对于并联 LCD)。可以尝试调整 LCD 上的电位器来调节对比度。

  5. 数据准确性: 将 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)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告