DHT11概述
HT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。 单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
主要应用
典型接线
引脚定义
电气特性
单线双向串行通信协议
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零。操作流程如下:
一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据,传送正确时校验和数据等于“ 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集,采集数据后转换到低速模式。
通讯过程如图1,2所示
图1
图2
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。主机发送开始信号结束后, 可以切换到输入模式,或者输出高电平,延时等待20-40us后, 读取DHT11的响应信号。 DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。
DHT11发送响应信号后,再把总线拉高80us,准备发送数据。每一bit数据都以50us低电平时隙开始,高电平的长短决定了数据位是0还是1。格式见下面图示。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如图4所示
图3
数字1信号表示方法.如图5所示
图4
DHT11的Arduino程序示例
1 double Fahrenheit(double celsius) 2 { 3 return 1.8 * celsius + 32; //摄氏温度度转化为华氏温度 4 } 5 6 double Kelvin(double celsius) 7 { 8 return celsius + 273.15; //摄氏温度转化为开氏温度 9 } 10 11 // 露点(点在此温度时,空气饱和并产生露珠) 12 // 参考: http://wahiduddin.net/calc/density_algorithms.htm 13 double dewPoint(double celsius, double humidity) 14 { 15 double A0= 373.15/(273.15 + celsius); 16 double SUM = -7.90298 * (A0-1); 17 SUM += 5.02808 * log10(A0); 18 SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; 19 SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; 20 SUM += log10(1013.246); 21 double VP = pow(10, SUM-3) * humidity; 22 double T = log(VP/0.61078); // temp var 23 return (241.88 * T) / (17.558-T); 24 } 25 26 // 快速计算露点,速度是5倍dewPoint() 27 // 参考: http://en.wikipedia.org/wiki/Dew_point 28 double dewPointFast(double celsius, double humidity) 29 { 30 double a = 17.271; 31 double b = 237.7; 32 double temp = (a * celsius) / (b + celsius) + log(humidity/100); 33 double Td = (b * temp) / (a - temp); 34 return Td; 35 } 36 37 #include <dht11.h> //加入dht11类库 38 dht11 DHT11; //定义DHT11 39 #define DHT11PIN 2 // DHT11的数字口接控制板的2号引脚 40 41 void setup() 42 { 43 Serial.begin(9600); 44 Serial.println("DHT11 TEST PROGRAM "); 45 Serial.print("LIBRARY VERSION: "); 46 Serial.println(DHT11LIB_VERSION); 47 Serial.println(); 48 } 49 50 void loop() 51 { 52 Serial.println("\n"); 53 int chk = DHT11.read(DHT11PIN); // 库函数DHT11.read()的返回值 54 Serial.print("Read sensor: "); 55 switch (chk) 56 { 57 case DHTLIB_OK: //没有错误 58 Serial.println("OK"); 59 break; 60 case DHTLIB_ERROR_CHECKSUM: //校验错误 61 Serial.println("Checksum error"); 62 break; 63 case DHTLIB_ERROR_TIMEOUT: //超时错误 64 Serial.println("Time out error"); 65 break; 66 default: //未名的错误 67 Serial.println("Unknown error"); 68 break; 69 } 70 71 Serial.print("Humidity (%): "); 72 Serial.println((float)DHT11.humidity, 2); 73 74 Serial.print("Temperature (oC): "); 75 Serial.println((float)DHT11.temperature, 2); 76 77 Serial.print("Temperature (oF): "); 78 Serial.println(Fahrenheit(DHT11.temperature), 2); 79 80 Serial.print("Temperature (K): "); 81 Serial.println(Kelvin(DHT11.temperature), 2); 82 83 Serial.print("Dew Point (oC): "); 84 Serial.println(dewPoint(DHT11.temperature, DHT11.humidity)); 85 86 Serial.print("Dew PointFast (oC): "); 87 Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity)); 88 89 delay(2000); 90 }
运行效果: