• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

智能家居:温湿度传感器

武飞扬头像
发型贼帅的秃头男
帮助1

前言

此模块用于智能家居项目中
项目中含有模块:

  1. 温湿度传感器
  2. 光照强度传感器
  3. ONENET-MQTT服务器

一、DHT11

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

二、步骤

1.初始化

代码如下(示例):

void DHT11_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
		
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 
		
	GPIO_InitStructure.GPIO_Pin = DHT11_PIN;				
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);					 
}

其中DHT11_GPIO 、DHT11_PIN 可根据自己需求定,方便移植

#define DHT11_GPIO 	GPIOA
#define DHT11_PIN 	GPIO_Pin_0
#define DHT11_High	GPIO_SetBits(DHT11_GPIO,DHT11_PIN)
#define DHT11_Low	GPIO_ResetBits(DHT11_GPIO,DHT11_PIN)
#define DHT11_Input	GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN)

2.数据读取配置

DHT11 需要主机发送开始信号过后,才能接收DHT11的相应。所以需要对IO口输入输出进行切换。
代码如下:

/*

	1: 输出  0:输入
*/
void DHT11_Read_OUT_Intput(u8 cmd)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	if(cmd)			
	{
		GPIO_InitStructure.GPIO_Pin = DHT11_PIN;				
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
		GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);		
	}else{
		GPIO_InitStructure.GPIO_Pin = DHT11_PIN;				
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 	 
		GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);	
	}
}
学新通

学新通
总线空闲状态为高电平。主机发送开始信号,先把总线拉低,拉低必须大于18毫秒,保证DHT11能检测到起始信号。主机发送开始信号结束后,把总线电平拉高,延时等待20-40us后,读取DHT11的响应信号。DHT11接收到主机的开始信号后,然后发送80us低电平响应信号,然后发送80us高电平响应信号。结束后开始发送数据。
数据格式:
8bit湿度整数数据 8bit湿度小数数据 8bi温度整数数据 8bit温度小数数据 8bit校验和

相关配置代码如下(示例):

u8 DHT11_Read_Huim_Temp(u8* HuimH,u8* HuimL,u8* TempH,u8* TempL)
{
	u8 Data[5];
	u8 i=0;
	//主机信号
	DHT11_Read_OUT_Intput(1);
	DHT11_Low;
	delay_ms(20);		//先拉低18ms
	DHT11_High;
	delay_us(40);
	DHT11_Read_OUT_Intput(0);
	//DHT11信号
	while((DHT11_Input == Bit_RESET) && (  Time<1000));		//低电平是否过去
	Time = 0;
	while((DHT11_Input == Bit_SET) && (  Time <1000));		//高电平是否过去
	Time = 0;
	for (i=0;i<5;i  )
	{
		Data[i] = DHT11_Read_Byte();
	}
	delay_ms(500);
	if((Data[0] Data[1] Data[2] Data[3])==Data[4])
	{
		*HuimH = Data[0];
		*HuimL = Data[1];
		*TempH = Data[2];
		*TempL = Data[3];
	}
	else{
		return 1;
	}
	return 0;
}
学新通

每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。
数字0:高电平为26-28us
学新通
数字1:高电平70us
学新通
代码如下:

u8 DHT11_Read_Byte(void)
{
	u8 n;
	u8 Data = 0;

	for(n=0;n<8;n  )
	{
		DHT11_Read_OUT_Intput(0);
		
		while((DHT11_Input == Bit_RESET) && (  Time <1000));	//等待高电平 1ms 超时
		Time = 0;
		
		Data<<=1;
		delay_us(40);	// 0   26-28us    40us   70us 		
		if(DHT11_Input == Bit_SET)
		{
			Data |= 0x01;
			while((DHT11_Input == Bit_SET) && (  Time <1000));	//等待高电平 1ms 超时
			Time = 0;
		}
	
	}
	
	return Data;
}
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhabjgi
系列文章
更多 icon
同类精品
更多 icon
继续加载