温湿度传感器DHT11的简单应用

news2024/12/23 10:57:51

文章目录

  • 一、DHT11是什么?
  • 二、使用步骤
    • 1.硬件
      • 1.硬件连接
      • 2.工作原理
        • 1.串行单总线
        • 2.温湿度数据采集原理
    • 2.软件
      • 1.DHT11初始化如下(示例):
      • 2.DHT11复位如下(示例):
      • 3.等待DHT11的回应如下(示例):
      • 4.检测DHT11是否正常代码如下(示例):
      • 5.DHT11读取一个字节代码如下(示例):
      • 6.DHT11读取一个位数据代码如下(示例):
      • 7.DHT11读取温湿度数据代码如下(示例):
      • 8.DHT11采集温湿度数据代码如下(示例):
      • 9.测试结果:
        • 1.上电状态
        • 2.湿纸巾状态
  • 三、总结


一、DHT11是什么?

DHT11是一种温湿度传感器模块,用于测量环境的温度和湿度。它采用数字信号输出,使用单总线通信协议,具有低成本、简单易用的特点。

DHT11传感器由一个温度传感器和一个湿度传感器组成,内部集成了模拟信号读取、数字信号处理和校准等功能。传感器通过测量热敏电阻来获取环境温度,并通过测量湿度敏感电阻来获取环境湿度。它将温度和湿度转换为数字信号,通过单总线通信协议将数据传输给主控设备。

DHT11传感器模块的工作电压通常为3.3V或5V,可以与各类微控制器(如Arduino、Raspberry Pi等)进行连接和交互。通过简单的代码和接线,你可以读取DHT11传感器提供的温度和湿度数值,从而监测和控制环境的温湿度。

需要注意的是,DHT11相对于其他高精度传感器而言,其精度较低,温湿度测量的范围和精确度也相对有限,见下面参数表。

在这里插入图片描述
相关重要参数如下:

参数规格
工作电压3.3V-5.5V
外形尺寸23.2(L)mm ×12.5(W)mm
测量范围温度:-20~+60℃ 湿度:5~95%RH
精度温度:±2℃ 湿度:±5%RH (25℃)
分辨率温度:0.1℃ 湿度:1%RH
衰减值温度:<0.1℃/年 湿度:<1%RH/年
输出信号单总线数字信号
外壳材料ABS塑料
重量1g
引脚数3/4(有一个空脚)

二、使用步骤

1.硬件

1.硬件连接

硬件相对比较简单,DHT11的数据接单片机IO口即可。这里我用的是主控STM32F103C8的PA4.

/* Defines ------------------------------------------------------------------*/
#define DHT11_GPIO_RCC  RCC_APB2Periph_GPIOA
#define DHT11_GPIO_Port GPIOA
#define DHT11_Pin       GPIO_Pin_4//根据实际的引脚修改

2.工作原理

1.串行单总线

串行单总线是一种通信协议,它允许多个设备通过共享同一条数据线进行通信。在这种协议中,每个设备都有一个唯一的地址,主控设备可以通过这个地址来选择特定的设备进行通信。这种通信方式可以减少连接线的数量,降低成本,并简化系统设计。

DHT11之所以采用串行单总线通信,主要是出于简单、成本低廉和易用性的考虑。采用串行单总线通信可以大大简化DHT11模块与主控设备(比如微控制器)的连接,只需要一根数据线即可完成通信,从而降低了连接复杂性和成本。此外,串行单总线通信也使得多个传感器可以共享同一条数据线,方便在系统中同时使用多个传感器模块。

2.温湿度数据采集原理

1.DHT11传输的40位数据包括湿度整数数据、湿度小数数据、温度整数数据、温度小数数据和校验位。这些数据的传输顺序是高位先出的,也就是从最高位开始传输到最低位。

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

2.每个数据位的传输格式如下:

位数据“0”:先发送一个持续时间为54微秒的低电平信号,然后是一个持续时间在23至27微秒之间的高电平信号。
位数据“1”:先发送一个持续时间为54微秒的低电平信号,然后是一个持续时间在68至74微秒之间的高电平信号。

3.此外,校验位的计算方式是将湿度整数数据、湿度小数数据、温度整数数据和温度小数数据相加,得到的结果应与传输的校验位数据相等。

8bit校验位=8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据

2.软件

1.DHT11初始化如下(示例):


/*******************************************************************************
 * 函数名:DHT11_Init
 * 描述  :DHT11初始化
 * 输入  :void
 * 输出  :uint8_t
 * 调用  :
 * 备注  :返回0:存在  返回1:未检测到DHT11的存在
 *******************************************************************************/
uint8_t DHT11_Init(void)
{	
	delay_syms(1000);//在上电后到对DHT11初始化前应有1s的稳定期,等待传感器稳定。可以在单片机上电后采用1s延时处理。	
	DHT11_RST();//DHT11端口复位,发出起始信号
	return DHT11_Check();//等待DHT11回应
}

2.DHT11复位如下(示例):

/*******************************************************************************
 * 函数名:DHT11_RST
 * 描述  :DHT11复位
 * 输入  :void
 * 输出  :uint8_t
 * 调用  :
 * 备注  :DHT11开始信号
 *******************************************************************************/
void DHT11_RST(void)
{
    DHT11_IO_OUT();//端口为输出	
	DHT11_IO_LOW();//使总线为低电平
	delay_syms(25);//拉低至少18ms
	DHT11_IO_HIGH();//使总线为高电平	
	Delay_20us();//主机拉高20~40us
}

3.等待DHT11的回应如下(示例):

/*******************************************************************************
 * 函数名:DHT11_Check
 * 描述  :等待DHT11的回应
 * 输入  :void
 * 输出  :uint8_t
 * 调用  :
 * 备注  :返回0:存在  返回1:未检测到DHT11的存在
 *******************************************************************************/
uint8_t DHT11_Check(void) 	   
{   
	uint8_t retry = 0;
	DHT11_IO_IN(); 
    while((DHT11_IO_Read()) && retry < 100)//DHT11会拉低40~80us
	{
		retry++;
		Delay_2us();
	};	 
	if(retry >= 100) return 1;
	else retry = 0;
    while ((!DHT11_IO_Read()) && retry < 100)//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		Delay_2us();
	};
	if(retry >= 100) return 1;	    
	return 0;
}

4.检测DHT11是否正常代码如下(示例):

/*******************************************************************************
 * 函数名:DHT11_Detection
 * 描述  :检测DHT11是否正常
 * 输入  :void
 * 输出  :uint8_t
 * 调用  :
 * 备注  :返回0:存在  返回1:未检测到DHT11的存在
 *******************************************************************************/
void DHT11_Detection(void)
{
    if(DHT11_Init() == 0)
	{
		DHT11_flag = 1;
		printf("DHT11 OK\r\n");	
	}
    else
	{	
		DHT11_flag = 0;
		printf("DHT11 Fail\r\n");				
	}			
}

5.DHT11读取一个字节代码如下(示例):

/*******************************************************************************
 * 函数名:DHT11_Read_Byte
 * 描述  :DHT11读取一个字节
 * 输入  :void
 * 输出  :uint8_t
 * 调用  :
 * 备注  :返回值:读到的数据
 *******************************************************************************/
uint8_t DHT11_Read_Byte(void)
{
    uint8_t i, dat;
    dat = 0x00;
    for (i = 0; i < 8; i++)
    {
        dat <<= 1;//左移运算符,dat左移1位
        dat |= DHT11_Read_Bit();
    }
    return dat;
}

6.DHT11读取一个位数据代码如下(示例):

/*******************************************************************************
 * 函数名:DHT11_Read_Bit
 * 描述  :DHT11读取数据  读取一个位
 * 输入  :void
 * 输出  :uint8_t
 * 调用  :
 * 备注  :返回0/1
 *******************************************************************************/
uint8_t DHT11_Read_Bit(void)
{
    uint8_t retry = 0;
    while((DHT11_IO_Read() == 1) && retry < 100) //等待变为低电平
    {
        retry++;
		Delay_2us();
    }
    while((DHT11_IO_Read() == 0) && retry < 100) //等待变高电平
    {
        retry++;
		Delay_2us();
    }	
	Delay_20us();
	Delay_20us();		
    if(DHT11_IO_Read() == 1) //用于判断高低电平,即数据1或0
    {
        return 1;
	}
    else
    {
       return 0;
	}
}

7.DHT11读取温湿度数据代码如下(示例):

/*******************************************************************************
 * 函数名:DHT11_Read_Data
 * 描述  :DHT11读取一次数据
 * 输入  :temp:温度值(范围:0~50°)
           humi:湿度值(范围:20%~90%)
 * 输出  :uint8_t
 * 调用  :
 * 备注  :返回值:0,正常;1,读取失败
 *******************************************************************************/
uint8_t DHT11_Read_Data(uint8_t *temphigh, uint8_t *templow, uint8_t *humi)
{
    uint8_t buf[5];
    uint8_t i;
    DHT11_RST();//DHT11端口复位,发出起始信号
    if(DHT11_Check() == 0)//等待DHT11回应,0为成功回应
    {
        for(i = 0; i < 5; i++) //读取40位数据
        {
            buf[i] = DHT11_Read_Byte();//读出数据
        }
        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])	//数据校验
        {
            *humi = buf[0];//将湿度整数值放入指针humi
            *temphigh = buf[2];//将温度整数值放入指针temphigh
            *templow = buf[3];//将温度小数值放入指针templow					
        }
    }
    else return 1;
    return 0;
}

8.DHT11采集温湿度数据代码如下(示例):

/*******************************************************************************
 * 函数名:DHT11_Collect_data
 * 描述  :DHT11采集温湿度数据
 * 输入  :void
 * 输出  :void
 * 调用  :1s
 * 备注  :
 *******************************************************************************/
void DHT11_Collect_data(void)
{
    uint8_t humidity = 0;
    uint8_t tempe_high = 0;	
    uint8_t tempe_low = 0;		
	if(DHT11_Read_Data(&tempe_high,&tempe_low,&humidity) == 0)
	{			
       DHT11_humi = humidity;
       DHT11_temp_high = tempe_high;	
       DHT11_temp_low = tempe_low;				
	   printf("DHT11_temp_high = %d\r\n",DHT11_temp_high);		
	   printf("DHT11_temp_low = %d\r\n",DHT11_temp_low);				
	   printf("DHT11_humi = %d\r\n",DHT11_humi);						
	}	
	else
	{
	   printf("DHT11 DATA Fail\r\n");					
	}		
}

显示部分,这里的显示是用0.96寸OLED显示的,不懂的话可以参考我的另外一篇博客:0.96寸OLED(IIC接口)显示屏的图像显示应用

注意:OLED字模库没有包含°,也没特地去取°,不影响温湿度的数据显示。

/*******************************************************************************
 * 函数名:OLED_Rfresh
 * 描述  :OLED实时显示数据刷新
 * 输入  :void
 * 输出  :void
 * 调用  :1s
 * 备注  :
 *******************************************************************************/
void OLED_Rfresh(void)
{
  if(DHT11_flag)
	{
	  OLED_ShowString(1, 1, "Temp:");	
      OLED_ShowSignedNum(1, 6, DHT11_temp_high, 2);		
	  OLED_ShowString(1, 9, ".");	
	  OLED_ShowSignedNum(1, 9, DHT11_temp_low, 1);
	  OLED_ShowString(1, 11, "C");		
	  OLED_ShowString(2, 1, "Humi:");			
      OLED_ShowSignedNum(2, 6, DHT11_humi, 2);	
	  OLED_ShowString(2, 9, "%");				
	}		
}

9.测试结果:

1.上电状态

在这里插入图片描述
上电串口打印DHT11 OK表示DHT11工作正常

uint8_t DHT11_temp_high = 0;//温度高位
uint8_t DHT11_temp_low = 0;//温度低位
uint8_t DHT11_humi = 0;//湿度

在这里插入图片描述

2.湿纸巾状态

由于要让湿度变化明显比较容易,所以咱直接湿纸巾盖上去。
在这里插入图片描述
可以发现湿度变化比较大,温度也有稍微变化,毕竟水降点温。
在这里插入图片描述


三、总结

今天简单介绍了温湿度传感器DHT11的温湿度数据采集及显示,感谢你的观看,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1303368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序过滤器之计算当前时间差

微信小程序过滤器之计算当前时间差 前言一、wxs简介二、使用步骤1.定义2.使用 前言 最近遇到了一个需求&#xff0c;将小程序里面的具体时间2023-12-11 09:41:06转为当前时间差10小时前&#xff0c;这块可以使用js逻辑函数对数据进行处理&#xff0c;但这里我们采用微信小程序…

Linux系统vim,gcc,g++工具使用及环境配置,动静态库的概念及使用

Linux系统vim&#xff0c;gcc&#xff0c;g工具使用及环境配置&#xff0c;动静态库的概念及使用 1. Linux编辑器-vim的使用1.1 vim的基本概念1.2vim的基本操作1.3vim正常模式命令集1.4vim末端模式命令集1.5简单的vim配置 2.Linux编译器-gcc/g的使用2.1 准备阶段2.2gcc的使用2.…

DevEco Studio将编辑器整体文本改为简体中文

我们打开编辑器 随便进入一个项目 这里 我们左上角目录 选择 File下面菜单中的 Settings… 打开配置界面 然后在设置窗口左侧导航栏中 选择 Plugins 插件 然后上方导航栏中 选择 Installed 参考下图 然后 找到这个Chinese(Simplified) Chinese是什么应该不用我多说吧 我们把…

多合一iPhone 解锁工具:iMyFone LockWiper iOS

多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备&#xff0c;包括最新的 iOS 17 和 iPhone 1…

从零构建属于自己的GPT系列5:模型部署1(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

Nginx的location和rewrite的使用

目录 常用的Nginx 正则表达式 location location 大致可以分为三类&#xff1a; 精准匹配&#xff1a;location / {...} 一般匹配&#xff1a;location / {...} 正则匹配&#xff1a;location ~ / {...} location 常用的匹配规则 location 优先级 location 示例说明…

day45-46-Vue+ElementUI实现学生管理

VueElementUI实现学生管理 代码&#xff1a; qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考虑需求&#xff08;登录&#xff0c;查询全部&#xff0c;基本增删改查&#xff0c;分页&#xff0c;搜索&#xff0c;批量&#xff09; 设计数据库搭建项目 后端…

【开源】基于Vue+SpringBoot的教学资源共享平台

文末获取源码&#xff0c;项目编号&#xff1a; S 068 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S068。} 文末获取源码&#xff0c;项目编号&#xff1a;S068。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

算法:买卖股票的最佳时机(快慢指针和动态规划)

快慢指针 时间复杂度 O(n) 空间复杂度 O(1) /*** param {number[]} prices* return {number}*/ var maxProfit function (prices) {let l 0let r 1let temp 0while (r < prices.length - 1) {// 如果当前左值大于右值说明当前不是最佳买入时机// 所以将右指针赋值给左指…

2023年华为HCIA认证H12-811题库讲解

在VRP平台上&#xff0c;可以通过下面哪种方式返回到上一条历史命令&#xff1f;&#xff08; &#xff09; A、Ctr1U B、Ctr1P C、左光标 D、上光标 试题答案&#xff1a;BD 试题解析&#xff1a;在VRP系统中&#xff0c;ctrlU为自定义快捷键&#xff0c;ct…

六级高频词组2

目录 词组 参考链接 词组 51. arise from&#xff08;be caused by&#xff09; 由…引起。 52. arrange for sb.sth. to do sth. 安排…做… 53. arrive on 到达&#xff1b; arrive at 到达某地&#xff08;小地方&#xff09;&#xff1b;得出&#xff0c;作出&#x…

EasyExcel使用模板导出复杂Excel

1&#xff09;添加easyexlce的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.0-beta1</version> </dependency>2&#xff09;添加excel模板文件 实现的效果&#xff1a;…

k8s一键部署uniswap

1、拉取uniswap源码 github地址 2、编写Dockerfile并打镜像 # Set the base image FROM node:18.10.0# WORKDIR /usr/src/app/ WORKDIR /home/gateway# Copy files COPY ./ /home/gateway/# Dockerfile author / maintainer LABEL maintainer"Michael Feng <mikehummi…

VSCode使用Remote-SSH连接服务器时报错:无法与“***”建立连接: XHR failed.

关于VSCode的报错问题&#xff1a;无法与“***”建立连接: XHR failed 问题描述问题理解解决方法手动在本地下载安装包&#xff0c;然后手动传到服务器端 问题描述 是的&#xff0c;我又踩坑了&#xff0c;而且这个弄了好久&#xff0c;也重新装了VSCode软件&#xff0c;好像结…

IDEA 2023.3 start failed 启动失败修复

发现是 RestfulToolkit 插件有冲突导致的&#xff0c;删除插件后成功启动 open ~/Library/Application\ Support/JetBrains/IntelliJIdea2023.3/plugins参考&#xff1a;https://youtrack.jetbrains.com/issue/IDEA-340080/Critical-startup-error-after-upgrading-to-Intelli…

Xxl-Job在Linux环境下安装部署

文章目录 Xxl-Job简介环境准备安装下载安装包解压安装包初始化数据库文件修改配置文件打包启动 访问 Xxl-Job简介 Xxl-Job是一个分布式任务调度平台&#xff0c;作者是美团的研发工程师许雪里&#xff0c;Xxl命名的由来盲猜是作者的名字首字母&#xff0c;Job为任务。 环境准…

深入理解模板引擎:解锁 Web 开发的新境界(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

服务器数据恢复—raid5少盘状态下新建raid5如何恢复原raid5数据?

服务器数据恢复环境&#xff1a; 一台服务器上搭建了一组由5块硬盘组建的raid5阵列&#xff0c;服务器上层存放单位重要数据&#xff0c;无备份文件。 服务器故障&分析&#xff1a; 服务器上raid5有一块硬盘掉线&#xff0c;外聘运维人员在没有了解服务器具体情况下&#x…

【C语言程序设计】顺序结构程序设计

目录 前言 一、程序阅读 二、程序改错 三、程序设计 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转…

简单的 u-popup 弹出框

uniapp中的popup组件可以用于弹出简单的提示框、操作框、菜单等。它可以通过position属性控制弹出框的位置&#xff0c;不同的position值会使得弹出框呈现不同的弹出形式 目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 …