zoukankan      html  css  js  c++  java
  • DHT11数字温度湿度传感器驱动(基于传感器管理组件)

    传感器简介

    DHT11数字温度湿度传感器是一款有已校准数字信号输出的温湿度复合传感器,其测量精度:湿度+-5%RH、温度:+-2℃;测量范围:湿度20-90%RH、温度0-50℃。

    DHT11.c

      1 /**
      2  * @file DHT11.c
      3  * @brief
      4  * @version 0.1
      5  * @date 2019-06-28
      6  *
      7  * @copyright Copyright (c) 2019  Chipintelli Technology Co., Ltd.
      8  *
      9  */
     10 /*-----------------------------------------------------------------------------
     11                             include
     12 -----------------------------------------------------------------------------*/
     13 #include "ci_sensor.h"
     14 #include "ci110x_scu.h"
     15 #include "ci110x_timer.h"
     16 #include "ci110x_gpio.h"
     17 #include "platform_config.h"
     18 
     19 /*-----------------------------------------------------------------------------
     20                             define
     21 -----------------------------------------------------------------------------*/
     22 #define DHT11_GPIO_GROUP    (GPIO0)/*!< GPIO组 */
     23 #define DHT11_GPIO_PIN      (gpio_pin_2)/*!< GPIO pin脚 */
     24 #define DHT11_GPIO_PAD      (UART1_TX_PAD)/*!< GPIO对应PAD */
     25 #define DHT11_GPIO_IRQ      (GPIO0_IRQn)/*!< GPIO中断 */
     26 
     27 #define DHT11_TIMER         (TIMER0)/*!< TIMER控制器 */
     28 #define DHT11_TIMER_IRQ     (TIMER0_IRQn)/*!< TIMER中断 */
     29 #define DHT11_TIMER_ONEUS_COUNT (get_apb_clk())
     30 
     31 /*-----------------------------------------------------------------------------
     32                             extern
     33 -----------------------------------------------------------------------------*/
     34 
     35 /*-----------------------------------------------------------------------------
     36                         struct / enum / union
     37 -----------------------------------------------------------------------------*/
     38 
     39 /*-----------------------------------------------------------------------------
     40                             global
     41 -----------------------------------------------------------------------------*/
     42 uint8_t dht11_flag = 0xFF;/*!< 中断标志 */
     43 uint8_t dht11_data[5] = {0};/*!< 二进制数据接收数组 */
     44 uint8_t dht11_count = 0;/*!< GPIO中断计数控制 */
     45 
     46 /*-----------------------------------------------------------------------------
     47                             declare
     48 -----------------------------------------------------------------------------*/
     49 
     50 /*-----------------------------------------------------------------------------
     51                             function
     52 -----------------------------------------------------------------------------*/
     53 
     54 /**
     55  * @brief TIMER配置
     56  */
     57 void Dht11_Timer_Init(void)
     58 {
     59     timer_init_t init;
     60     init.mode = timer_count_mode_single;
     61     init.div = timer_clk_div_0;
     62     init.width = timer_iqr_width_2;
     63     init.count = 0xFFFFFFFF;
     64     timer_init(DHT11_TIMER,init);
     65     timer_start(DHT11_TIMER);
     66 }
     67 
     68 /**
     69  * @brief TIMER配置毫秒级延时
     70  *
     71  * @param ms 毫秒
     72  */
     73 void Dht11_Timer_Ms(int ms)
     74 {
     75     timer_stop(DHT11_TIMER);
     76     timer_set_count(DHT11_TIMER,ms * DHT11_TIMER_ONEUS_COUNT / 1000);
     77     timer_start(DHT11_TIMER);
     78 }
     79 
     80 /**
     81  * @brief TIMER配置微秒级延时
     82  *
     83  * @param us 微秒
     84  */
     85 void Dht11_Timer_Us(int us)
     86 {
     87     timer_stop(DHT11_TIMER);
     88     timer_set_count(DHT11_TIMER,us * DHT11_TIMER_ONEUS_COUNT / 1000000);
     89     timer_start(DHT11_TIMER);
     90 }
     91 
     92 /**
     93  * @brief DHT11模块初始化
     94  *
     95  */
     96 void Dht11_Init()
     97 {
     98     Scu_SetDeviceGate((unsigned int)DHT11_TIMER,ENABLE);
     99     Scu_Setdevice_Reset((unsigned int)DHT11_TIMER);
    100     Scu_Setdevice_ResetRelease((unsigned int)DHT11_TIMER);
    101     NVIC_EnableIRQ(DHT11_TIMER_IRQ);
    102 
    103     Scu_SetDeviceGate((unsigned int)DHT11_GPIO_GROUP,ENABLE);
    104     Scu_Setdevice_Reset((unsigned int)DHT11_GPIO_GROUP);
    105     Scu_Setdevice_ResetRelease((unsigned int)DHT11_GPIO_GROUP);
    106     NVIC_EnableIRQ(DHT11_GPIO_IRQ);
    107 
    108     Scu_SetIOReuse(DHT11_GPIO_PAD,FIRST_FUNCTION);
    109     gpio_set_output_mode(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    110     gpio_set_output_high_level(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    111 
    112     Dht11_Timer_Init();
    113 }
    114 
    115 /**
    116  * @brief DHT11模块TIMER中断程序
    117  *
    118  */
    119 void dht11_timer_handler(void)
    120 {
    121     dht11_flag = 0;
    122 }
    123 
    124 /**
    125  * @brief DHT11模块GPIO中断程序
    126  *
    127  */
    128 void dht11_gpio_handler(void)
    129 {
    130     if(dht11_count != 0)
    131     {
    132         Dht11_Timer_Us(50);
    133     }
    134     dht11_count++;
    135 }
    136 
    137 void dht11_wait_timer(void)
    138 {
    139     uint32_t timeout = 0x5FFFF;
    140     while(dht11_flag && timeout--);
    141     dht11_flag = 0xFF;
    142 }
    143 
    144 /**
    145  * @brief 初始化DHT11模块
    146  *
    147  * @param irq_callback 中断回调
    148  * @retval RETURN_OK
    149  * @retval RETURN_ERR
    150  */
    151 int32_t dht11_open(void)
    152 {
    153     Dht11_Init();
    154     return RETURN_OK;
    155 }
    156 
    157 /**
    158  * @brief DHT11传感器读数据
    159  *
    160  * @param data 读到的数据
    161  * @retval RETURN_OK
    162  * @retval RETURN_ERR
    163  */
    164 int32_t dht11_read(sensor_data_t *data)
    165 {
    166     uint8_t temp = 0;
    167     uint8_t dht11_buf[40] = {0};
    168 START:
    169     gpio_set_output_mode(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    170     gpio_set_output_low_level(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    171     Dht11_Timer_Ms(20);
    172     dht11_wait_timer();
    173     gpio_set_output_mode(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    174     gpio_set_output_high_level(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    175     Dht11_Timer_Us(20);
    176     dht11_wait_timer();
    177     gpio_set_input_mode(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    178     gpio_irq_trigger_config(DHT11_GPIO_GROUP,DHT11_GPIO_PIN,up_edges_trigger);
    179     for(int i = 0;i < 40;i++)
    180     {
    181         dht11_wait_timer();
    182         dht11_buf[i] = gpio_get_input_level(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    183     }
    184     gpio_set_output_mode(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    185     gpio_set_output_high_level(DHT11_GPIO_GROUP,DHT11_GPIO_PIN);
    186     timer_stop(DHT11_TIMER);
    187     dht11_count = 0;
    188     for(int i = 0;i < 5;i++)
    189     {
    190         temp = 0;
    191         for(int j = 0;j < 8;j++)
    192         {
    193             temp |= dht11_buf[j + i * 8] << (7 - j);
    194         }
    195         dht11_data[i] = temp;
    196     }
    197     temp = dht11_data[0] + dht11_data[1] + dht11_data[2] + dht11_data[3];
    198     if(dht11_data[4] != temp)
    199     {
    200         Dht11_Timer_Us(50);
    201         dht11_wait_timer();
    202         goto START;
    203     }
    204     else
    205     {
    206         data->humidity = dht11_data[0] * 10;
    207     }
    208     return RETURN_OK;
    209 }
    210 
    211 /**
    212  * @brief DHT11传感器ops
    213  *
    214  */
    215 sensor_ops_t dht11_ops =
    216 {
    217     dht11_open,
    218     dht11_read,
    219 };
    220 
    221 /*-----------------------------------------------------------------------------
    222                             end of the file
    223 -----------------------------------------------------------------------------*/

    DHT11.h

     1 /**
     2  * @file DHT11.h
     3  * @brief DHT11传感器的头文件
     4  * @version 0.1
     5  * @date 2019-07-02
     6  *
     7  * @copyright Copyright (c) 2019  Chipintelli Technology Co., Ltd.
     8  *
     9  */
    10 
    11 #ifndef __DHT11_H__
    12 #define __DHT11_H__
    13 
    14 /**
    15  * @ingroup third_device_driver
    16  * @defgroup DHT11
    17  * @brief DHT11传感器驱动
    18  * @{
    19  */
    20 
    21 #ifdef __cplusplus
    22 extern "C" {
    23 #endif
    24 
    25 /*-----------------------------------------------------------------------------
    26                             include
    27 -----------------------------------------------------------------------------*/
    28 
    29 /*-----------------------------------------------------------------------------
    30                             define
    31 -----------------------------------------------------------------------------*/
    32 
    33 /*-----------------------------------------------------------------------------
    34                             extern
    35 -----------------------------------------------------------------------------*/
    36 extern sensor_ops_t dht11_ops;
    37 
    38 /*-----------------------------------------------------------------------------
    39                         struct / enum / union
    40 -----------------------------------------------------------------------------*/
    41 
    42 /*-----------------------------------------------------------------------------
    43                             global
    44 -----------------------------------------------------------------------------*/
    45 
    46 /*-----------------------------------------------------------------------------
    47                         function declare
    48 -----------------------------------------------------------------------------*/
    49 
    50 #ifdef __cplusplus
    51 }
    52 #endif
    53 
    54 /**
    55  * @}
    56  */
    57 
    58 #endif
    59 
    60 /*-----------------------------------------------------------------------------
    61                             end of the file
    62 -----------------------------------------------------------------------------*/
  • 相关阅读:
    【Android
    【数据结构】之链表(C语言描述)
    【数据结构】之顺序表(C语言描述)
    【Android
    【Android
    【Android
    【Android
    【Android
    在线HTTP速度测试(响应时间测试)及浏览器兼容测试
    阿里云 腾讯云 服务器挂载数据盘
  • 原文地址:https://www.cnblogs.com/wangyanwen/p/11451555.html
Copyright © 2011-2022 走看看