锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

STM32学习之温湿度检测——DHT11

时间:2023-01-16 17:00:00 ms类型晶体管高性能8dq晶体管外接电源型温湿度变送器模块温湿度变送器传感器输出5v10v8数字式温湿度传感器芯片芯片

一准备材料

1、参考资料

  • 《STM32不完全手册_库函数版本
  • 《STM32F103xCDE_DS_CH_V5.pdf》
  • 《STM32中文参考手册_V10.pdf》
  • 《DHT11》
    《DHT11下载链接:https://pdf1.alldatasheetcn.com/datasheet-pdf/download/1132088/ETC2/DHT11.html
    在这里插入图片描述

2、器件准备

  • STM32板子
  • DHT11

二、原则说明

1.通信协议:单总线协议:

(1)简介

单总线是DALLAS公司开发的协议由一个总线主节点和多个节点组成,通过信号线读取芯片的数据。每一个符合OneWire该协议的芯片有一个唯一的地址,包括48位序列号、8位家族代码和8位CRC代码。主芯片对各个从芯片的寻址依据这64位的不同来进行。单总线使用一条线实现双向通信。因此,该协议对时序有严格的要求,如响应等时序有明确的时间要求。,基本时序包括复位和响应时序,写一个时序,读一个时序。在复位和响应顺序中,主设备发出复位信号后,需要在规定时间内从设备发送响应信号;在位读和位写顺序中,主设备应在规定时间内读取或写数据。

注释:
1.知道是哪家公司开发的
2.知道通过数据线传输数据

(2)单总线工作原理

单总线设备内部设有寄生供电路(Parasite Power Circuit)。当单总线处于高电平时,一方面通过二极管VD另一方面,向芯片提供内部电容C(约800pF)充电;单总线低电时,二极管截止,内部电容c向芯片供电。由于电容C容量有限,要求单总线间隔提供高电平,不断向内部电容C充电,维持设备的正常运行。这是通过网络线路窃取电能的寄生电源的工作原理。需要注意的是,为了确保总线上的某些设备工作(如温度传感器进行温度转换,E2PROM写人数据时)有足够的电流供应,除上拉电阻外,还需要在总线上使用MOSFET(场效应晶体管)提供强上拉供电。

单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,一般情况下,使用1000Kbit/s以下速率传输数据。I/O口可直接驱动200m扩展范围内的设备可达1km范围。

注释:
1.你可以自己说出单总线协议的原则

  • 平时高电:1。需要通过二极管VD给芯片供电;2.需要给电容C充电;
  • 低电平时:1。此时二极管截止;2.此时,电容器放电给芯片供电;
  • 有特殊装置(温度传感器)E2PROM写人数据需要足够的电流,所以需要MOSFET(场效应晶体管)通过强上拉供电(即有足够的电流)

2.单总线的数据传输速率一般为16.3Kbit/s

(3)结构

单总线主机或从机设备通过漏极开路或三态端口连接到数据线,允许设备在不发送数据的情况下释放数据总线,使其他设备在不发送数据的情况下使用总线和内部等效电路。
单总线要求外接约5个 k上拉电阻。这样,当单总线闲置时,状态为高电平。如果传输过程需要暂时悬挂,并要求传输过程继续,则总线必须空闲。
只要总线在恢复过程中处于空闲状态(高电平),传输之间的恢复时间就没有限制。如果总线保持低电平超过480us,总线上的所有设备都将被复位。此外,为了确保单总线设备在某些工作状态下(如温度转换设备)EEPROM有足够的电源电流,必须在总线上提供强上拉。

注释:
1、漏极开路 指 MOSFET 漏极输出电路可以在实际应用中输出多个泄漏|脚连接到一条线上,形成线与逻辑的关系。请注意,这个公共点必须连接到一个 上拉电阻。任意这些引脚- -路变为逻辑 0后,开漏线上的逻辑为0。I2C这种方法用于判断接口总线的占用状态。
2.三态端口:有三种状态:1。高电平;2.低电平; 3.高阻态(禁止态),高阻态引脚在总线不受信号影响。
当单总线闲置时,外部上拉电阻为高电平。

(4)单总线通信信号类型

单总线通信协议定义了以下类型,即复位脉冲、响应脉冲、写0、写1、读0和读1。除响应脉冲外,所有信号均由主机发出同步信号,发送的所有命令和数据均处于字节低位。

单总线通信协议中不同类型的信号都采用一种类似脉宽调制的波形表示,逻辑0用较长的低电平持续周期表示,逻辑1用较长的高电平持续周期表示。在单总线通信协议中,读写间隙的概念非常重要。当系统主机从设备输出数据时,当主机从设备读取数据时,每个间隙总线只能传输一个数据。无论是阅读间隙还是编写间隙,它们都从主机驱动数据线的低电平开始。数据线的下降边缘是从设备触发其内部的延迟电路,使其与主机同步。延迟电路决定从设备采样数据线的时间窗口编写时间隙。

单总线通信协议有两个写作间隙:写1和写0。主机用写1时间隙从机写1,用写0时间隙从机写0。所有的写作间隙至少60个us,在两个独立的写作间隙之间至少需要1us恢复时间。两个写作间隙始于主机拉低数据总线。产生1间隙的方法:主机拉低总线后,必须在15us释放总线,通过上拉电阻将总线拉到高电平;产生0间隙的方法是在主机拉低后保持低电平(至少60us)。在写时隙开始后15us~60us在此期间,单总线设备采样总电平状态。如果在此期间采样值为高电平,则将逻辑1写入器件;如果是0,则写入逻辑0。

在下图中,黑色实现代表系统主机拉低总线,黑色虚线代表拉电阻拉高总线。


注释
1、写“1”,主机总线拉低15us内拉高,持续到60us以后完成
2.写0,主机总线拉低,持续60us以上完成

对于读时间隙,只有当主机发出读时间隙时,单总线设备才能将数据传输给主机。所有主机发出阅读数据命令后,必须立即产生阅读间隙,以便从机器中传输数据。所有的阅读间隙至少需要60个us,在两个独立的阅读间隙之间至少需要1us恢复时间。每个读时隙都由主机发起,至少拉低总线1us。在主机发出读取间隙后,单总线设备开始在总线上发送0或1。若从机发送1,则保持总线为高电平;若发出0,则拉低总线。

当发送0时,从机在读取间隙结束后释放总线,上拉电阻将总线拉回空闲高电平状态。从机器发出的数据在开始间隙后保持有效时间15us,因此,主机必须在读取间隙时释放总线,并在间隙开始后释放15us总线状态内采样。


上图中,黑色实线代表系统主机拉低总线,灰色实线代表总局拉低总线,黑色虚线代表拉高电阻总线。以上介绍了单总线通信过程的几个信号,但由于复位脉冲与单总线通信过程初始化的密切关系,这两个信号的介绍将在单总线通信初始化中进行阐述。
注释:
1.单总线设备开始在总线上发送0或1。如果从机发送1,则保持总线高电平;如果发送0,则降低总线。
2.阅读数据命令发出15us主机必须采样总线状态。

(5)单总线通信的初始化

单总线上的所有通信都是从初始序列开始的,包括主机发出的复位脉冲和从机响应脉冲,如下图所示。图中,黑线代表系统主机降低总线,灰线代表从机降低总线,黑线代表上拉电阻。

系统主设备发送端发出的复位脉冲为480us ~ 960us低电平,然后释放总线进入接受状态。此时,系统总线通过4.7K上拉电阻接到VCC高电平约为15us~60us,接种设备在接收端开始检测I/O脉冲的到来监测引脚上的下降边缘。主设备在这种状态下的时间至少为480us。

作为一个来自设备的奇迹,我爱你,在收到系统主设备发出的复位脉冲后,向总线发出响应脉冲,表设备已准备好,可以根据各种命令发送或接受数据。通常,设备在等待15us ~ 60us响应脉冲(脉冲是60us~240us低电平信号由从机强制拉低总线)。

复位脉冲主设备是通过广播发出的,所以总线上所有的响应脉冲都是从设备发出的。一旦设备检测到响应脉冲,主设备认为总线已连接到设备,然后主设备将发送相关信息ROM功能命令。如果主设备未能检测到响应脉冲,则认为总线上没有从设备上悬挂总线。

注释:
1.复位信号是主机输出至少480us低脉冲会降低闲置状态的总线,出现下降边缘。总线上的下降边缘可以从设备接收,然后等待15us ~ 60us之后,输出一个60us~240us低电平信号是响应信号
2.主机接到响应信号后,说明设备从总线挂接,否则设备不挂接。

(6)单总线通信ROM命令

当主机检测到响应脉冲时ROM命令,这些命令,每个从机备的唯一64位ROM代码相关,允许主机在单总线上连接多个从设备时,指定操作某个从设备。使得主机可以操作某个从机设备。这些命令能使主机检测到总线上有多少个从机设备以及设备类型,或者有没有设备处于报警状态。从机设备支持5种ROM命令,每种命令长度为8位。丰机在发出功能命今之前,必须发出ROM命今。


注释:
1、知道从机设备有唯一64位ROM代码
2、知道ROM命令有5种,每种命令长度为8位。

(7)单总线通信的功能命令

主机发出ROM命令,访问指定的从机,接着发出某个功能命令。这些命令允许主机写入或读出从机暂存器、启动工作以及判断从机的供电方式

注释:
1、上面介绍的注释单总线的通用情况,具体的使用情况还是需要看器件说明书。

2、DHT11原理

一、产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括-一个电容式感湿元件和-个NTC测温元件,并与–个高性能8位单片机相连接。
二、应用范围
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括-一个电容式感湿元件和一-个NTC测温元件,并与–个高性能8位单片机相连接。
三、产品亮点 成本低、长期稳定、相对湿度和温度测量、品质卓越、超快响应、抗干扰能力强、超长的 信号传输距离、数字信号输出、精确校准。

(1)功能

可以检测周围环境的温度和湿度

(2)时序解读

DHT11数据信号时序图:







数据计算:

(3)引脚说明

1、VDD 供电3.3~5.5V DC
2、DATA 串行数据,单总线
3、NC 空脚
4、GND 接地,电源负极

三、实物连接

原理图:

四、代码实现

1、初始化


下面了解复位函数

#define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}

GPIOA->CRH&=0XFFFF0FFF:表达的意思可以看下图,就是将选择的PA11配置为输入模式
那为什么要这样配置呢?我们这里不是要输出复位信号吗?

GPIOA->CRH|=3<<12:表达的是将选择的PA11配置为开漏输出

下面是应答信号:

2、读取数据


读取字节函数

读取一位数据函数:

注释:
每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不建议连续多次读取传感器,每次读取传感器间隔大于2秒即可获得准确的数据。

  • 头文件
#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h" 
 
//IO方向设置
#define DHT11_IO_IN() { 
          GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;}
#define DHT11_IO_OUT() { 
          GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}
//IO操作函数 
#define DHT11_DQ_OUT PAout(11) //数据端口 PA11 
#define DHT11_DQ_IN PAin(11) //数据端口 PA11


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



  • .c文件
#include "dht11.h"
#include "delay.h"


      
//复位DHT11
void DHT11_Rst(void)	   
{ 
                         
	DHT11_IO_OUT(); 	//SET OUTPUT
    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 
    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;	    
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在 
u8 DHT11_Init(void)
{ 
        	 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PG端口时钟
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				 //PG11端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOG, &GPIO_InitStructure);				 //初始化IO口
 	GPIO_SetBits(GPIOA,GPIO_Pin_11);						 //PG11 输出高
			    
	DHT11_Rst();  //复位DHT11
	return DHT11_Check();//等待DHT11的回应
} 

五、总结

1、基本原理、代码、连线搞定,感觉非常OK
2、道阻且长,行则将至。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章