1.DHT11简介
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。他应用专用的数字模块采集威廉希尔官方网站 和温湿度传感威廉希尔官方网站 ,确保产品具有极高的可靠性与卓越的长期稳定性,传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的温湿校验室中进行校正。校准系数以程序的形式存储在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号的传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选择。
其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。
2.硬件设计
温度湿度模块采用单总线协议,一根数据即可完成温度和湿度数据采集,占用IO资源少,硬件接口如下:
DHT11_IO 与开发板PA0相连。
3.通信协议简介
(1). 温湿度传感器使用的是单总线接口,一次通讯时间5ms左右,具体格式如说明,当前数据传输位40bit,高位先出。
数据格式:接收到40bit数据=16bit湿度数据+16bit温度数据+8bit校验和数据。
例:接到40bit数据如下:
0100 0001 0000 0010 0010 0011 0000 0001 0110 0111
湿度数据 温度数据 校验和
湿度数据高8bit(整数部分)+湿度数据低8bit(小数部分)+温度数据高8bit(整数部分)+温度数据低8位(小数部分)=末8bit=校验和
例如:0100 0001+0000 0010+0010 0011+0000 0001=0110 0111
湿度=65.2%RH 温度=35.1℃
(2). 当温度低于0℃时温度数据的最高位置1.
例如:-10.1℃表示为1000 1010 0000 0001
3.1 时序图
用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,并触发一次信采集。信号发送如图所示。
注:主机从 DHT11 读取的温湿度数据总是前一次的测量值,如两次测间隔时间很长,请连续读两次以第二次获得的值为实时温湿度值。
3.2 数据获取
步骤一:
DHT11上电后(DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,并记录数据,同时 DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平;此时 DHT11 的DATA 引脚处于输入状态,时刻检测外部信号。
步骤二:(起始信号)
微处理器的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms(最大不得超过 30ms),然后微处理器的 I/O 设置为输入状态,由于上拉电阻,微处理器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待DHT11 作出回答信号,发送信号如图所示:
void DHT11_Rst(void)
{
DHT11_IO_OUT(); //配置为输出模式
DHT11_DQ_OUT(0); //总线拉低
Delay_Ms(20); //拉低至少18ms
DHT11_DQ_OUT(1); //总线拉高
DelayUs(30); //主机拉高20~40us
}
步骤三:(回响信号)
DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 83 微秒的低电平作为应答信号,紧接着输出 87 微秒的高电平通知外设准备接收数据,微处理器的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11 回应信号)后,等待 87 微秒的高电平后的数据接收,发送信号如图所示:
u8 DHT11_Check(void)
{
u8 retry=0;
DHT11_IO_IN();//配置为输入模式
while (!DHT11_DQ_IN&&retry<100)//DHT11会拉低83us左右
{
retry++;
DelayUs(1);
}
if(retry>=100)return 1;
while (DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高87us
{
retry++;
DelayUs(1);
}
if(retry>=100)return 1;
else retry=0;
return 0;
}
步骤四:(读取一位数据)
由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据,位数据“0”的格式为: 54 微秒的低电平和 23-27 微秒的高电平,位数据“1”的格式为: 54 微秒的低电平加 68-74微秒的高电平。位数据“0”、“1”格式信号如图所示:
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//等待变为低电平
{
retry++;
DelayUs(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//等待变高电平
{
retry++;
DelayUs(1);
}
DelayUs(40);//等待40us
if(DHT11_DQ_IN)return 1;
else return 0;
}
结束信号
DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 54 微秒后转为输入状态,由于上拉电阻随之变为高电平。但 DHT11 内部重测环境温湿度数据,并记录数据,等待外部信号的到来。
3.3 温湿度传感器相关函数
(1) DHT11初始化函数(发送信号,检测模块是否正常):
u8 DHT11_Init(void)
{
/*1.开时钟*/
DHT11_DQ_OUT(1);//上拉
DHT11_Rst(); //复位DHT11
return DHT11_Check();//等待DHT11的回应
}
(2)读取一字节函数
u8 DHT11_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
(3)获取一次温度数据函数(数据格式:40bit数据=16bit湿度数据+16bit温度数据+8bit校验和数据)
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 stat=0xff;
u8 buf[5]={0};
u8 i;
DHT11_Rst();//起始信号
stat=DHT11_Check();
if(stat==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];
*humi=buf[1];
*temp++=buf[2];
*temp=buf[3];
}
}else return stat;
return 0;
}
(4)温湿度数据转换
Delay_Ms(1);
time++;
if(time>=100)
{
time=0;
stat=DHT11_Read_Data(temperature,humidity); //读取温湿度值
if(!stat)
{
printf("温度:%d.%d℃ 湿度:%d.%d\r\n",
temperature[0],temperature[1],humidity[0],temperature[1]);
sprintf((char *)buff,"%d.%1d",temperature[0],temperature[1]);
OLED_Display_str(60,0,8,16,buff);
sprintf((char *)buff,"%d.%1d",humidity[0],temperature[1]);
OLED_Display_str(60,2,8,16,buff);
}
}
-
STM32
+关注
关注
2270文章
10897浏览量
355829 -
单总线
+关注
关注
1文章
36浏览量
12400 -
DHT11
+关注
关注
19文章
277浏览量
57586 -
数字温湿度传感器
+关注
关注
0文章
31浏览量
11147
发布评论请先 登录
相关推荐
评论