查看: 4769|回复: 5

[原创] KL25Z(四) 0.96寸OLED+DHT22(AM2302)

[复制链接]
  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    连续签到: 1 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
    发表于 2016-9-16 14:51:46 | 显示全部楼层 |阅读模式
           乘着放假把DHT22(AM2302)的程序完善了下,说是完善也就是将抄来的代码重新组装一下而已。这个DHT22与DHT11相比不光是体积大了一圈,而且精度也较之有了提升,价格当然也跟上去了。输出的数据同样是40位,前16位是湿度;随后的16位是温度;最后8位是前面32位的校验和。驱动程序都差不多,这次程序也是在DHT11的基础上修改的。程序还存在一些问题,目前只是有输出而已,采集的数据有些问题需要进一步优化。 DHT11.png
    DHT22.png
    IMG_20160915_234033.jpg
    下面是主要的代码:
    1. static void DHT22_Mode_IPU(void)//使DHT22-DATA引脚变为输入模式
    2. {
    3. GPIO_InitTypeDef GPIO_InitStruct1;
    4.        
    5.         GPIO_InitStruct1.GPIO_Pin = GPIO_Pin_1;
    6.         GPIO_InitStruct1.GPIO_InitState = Bit_SET;
    7.         GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;
    8.         GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置引脚模式为浮空输入模式
    9.         GPIO_InitStruct1.GPIOx = PTC;
    10.         GPIO_Init(&GPIO_InitStruct1);         
    11. }


    12. static void DHT22_Mode_OPP(void)//使DHT22-DATA引脚变为输出模式
    13. {
    14.         GPIO_InitTypeDef GPIO_InitStruct1;
    15.        
    16.         GPIO_InitStruct1.GPIO_Pin = GPIO_Pin_1;
    17.         GPIO_InitStruct1.GPIO_InitState = Bit_SET;
    18.         GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;
    19.         GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_OPP;//设置引脚模式为通用推挽输出
    20.         GPIO_InitStruct1.GPIOx = PTC;
    21.         GPIO_Init(&GPIO_InitStruct1);                  
    22. }      


    23. //复位DHT22
    24. void DHT22_Rst(void)          
    25. {                 
    26.         DHT22_Mode_OPP();                        //设置为输出模式
    27.         DHT22_DATA_OUT(0);               
    28.         DelayMs(20);                                //主机拉低总线保持18mS以上
    29.         DHT22_DATA_OUT(1);                  
    30.         DelayUs(30);                                   //主机拉高总线30us
    31. }


    32. //等待DHT22的回应
    33. //返回1:未检测到DHT11的存在
    34. //返回0:存在
    35. uint8_t DHT22_Check(void)           
    36. {   
    37.         uint8_t retry=0;
    38.         DHT22_Mode_IPU();                        //主机设为输入       
    39.     while (DHT22_DATA_IN() && retry<100)//DHT11会拉低40~80us
    40.         {
    41.                 retry++;
    42.                 DelayUs(1);
    43.         };         
    44.         if(retry>=100)
    45.                 return 1;
    46.         else
    47.                 retry=0;
    48.     while (!DHT22_DATA_IN() && retry<100)//DHT11拉低后会再次拉高40~80us
    49.         {
    50.                 retry++;
    51.                 DelayUs(1);
    52.         };
    53.         if(retry>=100)
    54.                 return 1;            
    55.         return 0;
    56. }


    57. //从DHT22读取一个位
    58. //返回值:1/0
    59. uint8_t DHT22_Read_Bit(void)                          
    60. {
    61.         uint8_t retry=0;
    62.         while(DHT22_DATA_IN() && retry<100)//等待变为低电平
    63.         {
    64.                 retry++;
    65.                 DelayUs(1);
    66.         }
    67.         retry=0;
    68.         while(!DHT22_DATA_IN() && retry<100)//等待变高电平
    69.         {
    70.                 retry++;
    71.                 DelayUs(1);
    72.         }
    73.         DelayUs(40);//等待40us
    74.         if(DHT22_DATA_IN())
    75.                 return 1;
    76.         else
    77.                 return 0;                  
    78. }


    79. //从DHT22读取一个字节
    80. //返回值:读到的数据
    81. uint8_t DHT22_Read_Byte(void)   
    82. {        
    83.     uint8_t i,dat;
    84.     dat=0;
    85.         for (i=0;i<8;i++)
    86.         {
    87.                    dat<<=1;
    88.             dat|=DHT22_Read_Bit();
    89.     }                                                    
    90.     return dat;
    91. }


    92. //从DHT22读取一次数据
    93. //temp:温度值
    94. //humi:湿度值
    95. //返回值:0,正常;1,读取失败
    96. uint16_t DHT22_Read_Data(uint16_t *temp,uint16_t *humi)   
    97. {        
    98.         uint16_t buf[5];
    99.         uint8_t i;
    100.         DHT22_Rst();
    101.         if(DHT22_Check()==0)
    102.         {
    103.                 for(i=0;i<5;i++)//读取40位数据
    104.                 {
    105.                         buf[i]=DHT22_Read_Byte();
    106.                 }
    107.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    108.                 {
    109.                         *humi = ((8<<buf[0]) + buf[1]);
    110.                         *temp = ((8<<buf[2]) + buf[3]);
    111.                 }
    112.         }else return 1;
    113.         return 0;            
    114. }


    115. //初始化DHT22的IO口 DQ 同时检测DHT22的存在
    116. //返回1:不存在
    117. //返回0:存在             
    118. uint8_t DHT22_Init(void)
    119. {         
    120.         GPIO_InitTypeDef GPIO_InitStruct1;
    121.        
    122.         GPIO_InitStruct1.GPIO_Pin = GPIO_Pin_1;
    123.         GPIO_InitStruct1.GPIO_InitState = Bit_SET;
    124.         GPIO_InitStruct1.GPIO_IRQMode = GPIO_IT_DISABLE;
    125.         GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_OPP;
    126.         GPIO_InitStruct1.GPIOx = PTC;
    127.         GPIO_Init(&GPIO_InitStruct1);
    128.                             
    129.         DHT22_Rst();                          //复位DHT22
    130.         return DHT22_Check();        //等待DHT22的回应
    131. }
    复制代码
    两份DHT11文档:
    AM2302说明书.rar (241.1 KB, 下载次数: 7)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7907
    最后登录
    2025-4-11
    发表于 2016-9-16 14:55:51 | 显示全部楼层
    感谢分享,欢迎来参加中秋活动,奖品很丰富哦
    https://www.nxpic.org.cn/module/forum/thread-606050-1-1.html
    来根华子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    连续签到: 1 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
     楼主| 发表于 2016-9-16 14:58:23 | 显示全部楼层
    混森蓝兽 发表于 2016-9-16 14:55
    感谢分享,欢迎来参加中秋活动,奖品很丰富哦
    https://www.nxpic.org.cn/module/forum/thread-606050-1-1.html ...

    好的,我也试试
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2016-9-16 15:09:15 | 显示全部楼层
    谢谢分享,中秋也没闲着。
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    连续签到: 1 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
     楼主| 发表于 2016-9-16 15:11:53 | 显示全部楼层
    本帖最后由 lising 于 2016-9-16 15:36 编辑
    limale 发表于 2016-9-16 15:09
    谢谢分享,中秋也没闲着。

    没办法,活儿没干完
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-10 15:47
  • 签到天数: 1251 天

    连续签到: 1 天

    [LV.10]以坛为家III

    6

    主题

    2396

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    7534
    最后登录
    2025-5-23
    发表于 2016-9-16 17:33:49 | 显示全部楼层
    nxp.png
    nxp2.png
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-3 01:32 , Processed in 0.087258 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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