• 温湿度传感器DHT11程序示例


    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

     

    DHT11Arduino程序示例

     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("
    ");
    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 }

    运行效果:

     

  • 相关阅读:
    广义后缀自动机模板
    HDU 5852 Intersection is not allowed! ( 2016多校9、不相交路径的方案、LGV定理、行列式计算 )
    BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )
    WHU 583 Palindrome ( 回文自动机 && 本质不同的回文串的个数 )
    HDU 5527 Too Rich ( 15长春区域赛 A 、可贪心的凑硬币问题 )
    HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
    HDU 5544 Ba Gua Zhen ( 2015 CCPC 南阳 C、DFS+时间戳搜独立回路、线性基 )
    HDU 5734 Acperience ( 数学公式推导、一元二次方程 )
    hihocoder 1251 Today is a rainy day ( 15年北京 C、暴力 )
    HDU 5113 Black And White ( 2014 北京区预赛 B 、搜索 + 剪枝 )
  • 原文地址:https://www.cnblogs.com/MyAutomation/p/9523273.html
Copyright © 2020-2023  润新知