(37)STM32——DHT11数字温湿度传感器实验

导读:本篇文章讲解 (37)STM32——DHT11数字温湿度传感器实验,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

学习目标

  今天我们要学习的内容是有关DHT11数字温湿度传感器的实验,采用的原理是单总线通信原理,和我们的DS18B20是一样的通信方式,但是比DS18B20要简单许多,被广泛用来测量湿度。


成果展示

  就是简单的测温以及测湿度,然后通过串口来显示。

实验结果

介绍

  关于单总线的知识就不再做介绍了,之前的文章里面都有,文章就放到这里了,感兴趣同学可以去看看:单总线知识介绍。我们来简单介绍一下DHT11.

   DHT11 是广州奥松有限公司生产的一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。

  • 工作电压范围:3.5V-5.5V
  • 工作电流 :平均 0.5mA
  • 湿度测量范围:20-90%RH
  • 温度测量范围:0-50℃
  • 湿度分辨率 :1%RH 8 位
  • 温度分辨率 :1℃ 8 位
  • 采样周期 :1S
  • 单总线结构
  • 与 TTL 兼容(5V)

数据结构

  DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,具体格式在下面说明。
  一次完整的数据传输为40bit,高位先出。
  数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。
  校验和数据为前四个字节相加。

在这里插入图片描述

由以上数据就可得到湿度和温度的值,计算方法:
  humi (湿度)= byte4 . byte3=45.0 (%RH)
  temp (温度)= byte2 . byte1=28.0 ( ℃)
  jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校验正确)

时序

发送数据

在这里插入图片描述

  主机发送开始信号后,延时等待 20us-40us 后读取 DH11T 的回应信号,读取总线为低电平,说明 DHT11 发送响应信号,DHT11 发送响应信号后,再把总线拉高,准备发送数据,每一 bit 数据都以低电平开始,格式见下面图示。如果读取响应信号为高电平,则 DHT11 没有响应,请检查线路是否连接正常。

复位信号和响应信号

在这里插入图片描述

信号”0″

在这里插入图片描述

信号”1″

在这里插入图片描述

代码

//DHT11.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_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);//使能GPIOG时钟

  //GPIOG9初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
	DHT11_Rst();
	return DHT11_Check();
}

// main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "dht11.h"
 
int main(void)
{ 
	u8 t=0;			    
	u8 temperature;  	    
	u8 humidity;  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	
	LED_Init();					//初始化LED   	
	
 	while(DHT11_Init())	//DHT11初始化	
	{
		printf("DHT11 Error");
		printf ("\r\n\r\n");
		delay_ms(200);
	}								   
	printf ("DHT11 OK");
	printf ("\r\n\r\n");
	while(1)
	{	    	    
 		if(t%10==0)//每100ms读取一次
		{									  
			DHT11_Read_Data(&temperature,&humidity);		//读取温湿度值					    
			printf ("Temp: %d C",temperature);		//显示温度	
			printf ("\r\n\r\n");
			printf ("Humi: %d %%",humidity);			//显示湿度	
			printf ("\r\n\r\n");			
		}				   
	 	delay_ms(10);
		t++;
		if(t==20)
		{
			t=0;
			LED0=!LED0;
		}
	}
}

总结

  这就是关于DHT11的介绍了,本身内容不难,很好理解。其次,这是我第一次使用Markdown来写文章,感觉还不错。所以在此再做一些练习,后期再单独出一篇笔记来介绍Markdown,不得不说,Markdown确实有点厉害。

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024。

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务
项目 Value
电脑 $1600
手机 $12
导管 $1
Column 1 Column 2
centered 文本居中 right-aligned 文本居右

一个具有注脚的文本。1

Markdown将文本转换为 HTML

Markdown

Text-to-
HTML conversion tool

Authors

John
Luke

Gamma公式展示

Γ

(

n

)

=

(

n

1

)

!

n

N

\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N

Γ(n)=(n1)!nN 是通过 Euler integral

Γ

(

z

)

=

0

t

z

1

e

t

d

t

.

\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

Γ(z)=0tz1etdt.

Mon 06 Mon 13 已完成 进行中 计划中 现有任务 Adding GANTT diagram functionality to mermaid

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五… 很好… 王五, 你怎么样? 张三 李四 王五

链接

长方形

圆角长方形

菱形

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no

Cool

Where am i?

«interface»

Class01

int chimp

int gorilla

size()

AveryLongClass

Class09

C2

C3

Class07

Object[] elementData

equals()

Class10

>>service>>

int id

size()


  1. 注脚的解释 ↩︎

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82354.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!