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

文章目录

  • 一、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的温湿度数据采集及显示,感谢你的观看,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

@Transactional失效问题

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 关于Transactional 日…

酷开科技多维度赋能营销,实力斩获三项大奖

在数智化新阶段、广告新生态、传播新业态的背景下&#xff0c;“第30届中国国际广告节广告主盛典暨网易传媒态度营销峰会”于11月18日在厦门国际会展中心盛大举行。来自全国的品牌方、战略决策者、媒体平台和品牌服务机构等汇聚一堂。在50000&#xff0b;现场观众和数千万线上观…

SSL证书HTTPS保护服务

SSL证书属于数字证书的其中一种&#xff0c;广泛用于https协议&#xff0c;从而可以让数据传输在加密前提下完成&#xff0c;确保HTTPS网络安全是申请SSL证书必要工作。 SSL证书是主要用于https是一种加密协议&#xff0c;仔细观察网站地址会发现目前主流的网址前面都会有http…

Linux操作系统学习(零)、计算机概论

计算机概论 指令集 CPU中含有多种指令集&#xff0c;指令集对于CPU运算具有指导和优化的硬程序&#xff0c;用来引导CPU进行加减运算和控制计算机操作系统的一系列指令的集合 常见的就有微指令集RISC和复杂指令集CISC RISC&#xff1a;包括ARM架构和PPC架构 CISC&#xff…

HTML面试题---专题四

文章目录 一、前言二、如何在 HTML 中嵌入音频文件&#xff1f;三、解释 <script> 标签中 defer 属性的用途。四、如何在 HTML 中创建粘性/固定导航栏&#xff1f;五、HTML 中的 span 元素的用途是什么&#xff1f;六、如何使 HTML 元素可拖动&#xff1f;七、解释 <i…

项目中使用Arrays.asList、ArrayList.subList的坑

使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用&#xff1a; List<Integer> statusList Arrays.asList(1, 2); System.out.println(statusList); System.out.println(statusList.contains(1)); System.out.println(statusList.contains(3)…

如何打造稳健高效的数据库的基础设施?数据库云提出创新方案

引言 数据库的云化、丰富业务场景下多元的数据库类型、公有云与私有云交织的IT架构&#xff0c;叠加信创影响使得企业内部的基础设施日益复杂&#xff0c;如何高效管理多元的数据库和多云异构基础设施正成为企业面临的严峻挑战。 在此背景下&#xff0c;数据库云应运而生。数…

六级翻译之印章

好像大房子挺难得 三段式 1Since ancient from now&#xff0c;seals have been a symbol of power and certerfiction of identity.seals not only practical but also is a form of art.Seal is an ancient art combining with manafutuer of crafting and desgin of…

界面控件DevExpress中文教程 - 如何用Office File API组件填充PDF表单

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion替换背景

在Stable Diffusion软件中,使用ControlNet+模型实现固定物体批量替换背景 出图的流程。 一、准备好图片 1.你需要准备好一些白底图或者透明底图用于训练模型。 2.你需要准备同样角度的其他背景色底图用于ControlNet勾线 3.注意检查你的图片尺寸,是否为1:1,…

安防 音响 车载等产品中音频接口选型的高性能国产芯片分析

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

STM32 CAN多节点组网项目实操 挖坑与填坑记录

摘要 CAN线性组网项目开发过程中遇到的数据丢包问题&#xff0c;并尝试解决的记录和推测分析。 关键词 CAN串联多节点通讯、CAN10节点通讯、CAN数据丢包、STM32 CAN 背景/项目介绍 概述&#xff1a; 开发了一个多节点线性组网采集数据的项目。 系统包含1个供电和数据网关板还有…

mysql:查看一个表的索引信息

可以使用命令SHOW INDEX FROM table_name;查看一个表的索引信息&#xff0c;例如&#xff1a;

NGROK内网穿透工具-实战+源码下载

1、功能概述&#xff1f; 本案例中使用ngrok内网穿透工具&#xff0c;使用方便&#xff0c;不需要注册等麻烦的操作&#xff0c;永久使用&#xff0c;一键搞定。 我们在项目中有这样一种需求&#xff1a; 甲方&#xff1a;汤工你能不能把你们正在开发的项目或者页面发给我看…

vue脚手架创建项目

安装 npm install -g vue/cli 如果报错可以尝试使用cnpm 查看命令 vue -V 创建项目 vue create 项目名称 输入y 上下选中选项 Manually select features &#xff08;自由选择&#xff09;&#xff0c;回车 vue 版本的选择 其他按需要选择 项目创建成功&#xff0c;…

C++基础知识

目录 前言&#xff1a; 命名空间 命名空间的定义 命名空间的使用 c输入与输出 缺省参数 函数重载 引用 引用的特性 常引用 引用的使用场景 引用做参数 引用做返回值 引用与指针的区别 内联函数 内联函数的特性 前言&#xff1a; C 语言是结构化和模块化的语言&…

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

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

【教程】制作 iOS 推送证书

​ 目录 证书类型 MAC Key Store 消息推送控制台 制作证书 创建苹果 App ID 使用appuploder制作 .p12文件 创建证书 如需向 iOS 设备推送数据&#xff0c;您首先需要在消息推送控制台上配置 iOS 推送证书。iOS 推送证书用于推送通知&#xff0c;本文将介绍消息推送服务支…

以企业架构为中心的SABOE数字化转型五环法

文章目录 01 传统企业数字化转型面临诸多挑战02 SABOE数字化转型五环法为企业转型破除迷雾 01 传统企业数字化转型面临诸多挑战 即将过去的2023年&#xff0c;chatGPT大模型、数据资产入表等事件的发生&#xff0c;标志着数字经济正在加速发展。数字经济是人类社会继农业经济、…

JS实现返利网注册系统(网页数据验证)

主代码 <!DOCTYPE HTMLPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><title>返利网注册</tit…