DHT11温湿度传感器详解(STM32)

06-01 640阅读

目录

 一、介绍

 二、传感器原理

1.原理图

2.工作时序

3.起始信号与响应信号

4.读数据时序

 5.DHT11数据格式

三、程序设计

 main.c文件

 dht11.h文件

 dht11.c文件

四、实验效果展示

 五、资料获取

  项目分享

 一、介绍

        DHT11是一款含有已校准数字信号输出的温湿度复合传感器,采用了自主研发的集成式数字温湿度元件,应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。DHT11传感器内包含一个温湿度测量元件和一个高性能MCU。

DHT11温湿度传感器详解(STM32)

 以下是DHT11温湿度传感器的参数:

供电电压 

DC:3.3-5.5V

工作范围(温度)

-20~+60℃

量程范围(湿度)

5~95%RH

温度精度

±2℃

湿度精度

±5%RH

重复性

温度:±1℃ ;湿度:±1%RH

迟滞(温度)

±0.3℃

迟滞(湿度)

±0.3%RH

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV182421Z7by/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 

 二、传感器原理

1.原理图

DHT11温湿度传感器详解(STM32)  单总线上必须有一个上拉电阻(R1)以实现单总线闲置时,其处于高电平状态

2.工作时序

DHT11温湿度传感器详解(STM32)

DHT11温湿度传感器详解(STM32)

符号

参数

最小

典型

最大

单位

Tbe

主机起始信号拉低时间

18

20

30

ms

Tgo

主机释放单总线时间

10

13

35

us

Trel

响应低电平时间

78

83

88

us

Treh

响应高电平时间

80

87

92

us

3.起始信号与响应信号

DHT11温湿度传感器详解(STM32)

DHT11温湿度传感器详解(STM32)

4.读数据时序

DHT11温湿度传感器详解(STM32)

DHT11温湿度传感器详解(STM32)

 5.DHT11数据格式

DHT11温湿度传感器详解(STM32)

 34H + 01H + 18H + 8CH = D9H

        湿度高8位(整数)为34H,低8位(小数)为01H,将两部分数值转换为十进制后可以得出52.1,即湿度为52.1%RH。同理可以得出图7中的温度为-24.12℃。此处温度为负值时因为温度数据的低8位的最高位Bit7为1;当最高位Bit7为0时,数值为正值。

三、程序设计

1.使用STM32F103C8T6读取DHT11温湿度传感器采集的数据,通过串口发送至电脑

2.将读取得到的温湿度数据同时在OLED上显示

DHT11

PB5

OLED_SCL

PB11

OLED_SDA

PB10

串口

串口1

 main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "dht11.h"
#include "oled.h"
/*****************辰哥单片机设计******************
					  STM32
 * 项目			:	1.DHT11温度湿度传感器实验                     
 * 版本			:   V1.0
 * 日期			:   2024.8.4
 * MCU			:	STM32F103C8T6
 * 接口			:	参看DHT11.h							
 * BILIBILI	    :	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥 
**********************BEGIN***********************/
u8 temp;
u8 humi;
int main(void)
{ 
	
  SystemInit();//配置系统时钟为72M	
	delay_init(72);
	LED_Init();
	LED_On();
	USART1_Config();//串口初始化
	OLED_Init();
	printf("Start \n");
	delay_ms(1000);
	while(DHT11_Init())
	{
		printf("DHT11 Error \r\n");
		delay_ms(1000);
	}
	//显示“温度:”
	OLED_ShowChinese(1,1, 0);
	OLED_ShowChinese(1,2, 1);
	OLED_ShowChar(1, 5, ':');
	OLED_ShowChar(1, 9, 'C');	
	//显示“湿度:”
	OLED_ShowChinese(2,1, 2);
	OLED_ShowChinese(2,2, 1);
	OLED_ShowChar(2, 5, ':');	
	OLED_ShowChar(2, 9, '%');
	
  while (1)
  {
		DHT11_Read_Data(&temp,&humi);//
		printf("temp %d ,humi %d\r\n",temp,humi);
		LED_Toggle();
		delay_ms(1000);
		//显示温度数据
		OLED_ShowNum(1,6,temp,2);
		//显示湿度数据
		OLED_ShowNum(2,6,humi,2);
  }
}

 dht11.h文件

#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"                  // Device header
#include "delay.h"
/*****************辰哥单片机设计******************
				    STM32
 * 文件			:	DHT11温度湿度传感器h文件                   
 * 版本			:   V1.0
 * 日期			:   2024.8.4
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码							
 * BILIBILI	    :	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥
**********************BEGIN***********************
/***************根据自己需求更改****************/
//DHT11引脚宏定义
#define DHT11_GPIO_PORT  GPIOA
#define DHT11_GPIO_PIN   GPIO_Pin_6
#define DHT11_GPIO_CLK   RCC_APB2Periph_GPIOA
/*********************END**********************/
//输出状态定义
#define OUT 1
#define IN  0
//控制DHT11引脚输出高低电平
#define DHT11_Low  GPIO_ResetBits(DHT11_GPIO_PORT,DHT11_GPIO_PIN)
#define DHT11_High GPIO_SetBits(DHT11_GPIO_PORT,DHT11_GPIO_PIN)
u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度数据
u8 DHT11_Read_Byte(void);//读取一个字节的数据
u8 DHT11_Read_Bit(void);//读取一位的数据
void DHT11_Mode(u8 mode);//DHT11引脚输出模式控制
u8 DHT11_Check(void);//检测DHT11
void DHT11_Rst(void);//复位DHT11   
#endif

 dht11.c文件

#include "dht11.h"
#include "delay.h"
      
/*****************辰哥单片机设计******************
											STM32
 * 文件			:	DHT11温度湿度传感器c文件                   
 * 版本			: V1.0
 * 日期			: 2024.8.4
 * MCU			:	STM32F103C8T6
 * 接口			:	见dht11.h文件							
 * BILIBILI	:	辰哥单片机设计
 * CSDN			:	辰哥单片机设计
 * 作者			:	辰哥
**********************BEGIN***********************/			
			
//复位DHT11
void DHT11_Rst(void)	   
{                 
	DHT11_Mode(OUT); 	//SET OUTPUT
	DHT11_Low; 	      //拉低DQ
	delay_ms(20);    	//主机拉低18~30ms
	DHT11_High; 			//DQ=1 
	delay_us(13);     	//主机拉高10~35us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_Mode(IN);//SET INPUT	 
    while (GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry=100)return 1;
	else retry=0;
    while (!GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry=100)return 1;	    
	return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(GPIO_ReadInputDataBit(DHT11_GPIO_PORT,DHT11_GPIO_PIN)&&retry
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码