DHT11温湿度传感器——基于STM32f1,这不进来看看?

目录

前言

一、DHT11温湿度传感器

 二、实现测量主程序

三、测试结果

四、总结

题外话:


前言

今天主要讲到DHT11温湿度传感器的应用,该传感器适用于多个场景,用途比较广泛,主要用来测量温度和湿度,其实对于单纯测量温度我们可以直接采用dsb18b20温度传感器,但是注意引脚接法,之前我不注意接反了,结果烧的······一碰手都直接起泡哈哈,好了,废话不讲,进入主题

一、DHT11温湿度传感器

DHT11传感器有四个接口,即VCC、GND、DATA、NC,那么首先要怎么接呢?其实这里面我们主要的就是接DATA这个口就行了,VCC、GND就不用多说了,NC端不接,悬空NC端即可,正常模块也是只有3个引脚引出来,所以只需要设定一个端口来与DATA互联就可以了

 我们发现实际上也就是如我上面所说的,它的四个引脚只需要利用三个就行了,而且该模块还有一块电源指示灯,当工作时会亮起。下面为原理图:

那么在这里DATA只要随意连上STM32上一端口(下面我用到了PA11),设置为推挽输出即可,就可以实现数据互联。 

 

 下面这里主要是对输出的流程的讲解,实际上如果看不懂也没事,后面可以通过代码加深对这几段话的理解

 二、实现测量主程序

DHT11函数(wenshi.c)

#include "delay.h"
#include "wenshi.h"

#define DT GPIO_Pin_11
      
//复位DHT11
void DHT11_Rst(void)	   
{                 
	DHT11_IO_OUT(); 	//SET OUTPUT
	DHT11_DQ_OUT=0; 	//拉低
	delay_ms(20);    	//拉低延时至少18ms
	DHT11_DQ_OUT=1; 	//DQ=1,拉高 
	delay_us(30);     	//拉高延时至少20~40us
}

//检测回应
//返回1:检测错误
//返回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;
}

//读取一个位Bit
//返回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;		   
}

//读取一个字节
//返回读到的数据
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%)
//tem:温度小数位
//hum:湿度小数位
u8 DHT11_Read_Data(u8 *temp,u8 *humi,u8 *tem,u8 *hum)    
{        
 	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];
			*hum=buf[1];
			*temp=buf[2];
			*tem=buf[3];
		}
	}
	else return 1;
	return 0;	    
}

//初始化DHT11,同时检测是否连接上DHT11,PA11初始化
 	 
u8 DHT11_Init(void)
{	 
 	GPIO_InitTypeDef  GPIO_InitStructure;	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
 	GPIO_InitStructure.GPIO_Pin = DT;				 //PA11
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);			
 	GPIO_SetBits(GPIOA,DT);						
			    
	DHT11_Rst();  
	return DHT11_Check();
}

主函数(main.c)

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "wenshi.h"

u8 temp;
u8 humi;
u8 tem;
u8 hum;
 

 int main(void)
 {	 

	delay_init();	    		  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 
	uart_init(115200);	 	
 	LED_Init();			     //LED初始化
	LCD_Init();              //LCD初始化
	POINT_COLOR=RED;	 
	while(DHT11_Init())
	{
		printf("DHT11 Error \r\n");
		LCD_ShowString(20,20,210,16,16,"DHT11 Error"); 
		delay_ms(1000);
	}
	
  while (1)
  {
		DHT11_Read_Data(&temp,&humi,&tem,&hum);//取地址

		LCD_ShowString(20,40,210,16,16,"temp:"); //分别显示所要显示的温度、湿度
		LCD_ShowString(20,70,200,16,16,"humi:");
		LCD_ShowString(90,40,110,8,16,".");
		LCD_ShowString(90,70,100,8,16,".");
		LCD_ShowNum(70,40,temp,2,16);
		LCD_ShowNum(70,70,humi,2,16);
		LCD_ShowNum(95,40,tem,2,16);
		LCD_ShowNum(95,70,hum,2,16);
		LED0=!LED0;
		delay_ms(1000);
  }
}
	

LCD的代码就不列出来了,主要函数以及注释基本上已经到位了,希望对大家有所帮助!

三、测试结果

下图 为测试结果:

四、总结

写到这里就接近尾声了,老规矩肯定不能忘哈哈,于晏老哥的话后面依旧续上,那么这里总结就再啰里啰嗦几句吧,DHT11是一款比较入门级且又十分耐用的温湿度检测模块,咱们要用到基本上学习期间也是在单片机上的运用学习(反正我是这样哈哈),最后祝大家能够有所收获,每日都取得小小进步,觉得文章写得还可以的话,点个赞再走哈哈!

题外话:

挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”

学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈

  • 51
    点赞
  • 273
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不说二话的自家人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值