资讯详情

stm32温湿度传感器报告_「正点原子NANO STM32开发板资料连载」第二十八章 DHT11 数字温湿度传感器实验...

1)实验平台:alientek NANO STM32F411 V1开发板

2)摘自正点原子STM32F4 开发指南(HAL 关注官方微信官方账号,获取更多信息:正点原子

f560f80c5cef3b10e51a215a5bd11393.png

第二十八章 DHT11 实验数字温湿度传感器

在最后一章中,我们介绍了数字温度传感器 DS18B20 本章将介绍数字温湿度传感器的使用DHT11 传感器不仅可以测量温度,还可以测量湿度。本章将向您介绍如何使用它 STM32F4来读取DHT11 数字温湿度传感器获取环境温湿度等信息,并在数字管上显示温湿度值。本章分为以下几个部分:

28.1 DHT11 简介

28.2 硬件设计

28.3 软件设计

28.4 下载验证

28.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 如图所示 28.1.1 所示:

图 28.1.1 DHT11 管脚排列图

虽然 DHT11 与 DS18B20 类似地,都是单总线访问,但是 DHT11 访问,相对 DS18B20 来

要简单得多。让我们先看看。 DHT11 数据结构。

DHT11 数字湿度传感器采用单总线数据格式。即单个数据引脚端口完成输入输出双向

传输。其数据包由 5Byte(40Bit)组成。数据分为小数部分和整数部分,完整的数据传输为

40bit,高位先出。DHT11 数据格式为:8bit 湿度数据 8bit 湿度小数据 8bit 温度整数

数据 8bit 温度小数据 8bit 校准和。其中校准和数据是前四个字节入。

传感器数据输出未编码的二进制数据。数据(湿度、温度、整数、小数)应分开

例如,一次从 DHT11 读取的数据如图所示 28.1.2 所示:

图 28.1.2 某次读取到 DHT11 的数据

湿度和温度

湿度= byte4 . byte3=45.0 (%RH)

温度= byte2 . byte1=28.0 ( ℃)

校验= byte4 byte3 byte2 byte1=73(=湿度 温度)(校准正确)

可以看出,DHT11 数据格式很简单,DHT11 和 MCU 最大的通信是 3ms 左右,

建议主机连续读取时间间隔不小于 100ms。

下面,我们来介绍一下 DHT11 传输时序。DHT11 数据发送 27.1.3 所示:

图 28.1.3 DHT11 数据发送过程

首先,主机发送开始信号,即降低数据线并保持它 t1(至少 18ms)然后提高数据线的时间 t2

(20~40us)读取时间 DHT11 如果响应正常,DHT11 会降低数据线,保持 t3(40~50us)

时间,作为响应信号,然后 DHT11 提高数据线,保持 t4(40~50us)时间过后,开始输出数据。

DHT11 输出数字0时序如图所示 28.1.4 所示:

图 27.1.4 DHT11 数字‘0’时序

DHT11 如图所示,输出数字序如图所示 28.1.5 所示:

图 28.1.5 DHT11 数字‘1’时序

通过以上了解,我们就可以通过 STM32 来实现对 DHT11 的读取了。DHT11 这就是介绍

更详细的介绍,请参考 DHT11 数据手册。

28.2 硬件设计

因为开发板上没有标准配置 DHT11 这个传感器只有接口,所以要做本章的实验,

一定要找一个 DHT11 插在预留的 DHT11 接口上。

本章实验功能简介:启动时检查是否有 DHT11 存在,如果没有,串口打印提示

错误,并且DS3.快速闪烁。只有在检测。DHT如果发现11后开始读取温湿度值,DHT11,

则程序每隔 1s 左右读取数据,并在数字管上显示温度和湿度。我们也使用它 DS0 来指示

程序正在运行。

使用的硬件资源如下:

1) 指示灯 DS0、DS3

2) 数码管

3) DHT11 温湿度传感器

我们已经介绍了这些,DHT11 和 DS18B20 接口共用一个,但是 DHT11 有 4 条

腿,需要把 U2 的 4 使用所有接口,将 DHT11 传感器传感器插入这个传感器 STM32F1 来

读取温湿度值。如图所示 28.2.1 所示:

图 28.2.1 DHT11 连接示意图

这里要注意,将 DHT11 有字的一面朝内,有许多孔的一面朝外,然后插入

如图所示,四个孔内即可。

28.3 软件设计

打开 DHT11 我们可以在数字温湿度传感器实验工程中添加数字温湿度传感器 dht11.c 文件和

dht11.h 文件,所有 DHT11 这两个文件中都有相关的驱动代码和定义。

打开 dht11.c 代码如下:

//复位 DHT11

void DHT11_Rst(void)

{

DHT11_IO_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();

//设置为输出

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;

whileDHT11_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_Initure;

__HAL_RCC_GPIOB_CLK_ENABLE();

//开启 GPIOB 时钟

GPIO_Initure.Pin=GPIO_PIN_9;

//PB9

GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出

GPIO_Initure.Pull=GPIO_PULLUP;

//上拉

GPIO_Initure.Speed=GPIO_SPEED_HIGH;

//高速

HAL_GPIO_Init(GPIOB,&GPIO_Initure);

//初始化

DHT11_Rst();

return DHT11_Check();

}

该部分代码首先是通过函数 DHT11_Init 初始化传感器,然后根据我们前面介绍的单总线

操作时序来读取 DHT11 的温湿度值的,DHT11 的温湿度值通过 DHT11_Read_Data 函数读取,如

果返回 0,则说明读取成功,返回 1,则说明读取失败。同样我们打开 dht11.h 可以看到,头文

件中主要是一些端口配置以及函数申明,代码比较简单。 接下来我们打开 main.c,该文件代

码如下:

// 共阴数字数组

// 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, .,全灭

u8 smg_num[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,

0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};

u8 smg_wei=2;//数码管位选

u8 num=0;//数值

u16 led_t=0;//led 统计时间

u16 dht11_t=0;//dht11 采样时间

u8 temperature;//温度值

u8 humidity;//湿度值

int main(void)

{

HAL_Init();

//初始化 HAL 库

Stm32_Clock_Init(96,4,2,4);

//设置时钟,96Mhz

delay_init(96);

//初始化延时函数

LED_Init();

//初始化 LED

LED_SMG_Init();

//数码管初始化

uart_init(115200);

//串口初始化为 115200

printf("NANO STM32rn");

printf("DHT11 TESTrn");

while(DHT11_Init())

//DHT11 初始化

{

printf("DHT11 Errorrn");

delay_ms(200);

LED3=!LED3;//LED3 闪烁表示 DHT11 初始化失败

}

LED3=1;

printf("DHT11 OKrn");

TIM3_Init(19,7199);//数码管 2ms 定时显示

while(1)

{

}

}

//回调函数,定时器中断服务函数调用

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

if(htim==(&TIM3_Handler))

{

dht11_t++;

if(dht11_t==500)//DHT11 1S 采样

{

dht11_t=0;

DHT11_Read_Data(&temperature,&humidity);//读取温湿度值

}

switch(smg_wei)

{

case 2: num = smg_num[temperature/10]; break;//温度值

case 3: num =smg_num[temperature%10];break;

case 6: num = smg_num[humidity/10]; break;//湿度值

case 7: num =smg_num[humidity%10];break;

}

LED_Write_Data(num,smg_wei);//写数据到数码管

LED_Refresh();//更新显示

smg_wei++;

if(smg_wei==4) smg_wei=6;

if(smg_wei==8) smg_wei=2;

led_t++;

if(led_t==250)//LED0 每 500ms 闪烁

{

led_t=0;

LED0=!LED0;

}

}

}

从上面代码可以看到,DHT11 温湿度的读取跟 DS18B20 实验同样在定时器中断执行,以每

隔 1S 时间采集温度和湿度,数码管同样是以 2ms 时间动态扫描显示,DS0 以每 500ms 闪烁一次,

以表示程序正在运行。

至此,我们本章的软件设计就结束了。

28.4 下载验证

在代码编译成功之后,我们通过下载代码到 ALIENTEK NANO STM32F4 开发板上,可以

看到数码管显示当前的温湿度值(假定 DHT11 已经接上去了),如图 28.4.1 所示:

图 28.4.1 DHT11 读取到的温湿度值

至此,本章实验结束。大家可以将本章通过 DHT11 读取到的温度值,和前一章的通过

DS18B20 读取到的温度值对比一下,看看哪个更准确?

标签: 传感器7a1707c

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

锐单商城 - 一站式电子元器件采购平台