DHT11温湿度传感器

ZigBee、NBIOT等无线通信技术交流学习,可以加入QQ技术交流群:575036716

本章内容的源码包可以到CSDN的下载版块进行下载点击打开链接


DHT11是一款数字温湿度传感器,有效测量范围是温度0~50℃,湿度20~95%,DHT11是单总线通信设备,有自己的单总线通信协议(单线双向协议),一次通讯时间4ms左右。

    在设计DHT11驱动程序时,需要提供两个API:初始化、读取温湿度数据!

    我们使用的主控芯片是TI的CC2530,主要是考虑到程序可以用在ZigBee中开发温湿度传感器设备,驱动程序在编写时,必须充分考虑编程规范,从而达到高可维护性、可读性的特点

程序头文件:

  1. /******************************************************************* 
  2.  * @file    hal_dht11.h 
  3.  * @brief   Temperature & Humidity Sensor Driver - DHT11 
  4.  * 
  5.  * Copyright (c) 2017~2020 ShenZhen IoT-College Technology Co., Ltd.  
  6.  * All rights reserved. 
  7.  * 
  8.  * @version 1.0.0 
  9.  * @author  IoT-College <[email protected]> 
  10.  * @date    2017-12-11 13:18:22 
  11.  * 
  12.  * @note        1. The official flagship store: 
  13.  *              Unopened 
  14.  * 
  15.  *              2. Blog: 
  16.  *              *GitHub: https://github.com/IoT-College 
  17.  *              *CSDN:   https://blog.csdn.net/IoT_College 
  18.  *              *StackOverflow:  
  19.  *              https://stackoverflow.com/users/9555987/iot-college 
  20.  *                       
  21.  *              3. QQ Communication group: 
  22.  *              *Group 1: 575036716 
  23.  *              *Group 2: 684572410 
  24.  *              *Group 3: 587518203 
  25.  *******************************************************************/  
  26. #ifndef HAL_DHT11_H  
  27. #define HAL_DHT11_H  
  28.   
  29. #ifdef __cplusplus  
  30. extern "C" {  
  31. #endif  
  32.   
  33. /******************************************************************* 
  34.  *                          Includes   
  35.  ******************************************************************* 
  36.  */  
  37. #include "hal_delay.h"  
  38.      
  39.     
  40. /******************************************************************* 
  41.  *               Constant-Macros And Enumerations     
  42.  ******************************************************************* 
  43.  */  
  44.   
  45. /** @brief   DHT11 GPIO 
  46.  */  
  47. #define HAL_DHT11_PORT          0  
  48. #define HAL_DHT11_PIN           6  
  49.      
  50. /** @brief   DHT11 Data 
  51.  *      Temperature, 
  52.  *      Humidity 
  53.  */  
  54. typedef struct   
  55. {  
  56.     uint8 temp;  
  57.     uint8 humi;  
  58.   
  59.     bool ok;  
  60. }halDHT11Data_t;  
  61.     
  62.      
  63. /******************************************************************* 
  64.  *                              API    
  65.  ******************************************************************* 
  66.  */  
  67.   
  68. /** 
  69.  * @fn          halDHT11Init 
  70.  *  
  71.  * @brief       Init. DHT11 
  72.  */  
  73. void halDHT11Init(void);     
  74.      
  75. /** 
  76.  * @fn          halDHT11GetData 
  77.  *  
  78.  * @brief       Get data from DHT11 
  79.  * 
  80.  * @param       None 
  81.  * 
  82.  * @note        Temperature: 0~50 C 
  83.  *              Humidity: 20~95% 
  84.  */  
  85. halDHT11Data_t  halDHT11GetData(void);  
  86.   
  87.   
  88. #ifdef __cplusplus  
  89. }  
  90. #endif  
  91.   
  92. #endif /* #ifndef HAL_DHT11_H */  

  程序源文件:

  1. /******************************************************************* 
  2.  * @file    hal_dht11.c 
  3.  * @brief   Temperature & Humidity Sensor Driver - DHT11 
  4.  * 
  5.  * Copyright (c) 2017~2020 ShenZhen IoT-College Technology Co., Ltd.  
  6.  * All rights reserved. 
  7.  * 
  8.  * @version 1.0.0 
  9.  * @author  IoT-College <[email protected]> 
  10.  * @date    2017-12-11 13:18:22 
  11.  * 
  12.  * @note        1. The official flagship store: 
  13.  *              UNopened 
  14.  * 
  15.  *              2. Blog: 
  16.  *              *GitHub: https://github.com/IoT-College 
  17.  *              *CSDN:   https://blog.csdn.net/IoT_College 
  18.  *              *StackOverflow:  
  19.  *              https://stackoverflow.com/users/9555987/iot-college 
  20.  *                       
  21.  *              3. QQ Communication group: 
  22.  *              *Group 1: 575036716 
  23.  *              *Group 2: 684572410 
  24.  *              *Group 3: 587518203 
  25.  *******************************************************************/  
  26.   
  27. /******************************************************************* 
  28.  *                          Includes   
  29.  ******************************************************************* 
  30.  */  
  31. #include "hal_dht11.h"  
  32. #include "CC2530_IoConfig.h"  
  33.   
  34.   
  35. /******************************************************************* 
  36.  *               Constant-Macros And Enumerations     
  37.  ******************************************************************* 
  38.  */  
  39.   
  40. /** @brief   DHT11 Boolean 
  41.  */  
  42. #define HAL_DHT11_FALSE         0  
  43. #define HAL_DHT11_TRUE          1  
  44.   
  45. /** @brief   DHT11 Status Code 
  46.  */  
  47. #define HAL_DHT11_SC_ERR                HAL_DHT11_FALSE  
  48. #define HAL_DHT11_SC_OK                 HAL_DHT11_TRUE  
  49. #define HAL_DHT11_SC_HUMI_OUTOFRANGE    0xF1  
  50. #define HAL_DHT11_SC_TEMP_OUTOFRANGE    0xF2  
  51. #define HAL_DHT11_SC_HT_OUTOFRANGE      0xF3  
  52.   
  53. /** @brief   Delay Function 
  54.  *      us, 
  55.  *      ms 
  56.  */     
  57. #define HAL_DHT11_DELAY_US(x)   delayUsIn32Mhz((x))  
  58. #define HAL_DHT11_DELAY_MS(x)   delayMs(HAL_DELAY_32MHZ ,(x))  
  59.      
  60. /** @brief   Set DHT11 GPIO 
  61.  *      output, 
  62.  *      input 
  63.  */     
  64. #define HAL_DHT11_IO_OUTPUT()   CC2530_GPIOMODE_CONFIG(HAL_DHT11_PORT,  \  
  65.                                                        HAL_DHT11_PIN,   \  
  66.                                                        CC2530_GPIO_OUTPUT)  
  67. #define HAL_DHT11_IO_INPUT()    CC2530_GPIOMODE_CONFIG(HAL_DHT11_PORT,  \  
  68.                                                        HAL_DHT11_PIN,   \  
  69.                                                        CC2530_GPIO_INPUT_PULLDOWN)  
  70. /** @brief   Set DHT11 GPIO Level 
  71.  *      low-level, 
  72.  *      high-level 
  73.  */   
  74. // set IO level  
  75. #define HAL_DHT11_IO_SET(port, pin, level){ \  
  76.   if(level) CC2530_GPIO_SET(port, pin);     \  
  77.   else CC2530_GPIO_CLEAR(port, pin);        \  
  78. }  
  79. // Set IO as high-level  
  80. #define HAL_DHT11_IO_SET_LO()  HAL_DHT11_IO_SET(HAL_DHT11_PORT, HAL_DHT11_PIN, 0)  
  81. // Set IO as low-level  
  82. #define HAL_DHT11_IO_SET_HI()  HAL_DHT11_IO_SET(HAL_DHT11_PORT, HAL_DHT11_PIN, 1)  
  83.   
  84. /** @brief   DHT11 GPIO Status 
  85.  */  
  86. #define HAL_DHT11_IO_GET_STA(port, pin) CC2530_GPIO_GET(port, pin)  
  87. #define HAL_DHT11_IO()  HAL_DHT11_IO_GET_STA(HAL_DHT11_PORT, HAL_DHT11_PIN)  
  88.   
  89. /** @brief   DHT11 Measurement range detection 
  90.  *      Temperature: 0~50 C 
  91.  *      Humidity: 20~95%RH 
  92.  */   
  93. #define HAL_DHT11_TEMP_OK(t)    ((t) <= 50)  
  94. #define HAL_DHT11_HUMI_OK(h)    ((h) >= 20 && (h) <= 95)  
  95.   
  96.      
  97. /******************************************************************* 
  98.  *                 Local Functions Declarations 
  99.  ******************************************************************* 
  100.  */  
  101. static void halDHT11SetIdle(void);  
  102. static uint8 halDHT11ReadByte(void);  
  103. static uint8 halDHT11CheckData(uint8 TempI, uint8 HumiI);  
  104.   
  105.   
  106. /******************************************************************* 
  107.  *                          Global Functions   
  108.  ******************************************************************* 
  109.  */  
  110.   
  111. /** 
  112.  * @fn          halDHT11Init 
  113.  *  
  114.  * @brief   Init. DHT11 
  115.  */  
  116. void halDHT11Init(void)  
  117. {  
  118.     halDHT11SetIdle();  
  119. }  
  120.   
  121. /** 
  122.  * @fn          halDHT11GetData 
  123.  *  
  124.  * @brief   Get data from DHT11 
  125.  * 
  126.  * @param   None 
  127.  * 
  128.  * @note        Temperature: 0~50 C 
  129.  *              Humidity: 20~95% 
  130.  */  
  131. halDHT11Data_t  halDHT11GetData(void)  
  132. {  
  133.     halDHT11Data_t dht11Dat = { .ok = 0 };  
  134.     uint8 HumiI, HumiF, TempI, TempF, CheckSum;  
  135.       
  136.     /* >18ms, keeping gpio low-level */  
  137.     HAL_DHT11_IO_SET_LO();  
  138.     HAL_DHT11_DELAY_MS(60);  
  139.       
  140.     HAL_DHT11_IO_SET_HI();  
  141.       
  142.     /* Wait 20~40us then read ACK */  
  143.     HAL_DHT11_DELAY_US(35);  
  144.     HAL_DHT11_IO_INPUT();  
  145.     if(!HAL_DHT11_IO())  
  146.     {  
  147.         uint16 cnt = 1070; // ~1ms  
  148.           
  149.         /* Wait for the end of ACK */  
  150.         while(!HAL_DHT11_IO() && cnt--);  
  151.         if(!cnt)   
  152.         {  
  153.             goto Exit;  
  154.         }  
  155.           
  156.         /* ~80us, DHT11 GPIO will be set after ACK */  
  157.         cnt = 1070;  // ~1ms  
  158.         HAL_DHT11_DELAY_US(80);  
  159.         while(HAL_DHT11_IO() && cnt--);  
  160.         if(!cnt)   
  161.         {  
  162.             goto Exit;  
  163.         }  
  164.   
  165.         /* Read data */  
  166.         HumiI = halDHT11ReadByte();  
  167.         HumiF = halDHT11ReadByte();  
  168.         TempI = halDHT11ReadByte();  
  169.         TempF = halDHT11ReadByte();  
  170.         CheckSum = halDHT11ReadByte();  
  171.           
  172.         /* Checksum */  
  173.         if(CheckSum == (HumiI + HumiF + TempI + TempF))  
  174.         {  
  175.             dht11Dat.temp = TempI;  
  176.             dht11Dat.humi = HumiI;  
  177.               
  178.             dht11Dat.ok = halDHT11CheckData(TempI, HumiI);  
  179.         }  
  180.     }  
  181.       
  182. Exit:  
  183.     /* Idle */  
  184.     halDHT11SetIdle();  
  185.     
  186.     return dht11Dat;  
  187. }  
  188.   
  189.   
  190. /******************************************************************* 
  191.  *                       Local Functions  
  192.  ******************************************************************* 
  193.  */  
  194.   
  195. /** 
  196.  * @fn          halDHT11SetIdle 
  197.  *  
  198.  * @brief       DHT11 Idle 
  199.  */  
  200. static void halDHT11SetIdle(void)  
  201. {  
  202.     HAL_DHT11_IO_OUTPUT();  
  203.     HAL_DHT11_IO_SET_HI();  
  204. }  
  205.   
  206. /** 
  207.  * @fn          halDHT11ReadByte 
  208.  *  
  209.  * @brief       Read a byte from DHT11 
  210.  */  
  211.  static uint8 halDHT11ReadByte(void)  
  212.  {  
  213.     uint8 dat = 0;  
  214.       
  215.     for(uint8 i = 0; i < 8; i++)  
  216.     {  
  217.         uint16 cnt = 5350;  // ~5ms  
  218.           
  219.         /* Busy */  
  220.         while(!HAL_DHT11_IO() && cnt--);  
  221.         if(!cnt)   
  222.         {  
  223.             break;  
  224.         }  
  225.           
  226.         /* Read bit based on high-level duration: 
  227.          *      26~28us: 0 
  228.          *      >70us:   1 
  229.          */  
  230.         HAL_DHT11_DELAY_US(50);  
  231.         if(HAL_DHT11_IO())  
  232.         {        
  233.             dat <<= 1;  
  234.             dat |= 1;  
  235.         }  
  236.         else  
  237.         {  
  238.             dat <<= 1;  
  239.             continue;  
  240.         }  
  241.           
  242.         /* Waiting end */  
  243.         cnt = 1070;   // ~1ms  
  244.         while(HAL_DHT11_IO() && cnt--);  
  245.         if(!cnt)   
  246.         {  
  247.             break;  
  248.         }  
  249.     }  
  250.       
  251.     return dat;  
  252. }  
  253.   
  254. /** 
  255.  * @fn          halDHT11CheckData 
  256.  *  
  257.  * @brief       Check measured value 
  258.  */  
  259. static uint8 halDHT11CheckData(uint8 TempI, uint8 HumiI)  
  260. {  
  261.     if(HAL_DHT11_HUMI_OK(HumiI))  
  262.     {  
  263.       if(HAL_DHT11_TEMP_OK(TempI))  
  264.         return HAL_DHT11_SC_OK;  
  265.       else  
  266.         return HAL_DHT11_SC_TEMP_OUTOFRANGE;  
  267.     }  
  268.       
  269.     if(HAL_DHT11_TEMP_OK(TempI))  
  270.       return HAL_DHT11_SC_HUMI_OUTOFRANGE;  
  271.     else  
  272.       return HAL_DHT11_SC_HT_OUTOFRANGE;  
  273. }  



  

你可能感兴趣的:(ZigBee,CC2530)