[本系列文章还将陆续介绍其他的传感器模块,欢迎订阅我的博客]
温度和湿度对我们的生活有极大的影响,对它的测量也是很有必要的。
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用于专用的数字模块采集技术和温湿度传感技术,有着极高的可靠性和稳定性,抗干扰,响应快等优点。采用单线制串行接口,信号传输距离可达20M以上。温湿度传感器是四针单排引脚,连接方便。
供电电压是3.3-5.5V直流电,输出是单总线数字信号,温度的测量范围为0-50度,湿度的测量范围是20-90%RH,测量的精度为温度为正负2度,湿度为正负5%RH,温度的分辨率为1度,湿度的分辨率非1%RH。
下图是温湿度传感器与MCU的连接图:
模块的VDD接直流5V电压,GND端接地,DATA端接MCU的所定义的I/O口。
程序如下:需要先定义温湿度传感器连接MCU的I/O口为PB3口,下面这个是DHT11的.c文件(与STM32单片机的连接):
u8DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
DHT11_Rst();
return DHT11_Check();
}
需要定义温湿度传感器复位,即DHT11_Rst(),程序如下:
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //设置输出
DHT11_DQ_OUT=0; //GPIOA.0=0
Delay_ms(20); //至少18ms拉下来
DHT11_DQ_OUT=1; //GPIOA.0=1
Delay_us(30); //上拉20~40us
}
需要定义温湿度传感器检查,即DHT11_Check(),程序如下:
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; //温湿度传感器存在
else
retry=0;
}
读取 DHT11数值,温度的范围是0-50度,湿度的范围是20%-90%,返回值:0是正常,1是读取失败
u8 DHT11_Read_Data(u8 *temperature,u8 *humidity)
{
u8 buf[5];
u8 i;
DHT11_Rst(); //先复位温湿度传感器
if(DHT11_Check()==0) //如果检查温湿度恒为0
{
for(i=0; i<5; i++) //读取40位数据
{
buf[i]=DHT11_Read_Byte(); //读取温湿度的一个字节
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humidity=buf[0];
*temperature=buf[2];
}
}
else
return 1;
return 0;
}
从DHT11读取一个字节,既是DHT11_Read_Byte,返回值是读到的数据
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读取一个位,既是DHT11_Read_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); //等待40s
if(DHT11_DQ_IN)
return 1;
else
return 0;
}
下面这个是DHT11的.H文件(与STM32单片机的连接头文件):
#ifndef _HUM_H
#define _HUM_H
#include <stdio.h>
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include "delay.h"
#include "sys.h"
//I/O口的方向设置
#define DHT11_IO_IN() GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
#define DHT11_IO_OUT() GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
#define DHT11_DQ_OUT PBout(3)
#define DHT11_DQ_IN PBin(3)
u8 DHT11_Init(void); //初始化DHT11
u8 DHT11_Read_Data(u8 *temperature,u8 *humidity); //读取 DHT11数值
u8 DHT11_Read_Byte(void); //读出一个位
u8 DHT11_Read_Bit(void); //读出一个字节
u8 DHT11_Check(void); //检测是否存在DHT11
void DHT11_Rst(void); //复位 DHT11
#endif
以上需要一步一步的去看,你就能掌温湿度传感器的使用。在接下的文章中还将陆续介绍并利用其他的传感器模块。
[文章未经作者的允许,]