查看: 12921|回复: 39

[分享] 【LPC824lite】DHT11温湿度测试

[复制链接]
  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
    发表于 2016-11-11 23:53:58 | 显示全部楼层 |阅读模式

    今天给大家分享一下LPC824读取DHT11的数据,并通过串口发送到计算机。

    DHT11用过的都应该非常熟悉,只需要一个引脚与MCU链接,就可以读取温湿度值,不过精度不太好,只有整数位。

    QQ截图20161111233333.jpg
    读取的数据格式如下
    QQ截图20161111233619.jpg
    使用dht11最关键的是看懂时序,起始还是比较简单的。
    QQ截图20161111233633.jpg
    首先主机MCU拉低18ms,之后拉高20-40us,然后主机切换为输入状态。主机通过检测如下时序判断是否有响应
    QQ截图20161111233649.jpg
    然后就是读每位数据,看高电平的时间来判断0还是1
    QQ截图20161111233704.jpg

    QQ截图20161111233713.jpg
    我在这里采用p0.17来测试
    QQ截图20161111234001.jpg
    主函数前定义变量
    QQ截图20161111232944.jpg
    下面是测试函数,首先初始化DHT11,如果成功,读取数据
    QQ截图20161111233015.jpg
    下面是.h文件内容
    QQ截图20161111233059.jpg
    下面是.c文件,
    需要用到的变量和一些宏定义
    QQ截图20161111233118.jpg
    局部内部函数
    QQ截图20161111233126.jpg
    DHT11初始化,完成硬件初始化
    QQ截图20161111234150.jpg
    DHT11复位,启动DHT11
    QQ截图20161111234058.jpg
    启动信号后检测是否有响应
    QQ截图20161111234110.jpg
    读取1位函数,比较简单,就是在出现高电平后演示30us读引脚状态,如果还为高,则该位位1,否则为0
    QQ截图20161111234122.jpg
    读取字节数据
    QQ截图20161111234138.jpg
    下面是演示效果。
    QQ截图20161111232813.jpg


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
     楼主| 发表于 2016-11-11 23:54:43 | 显示全部楼层
    dth11.h文件
    1. /*
    2. * dht11.h
    3. *
    4. *  Created on: 2016年11月11日
    5. *      Author: LKL0305
    6. */

    7. #ifndef DHT11_H_
    8. #define DHT11_H_

    9. #include "chip.h"
    10. #include "delay.h"
    11. #include "string.h"

    12. #define HIGH true
    13. #define LOW false

    14. typedef struct
    15. {
    16.     uint8_t curI;
    17.     uint8_t thAmount;
    18.     uint8_t thBufs[10][2];
    19. }thTypedef_t;

    20. /* Function declaration */
    21. uint8_t DHT11_Init(uint8_t dht11_Pin);
    22. uint8_t DHT11_Read(uint8_t *temperature, uint8_t *humidity);

    23. #endif /* DHT11_H_ */
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
     楼主| 发表于 2016-11-11 23:55:58 | 显示全部楼层
    dht11.c文件
    1. /*
    2. * DHT11.c
    3. *
    4. *  Created on: 2016年11月11日
    5. *      Author: LKL0305
    6. */

    7. #include "dht11.h"

    8. #define DHT11_SET_IN() Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, 0, dht11_Pin)
    9. #define DHT11_SET_OUT() Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, dht11_Pin)
    10. #define        DHT11_DQ_OUT(x) Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, dht11_Pin, x)
    11. #define        DHT11_DQ_IN() Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, dht11_Pin)

    12. #define MEAN_NUM            10

    13. thTypedef_t temphumTypedef;
    14. uint8_t dht11_Pin;

    15. uint8_t DHT11_ReadData(uint8_t *temperature, uint8_t *humidity);
    16. uint8_t DHT11_ReadByte(void);
    17. uint8_t DHT11_ReadBit(void);
    18. uint8_t DHT11_Check(void);
    19. void DHT11_Rst(void);

    20. void DHT11_Rst(void)
    21. {
    22.     DHT11_SET_OUT();
    23.     DHT11_DQ_OUT(LOW);
    24.     Delay_Ms(20);
    25.     DHT11_DQ_OUT(HIGH);
    26.     Delay_Us(30);
    27. }

    28. uint8_t DHT11_Check(void)
    29. {
    30.     uint8_t retry = 0;
    31.     DHT11_SET_IN();
    32.     while (DHT11_DQ_IN() && (retry < 100))
    33.     {
    34.         retry++;
    35.         Delay_Us(1);
    36.     }
    37.     if (retry >= 100)
    38.     {
    39.         return 1;
    40.     }
    41.     else
    42.     {
    43.         retry = 0;
    44.     }
    45.     while (!DHT11_DQ_IN() && (retry < 100))
    46.     {
    47.         retry++;
    48.         Delay_Us(1);
    49.     }
    50.     if(retry >= 100)
    51.     {
    52.         return 1;
    53.     }
    54.     return 0;
    55. }

    56. uint8_t DHT11_ReadBit(void)
    57. {
    58.     uint8_t retry=0;
    59.     while (DHT11_DQ_IN() && (retry < 100))
    60.     {
    61.         retry++;
    62.         Delay_Us(1);
    63.     }
    64.     retry = 0;
    65.     while (!DHT11_DQ_IN() && (retry < 100))
    66.     {
    67.         retry++;
    68.         Delay_Us(1);
    69.     }
    70.     Delay_Us(30);
    71.     if (DHT11_DQ_IN())
    72.     {
    73.         return 1;
    74.     }
    75.     else
    76.     {
    77.         return 0;
    78.     }
    79. }

    80. uint8_t DHT11_ReadByte(void)
    81. {
    82.     uint8_t i, dat;
    83.     dat = 0;
    84.     for (i = 0; i < 8; i++)
    85.     {
    86.         dat <<= 1;
    87.         dat |= DHT11_ReadBit();
    88.     }

    89.     return dat;
    90. }

    91. uint8_t DHT11_ReadData(uint8_t *temperature, uint8_t *humidity)
    92. {
    93.     uint8_t buf[5];
    94.     uint8_t i;
    95.     DHT11_Rst();
    96.     if (0 == DHT11_Check())
    97.     {
    98.         for (i = 0; i < 5; i++)
    99.         {
    100.             buf[i] = DHT11_ReadByte();
    101.         }
    102.         if (buf[4] == (buf[0] + buf[1] + buf[2] + buf[3]))
    103.         {
    104.             *humidity = buf[0];
    105.             *temperature = buf[2];
    106.         }
    107.     }
    108.     else
    109.     {
    110.         return 1;
    111.     }

    112.     return 0;
    113. }

    114. uint8_t DHT11_Read(uint8_t *temperature, uint8_t *humidity)
    115. {
    116.     uint8_t curTem = 0, curHum = 0;
    117.     uint16_t temMeans = 0, humMeans = 0;
    118.     uint8_t curI = 0;
    119.     uint8_t ret = 0;

    120.     ret = DHT11_ReadData(&curTem, &curHum);
    121.     if (1 != ret)
    122.     {
    123.         if (MEAN_NUM > temphumTypedef.curI)
    124.         {
    125.             temphumTypedef.thBufs[temphumTypedef.curI][0] = curTem;
    126.             temphumTypedef.thBufs[temphumTypedef.curI][1] = curHum;
    127.             temphumTypedef.curI++;
    128.         }
    129.         else
    130.         {
    131.             temphumTypedef.curI = 0;
    132.             temphumTypedef.thBufs[temphumTypedef.curI][0] = curTem;
    133.             temphumTypedef.thBufs[temphumTypedef.curI][1] = curHum;
    134.             temphumTypedef.curI++;
    135.         }
    136.     }
    137.     else
    138.     {
    139.         return 1;
    140.     }
    141.     if (MEAN_NUM <= temphumTypedef.curI)
    142.     {
    143.         temphumTypedef.thAmount = MEAN_NUM;
    144.     }
    145.     if (0 == temphumTypedef.thAmount)
    146.     {
    147.         for (curI = 0; curI < temphumTypedef.curI; curI++)
    148.         {
    149.             temMeans += temphumTypedef.thBufs[curI][0];
    150.             humMeans += temphumTypedef.thBufs[curI][1];
    151.         }

    152.         temMeans = temMeans / temphumTypedef.curI;
    153.         humMeans = humMeans / temphumTypedef.curI;

    154.         *temperature = temMeans;
    155.         *humidity = humMeans;
    156.     }
    157.     else if (MEAN_NUM == temphumTypedef.thAmount)
    158.     {
    159.         for(curI = 0; curI < temphumTypedef.thAmount; curI++)
    160.         {
    161.             temMeans += temphumTypedef.thBufs[curI][0];
    162.             humMeans += temphumTypedef.thBufs[curI][1];
    163.         }

    164.         temMeans = temMeans / temphumTypedef.thAmount;
    165.         humMeans = humMeans / temphumTypedef.thAmount;

    166.         *temperature = (uint8_t)temMeans;
    167.         *humidity = (uint8_t)humMeans;
    168.     }
    169.     return 0;
    170. }

    171. uint8_t DHT11_Init(uint8_t Pin)
    172. {
    173.         dht11_Pin = Pin;

    174.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);

    175.         DHT11_SET_OUT();
    176.         DHT11_DQ_OUT(HIGH);

    177.     DHT11_Rst();
    178.     memset((uint8_t *)&temphumTypedef, 0, sizeof(thTypedef_t));
    179.     return DHT11_Check();
    180. }
    复制代码
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-24 08:30
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    22

    主题

    817

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1713
    最后登录
    2019-12-7
    发表于 2016-11-12 10:06:30 | 显示全部楼层
    感谢分享  
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-23 10:20
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    5

    主题

    693

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1406
    最后登录
    2025-7-21
    发表于 2016-11-12 10:30:24 | 显示全部楼层
    感谢分享
    dfdfdfdfdfdfdfd dsfa222
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-11-12 12:03:32 | 显示全部楼层
    谢谢分享。。。 null.png null1.png null2.png null3.png null4.png null5.png null6.png null7.png null8.png null9.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    17

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    2016-11-12
    发表于 2016-11-12 14:06:22 | 显示全部楼层
    顶一个
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-3-13 21:33
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    113

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    285
    最后登录
    2020-1-8
    发表于 2016-11-12 14:18:30 | 显示全部楼层
    猴赛雷
    看飞卡的代码看得到头晕啊,好多代码啊,,,,,,
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2016-11-12 15:16:54 | 显示全部楼层
    谢谢分享           
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-26 17:21
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    42

    帖子

    0

    注册会员

    Rank: 2

    积分
    170
    最后登录
    2017-3-9
    发表于 2016-11-12 20:04:24 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 20:53 , Processed in 0.106427 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表