STM32+DHT11采集温湿度传感器数据

这篇具有很好参考价值的文章主要介绍了STM32+DHT11采集温湿度传感器数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. DHT11介绍

        DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC
测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够
实时的采集本地湿度和温度。 DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一
I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式
进行校验,有效的保证数据传输的准确性。 DHT11 功耗很低, 5V 电源电压下,工作平均最大
电流 0.5mA
DHT11 的技术参数如下:
工作电压范围: 3.3V-5.5V
工作电流 :平均 0.5mA
输出:单总线数字信号
测量范围:湿度 20~90 RH ,温度 0~50
精度 :湿度± 5% ,温度± 2
分辨率 :湿度 1% ,温度 1
DHT11 的管脚排列如下图 :

STM32+DHT11采集温湿度传感器数据,stm32,嵌入式硬件,单片机

        DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向
传输。其数据包由 5Byte 40Bit )组成。数据分小数部分和整数部分,一次完整的数据传输为
40bit ,高位先出。 DHT11 的数据格式为: 8bit 湿度整数数据 +8bit 湿度小数数据 +8bit 温度整数
数据 +8bit 温度小数数据 +8bit 校验和。其中校验和数据为前四个字节相加。 传感器数据输出的是未编码的二进制数据。数据( 湿度、温度、整数、小数 ) 之间应该分开 处理。
STM32+DHT11采集温湿度传感器数据,stm32,嵌入式硬件,单片机
由以上数据就可得到湿度和温度的值,计算方法:
湿度 = byte4 . byte3=45.0 ( RH)
温度 = byte2 . byte1=28.0 ( )
校验 = byte4+ byte3+ byte2+ byte1=73(= 湿度 + 温度 )( 校验正确 )。
可以看出, DHT11 的数据格式是十分简单的, DHT11 MCU 的一次通信最大为 3ms 左右,
建议主机连续读取时间间隔不要小于 100ms

2. DHT11 的传输时序

DHT11 的数据发送流程如图:
STM32+DHT11采集温湿度传感器数据,stm32,嵌入式硬件,单片机
首先主机发送开始信号,即:拉低数据线,保持 t1 (至少 18ms )时间,然后拉高数据线 t2
20~40us )时间,然后读取 DHT11 的响应,正常的话, DHT11 会拉低数据线,保持 t3 40~50us )时间,作为响应信号,然后 DHT11 拉高数据线,保持 t4 40~50us )时间后,开始输出数据。
DHT11 输出数字‘ 0 ’的时序如图:

STM32+DHT11采集温湿度传感器数据,stm32,嵌入式硬件,单片机

 DHT11 输出数字‘1’的时序如图:

STM32+DHT11采集温湿度传感器数据,stm32,嵌入式硬件,单片机

 3. STM32程序编写

硬件连接:

使用的单片机型号是:STM32F103C8T6

引脚连接:

+ 接 5V

- 接 GND

S 接 PB12

程序编写:

ht11.c:

实现了DHT11传感器读取温湿度数据的功能,具体实现流程如下:

  1. 定义DHT11的引脚号和初始化GPIO的函数,包括输出模式和输入模式的初始化。

  2. 定义发送开始信号的函数,即先将DQ拉低20ms以上,再拉高20~40us,以唤醒DHT11。

  3. 定义检测DHT11回应的函数,即等待DHT11将DQ拉低40~80us,再拉高40~80us,如果在100次内没有检测到DHT11回应,则返回1表示未检测到。

  4. 定义从DHT11读取一个位的函数,即等待DQ变为低电平,再等待变高电平,最后延时40us,返回读取到的值。

  5. 定义从DHT11读取一个字节的函数,即调用8次读取一个位的函数,将8个位组成一个字节,返回读取到的字节。

  6. 定义从DHT11读取一次数据的函数,即调用发送开始信号的函数后,如果检测到DHT11回应,则调用读取一个字节的函数读取40位数据,并计算校验和,如果校验和正确,则将湿度值和温度值分别存到humi和temp指针所指的变量中,返回0表示读取成功,否则返回1表示读取失败。

        需要注意的是,DHT11的一次通讯时间最大为3ms,主机连续采样间隔建议不小于100ms,因此在使用此段代码时,需要在主程序中控制采样时间间隔,避免频繁读取导致DHT11无法正常工作。

#include "dht11.h"
#include "delay.h"	
#include "stm32f10x.h"        
//	 		
//DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。
//
 

//输出模式
void DHT11_GPIO_Init_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);

}

//输入模式
void DHT11_GPIO_Init_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING; //浮空输入
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);

}

//主机发送开始信号
void DHT11_Rst(void)
{
	  DHT11_GPIO_Init_OUT();
    DHT11_DQ_OUT=0; 	//拉低DQ
    delay_ms(20);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
	  delay_us(30);     	//主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	//DHT11_IO_IN(); //SET INPUT	
	DHT11_GPIO_Init_IN();
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		delay_us(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}

//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待变为低电平
	{
		retry++;
		delay_us(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待变高电平
	{
		retry++;
		delay_us(1);
	}
	delay_us(40);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}

//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==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];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}

ht11.h:

#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"   

IO操作函数											   
#define	DHT11_DQ_OUT PBout(12) //数据端口	PB12
#define	DHT11_DQ_IN  PBin(12)  //数据端口	PB12 

void DHT11_GPIO_Init_OUT(void);
void DHT11_GPIO_Init_IN(void);

u8 DHT11_Init(void);	//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度
u8 DHT11_Read_Byte(void);//读出一个字节
u8 DHT11_Read_Bit(void);//读出一个位
u8 DHT11_Check(void);	//检测是否存在DHT11
void DHT11_Rst(void);	//复位DHT11 

#endif

主函数:

        实现1s采集一次温湿度数据,并将数据通过串口打印出来。

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "dht11.h"   

extern unsigned int rec_data[4];

 int main(void)
 { 
	u8 temperature;  	    
	u8 humidity; 	 
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为9600
	 
  printf("温湿度开始采集......\r\n");

	while(1)
	{	    	    
		
		DHT11_Read_Data(&temperature,&humidity);		//读取温湿度值
		delay_ms(100);
		
		printf("温度:%d\r\n",temperature); 
		printf("湿度:%d\r\n",humidity);

	}
}

运行效果:

STM32+DHT11采集温湿度传感器数据,stm32,嵌入式硬件,单片机

 源码:https://download.csdn.net/download/qq_39742246/88361721文章来源地址https://www.toymoban.com/news/detail-727003.html

到了这里,关于STM32+DHT11采集温湿度传感器数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32读取DHT11温湿度传感器

    我们知道DHT11是单总线协议,只有一根数据线。 且内部有个上拉电路(下图)。那么数据线默认就是高电平那接下来就可以讲解主机如何和DHT11通讯的 读取DHT11的芯片手册,可以知道,DHT11一次完成的数据输出是40bit,高位先出。 格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温

    2024年02月09日
    浏览(50)
  • 玩转传感器——DHT11温湿度传感器(STM32版)

    DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产

    2024年02月03日
    浏览(46)
  • STM32+DHT11温湿度传感器(含完整代码)

    前言 DHT11数字温湿度传感器是一种数字信号输出的温湿度传感器,具有高可靠性和长期稳定性。它采用专用的数字模块和温湿度传感技术,提供准确的温湿度数据。传感器内部包含感湿元件和测温元件,并与高性能单片机连接。因此,该传感器具有优异的品质、快速响应、抗

    2024年04月08日
    浏览(69)
  • 【STM32】DHT11温湿度模块传感器详解&代码

    DHT11是数字温湿度传感器,测量范围:湿度20%-95%,温度0-50℃,广泛应用于加湿器、温湿度计、空调、汽车等领域。 如上图DATA引脚用于MCU与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右(超时时间的判断)。一次完整的数据传输为40bit,高位先出(MSB最高

    2024年02月12日
    浏览(51)
  • 【STM32(HAL库)--DHT11温湿度传感器】

    stm32控制DHT11温湿度传感器,进行温湿度的读取.以下是自己的一点学习过程和心得,若有不妥之处,还望各位大佬指正,在下感激不尽. DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 。 它应用专用的数字模块采集技术温湿度传感技术, 确保产品具有极高

    2024年04月15日
    浏览(47)
  • [STM32]HAL库STM32CubeMX+DHT11温湿度传感器

    目录 所用的工具: 知识概括: DHT11介绍: DHT11性能说明: 接口说明  电源引脚 串行接口   工程创建 1、设置RCC 2、时钟设置 3、项目文件设置 4、设置IO口(DATA) 5、TIM时钟配置 6、USART配置   程序编写:          1、TIM3实现微秒(us)级延时函数: 2、IO口配置 3、DHT11检测

    2024年02月09日
    浏览(42)
  • STM32F4_DHT11数字温湿度传感器

    目录 前言 1. DHT11简介 2. DHT11数据结构 3. DHT11的传输时序 3.1 DHT11开始发送数据流程 3.2 主机复位信号和DHT11响应信号 3.3 数字 “0” 信号表示方法 3.4 数字 “1” 信号表示方法 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DHT11.c 5.3 DHT11.h         DHT11数字温湿度传感器 不但能测温度

    2024年02月08日
    浏览(44)
  • Clion开发Stm32之温湿度传感器(DHT11)驱动编写

    涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版) Clion开发stm32之微妙延迟(采用nop指令实现) Clion开发STM32之日志模块(参考RT-Thread) 头文件 源文件

    2024年02月15日
    浏览(42)
  • (STM32F103单片机)DHT11温湿度传感器

    目录   一,产品介绍 二,产品亮点 三,产品参数 四,引脚连接及通信说明  五,原理讲解 六,源码 1,DHR11.C 2.DHR11.H 3,main.c DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高

    2023年04月08日
    浏览(53)
  • ESP32单片机使用DHT11温湿度传感器的实践与代码解析

    摘要:本文将介绍如何使用ESP32单片机与温湿度传感器进行连接和数据读取。通过实例代码的解析,帮助读者了解实现温湿度检测的原理和方法。 一、引言 ESP32是一款功能强大的微控制器,广泛应用于物联网、智能家居等领域。在许多应用场景中,温湿度传感器是不可或缺的

    2024年02月21日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包