详解DHT11数字温湿度传感器实验
数字传感器 数字传感器就是指将传统化的数字模拟感应器历经改装或更新改造A/D变换控制模块,使之輸出讯号为数据量(或数字记忆法)的感应器,关键包含:放大仪、A/D转化器、微控制器(CPU)、储存器、通信插口、温度检测电源电路等,在微控制器和感应器越来越更加划算的今日,自动式或全自动(根据人力命令开展高端实际操作,全自动解决基层实际操作)系统软件能够包括大量智能化男性性功能,能从其条件中获取并解决大量不一样的主要参数。 特性 1、优秀的A/D变换技术性和智能化数字滤波,在满度的情形下仍可确保輸出码的平稳。 2、行得通的数据储存技术性,确保控制模块主要参数不容易遗失。 3、优良的电磁兼容测试特性。 4、感应器的特性选用智能化偏差弥补技术性和高宽比一体化电子元器件,用系统完成感应器的线形、零点、温漂、应力松弛等技术参数的综合性赔偿,清除了人为要素对赔偿的危害,进一步提高了感应器综合性精密度和稳定性。 5、感应器的輸出一致性偏差能够做到0.02%之内甚至于高些,感应器的性能主要参数可完全一致,因此有着优良的公差配合。 6、选用A/D变换电源电路、智能化数据信号传递和数字滤波技术性,感应器的抗干扰性提升,数据信号传送距离较远,提升 了温度传感器的可靠性。 7、数字传感器能自行采集数据并可预备处理、储存和记忆力,具备唯一标识,有利于故障检测。 8、感应器选用规范的数据通讯插口,可立即连接电子计算机,也可与规范工业控制系统系统总线联接,便捷灵便。 9, 数字传感器是将AD,EPROM,DIE(指还未封裝的感应器集成ic,归属于裸片,尺寸处于cell和chip中间),封裝在一块用PCB,金属材料块或陶瓷纤维板上的集成化。根据各种各样溫度,工作压力点的校正,测算出DIE的线形,再运用AD去赔偿的办法生产而成的。 运用及市场前景 在微控制器和感应器越来越更加划算的今日,自动式或全自动(根据人力命令开展高端实际操作,全自动解决基层实际操作)系统软件能够包括大量智能化男性性功能,能从其条件中获取并解决大量不一样的主要参数。尤其是MEMS(微型计算机电系统软件)技术性,它使数字传感器的大小十分细微而且耗能与费用也很低。以纳米碳管或其他纳米复合材料做成的微米感应器一样有着很大的发展潜力 [1] 。 即便 在萌发环节,大家依然觉得在一段时间的未来数字传感器对电子城具备关键的促进功效。制做数字传感器的插口及其适用用以数字传感器互联网的多种形式的通信协议全是对工艺加工工艺的很大挑戰。感应器的非匀质特点和其实际操作标准的多样性也对工艺加工工艺提到了很大的挑戰。 如今系统软件设计室涵盖的感应器和CPU愈来愈多。伴随着感应器和处理器价格的持续减少,替代机械设备系统结构的阀值也在不断地转变 。在操作系统中挑选准确的感应器组成和解决优化算法能够明显地减少原料及能源消耗的成本并增强操作系统的整体特性。现阶段,持续增强使用的优化水平和增加电力能源的使用期越来越更加关键,尤其是现在愈来愈多的无线传感器动则就配备1000或大量的感应器连接点。
DHT11是一款湿溫度一体化的数字传感器。该感应器包含一个电阻器式测湿元器件和一个NTC温度测量元器件,并与一个性能卓越8位单片机设计相互连接。根据单片机设计等微控制器简易的线路联接就可以即时的收集当地环境湿度和溫度。DHT11与51单片机中间能使用简洁的总线结构开展通讯,只是必须一个I/O口。感应器內部环境湿度和气温数据信息40Bit的数据信息一次性发送给单片机设计,数据信息选用校验和方法开展校检,合理的确保传输数据的精确性。DHT11功能损耗很低,5V电源电压下,工作中均值较大电流量0.5mA。
DHT11的性能参数以下:
l 工作标准电压范畴:3.3V-5.5V
l 工作中电流量 :均值0.5mA
l 輸出:总线结构模拟信号
l 检测范围:环境湿度20~90%RH,溫度0~50℃
l 精密度 :环境湿度±5%,溫度±2℃
l 屏幕分辨率 :环境湿度1%,溫度1℃
DHT11的引脚排布如图所示36.1.1所显示:
图36.1.1 DHT11引脚排列图
尽管DHT11与DS18B20相近,全是总线结构浏览,可是DHT11的浏览,相对性DS18B20而言要简易许多。下边大家先一起来看看DHT11的算法设计。
DHT11数据湿温度感应器选用总线结构数据类型。即,单独数据信息脚位端口号进行I/O双重传送。其数据由5Byte(40Bit)构成。数据信息分小数部分和整数金额一部分,一次详细的传输数据为40bit,上位先出。DHT11的数据类型为:8bit环境湿度整数金额数据信息 8bit环境湿度小数数据信息 8bit溫度整数金额数据信息 8bit溫度小数数据信息 8bit校验和。在其中校验和数据信息为前四个字节数求和。
感应器数据信息輸出的是未编号的二进制数据信息。数据信息(环境湿度、溫度、整数金额、小数)中间应当分离解决。比如,一次从DHT11看到的信息如图所示36.1.2所显示:
图36.1.2 一次载入到DHT11的数据信息
由上述数据信息就可获得环境湿度和环境温度的值,计算方式:
环境湿度= byte4 。 byte3=45.0 (%RH)
溫度= byte2 。 byte1=28.0 ( ℃)
校检= byte4 byte3 byte2 byte1=73(=环境湿度 溫度)(校检恰当)
能够看得出,DHT11的数据类型是十分简易的,DHT11和MCU的一次通讯较大为3ms上下,提议服务器持续载入间隔时间不必低于100ms。
下边,大家介绍一下DHT11的传送时钟频率。DHT11的数据信息推送步骤如图所示36.1.3所显示:
图36.1.3 DHT11数据信息推送步骤
最先服务器推送逐渐数据信号,即:降低手机充电线,维持t1(最少18ms)時间,随后拉升手机充电线t2(20~40us)時间,随后载入DHT11的相对应,一切正常得话,DHT11会拉低手机充电线,维持t3(40~50us)時间,做为回应数据信号,随后DHT11拉升手机充电线,维持t4(40~50us)時间后,逐渐輸出数据信息。
DHT11輸出数据‘0’的时钟频率如图所示36.1.4所显示:
图36.1.4 DHT11数据‘0’时钟频率
DHT11輸出数据‘1’的时钟频率如图所示36.1.5所显示:
图36.1.5 DHT11数据‘1’时钟频率
根据上述掌握,大家就可以根据STM32来完成对DHT11的载入了。DHT11的讲解就到这儿,更具体的详细介绍,请参照DHT11的数据资料指南。
36.2 硬件开发
因为单片机开发板上标准配备是沒有DHT11这一感应器的,仅有插口,因此要做此章的试验,大伙儿务必找一个DHT11插在预埋的DHT11插口上。
此章试验作用介绍:启动的过程中先检验是不是有DHT11存有,要是没有,则提醒不正确。仅有在检验到DHT11以后才逐渐载入温度湿度值,并展现在LCD上,假如看到了DHT11,则程序流程每过100ms上下载入一次数据信息,并把温度湿度表明在LCD上。一样大家也是用DS0来标示程序流程已经运作。
所要采用的硬件平台以下:
1) 显示灯DS0
2) TFTLCD控制模块
3) DHT11温度湿度感应器
这种我们早已详细介绍过去了,DHT11和DS18B20的接口类型是同用一个的,但是DHT11有4只脚,必须把U13的4个插口都用上,将DHT11感应器插进到这一上边就可以根据STM32来载入温度湿度值了。联接平面图如图所示36.2.1所显示:
图36.2.1 DHT11联接平面图
这儿要留意,将DHT11贴有字的一面朝里,而有很多孔的一面靠外,然后然后插进如下图所示的四个孔壁就可以了。
36.3 软件开发
开启上一章的工程项目,最先在HARDWARE文件夹名称下新创建一个DHT11的文件夹名称。随后新创建一个dht11.c和dht11.h的文档储存在DHT11文件夹名称下,并将这一文件夹名称添加头文件包含途径。
开启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)
{
RCC-》APB2ENR|=1《《8; //使能PORTG口时钟
GPIOG-》CRH&=0XFFFF0FFF;//PORTG.11 推挽输出
GPIOG-》CRH|=0X00003000;
GPIOG-》ODR|=1《《11; //输出1
DHT11_Rst();
return DHT11_Check();
}
该部分代码就是根据我们前面介绍的单总线操作时序来读取DHT11的温湿度值的,DHT11的温湿度值通过DHT11_Read_Data函数读取,如果返回0,则说明读取成功,返回1,则说明读取失败。保存dht11.c,并把该文件加入到HARDWARE组下,然后我们打开dht11.h,在该文件下输入如下内容:
#ifndef __DHT11_H
#define __DHT11_H
#include “sys.h”
//IO方向设置
#define DHT11_IO_IN() {GPIOG-》CRH&=0XFFFF0FFF;GPIOG-》CRH|=8《《12;}
#define DHT11_IO_OUT() {GPIOG-》CRH&=0XFFFF0FFF;GPIOG-》CRH|=3《《12;}
////IO实际操作涵数
#define DHT11_DQ_OUT PGout(11) //数据信息端口号 PG11
#define DHT11_DQ_IN PGin(11) //数据信息端口号 PG11
u8 DHT11_Init(void); //复位DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//载入温度湿度
u8 DHT11_Read_Byte(void); //读取一个字节
u8 DHT11_Read_Bit(void); //读取一个位
u8 DHT11_Check(void); //检验是不是存有DHT11
void DHT11_Rst(void); //校准DHT11
#endif
此一部分代码比较简易,下面,大家先储存这一段编码,随后开启test.c,在该文件下改动main函数以下:
int main(void)
{
u8 t=0;
u8 temperature;
u8 humidity;
Stm32_Clock_Init(9); //系统软件数字时钟设定
uart_init(72,9600); //串口通信复位为9600
delay_init(72); //延迟复位
LED_Init(); //复位与LED联接的硬件配置插口
LCD_Init(); //复位LCD
usmart_dev.init(72); //复位USMART
KEY_Init(); //功能键复位
POINT_COLOR=RED;//设置字体为鲜红色
LCD_ShowString(60,50,200,16,16,“WarShip STM32”);
LCD_ShowString(60,70,200,16,16,“DHT11 TEST”);
LCD_ShowString(60,90,200,16,16,“ATOM@ALIENTEK”);
LCD_ShowString(60,110,200,16,16,“2012/9/12”);
while(DHT11_Init()) //DHT11复位
{
LCD_ShowString(60,130,200,16,16,“DHT11 Error”);
delay_ms(200);
LCD_Fill(60,130,239,130 16,WHITE);
delay_ms(200);
}
LCD_ShowString(60,130,200,16,16,“DHT11 OK”);
POINT_COLOR=BLUE;//设置字体为深蓝色
LCD_ShowString(60,150,200,16,16,“Temp: C”);
LCD_ShowString(60,170,200,16,16,“Humi: %”);
while(1)
{
if(t==0)//每100ms载入一次
{
DHT11_Read_Data(&temperature,&humidity); //载入温度湿度值
LCD_ShowNum(60 40,150,temperature,2,16); //表明溫度
LCD_ShowNum(60 40,170,humidity,2,16); //表明环境湿度
}
delay_ms(10);
t ;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
}