[PIC®/AVR®/dsPIC®产品] CuriosityNano测评报告】+驱动温湿度传感器DHT22

[复制链接]
3194|22
 楼主| dql2015 发表于 2021-5-30 18:53 | 显示全部楼层 |阅读模式


在上一期的测评中,使用AVR128DB48 Curiosity Nano成功驱动了温湿度传感器,
【CuriosityNano测评报告】+使用IO驱动单总线温湿度传感器DHT22
https://bbs.21ic.com/icview-3119748-1-1.html
这里就不再介绍DHT22了,这次将代码移植到PIC18F16Q40 Curiosity Nano上,有2个需要注意的地方:1是MCC生成的关于gpio设置上拉的接口不一致,MCC为AVR128DB48生成的代码gpiox_SetPullUp()而为PIC18F16Q40生成的代码是gpiox_SetPullup()呵呵哒,仅仅是一个大小写的问题,为啥api接口不一致呢???
2是PIC18F16Q40 的串口printf函数可以打印浮点数,而AVR128DB48的不行。
因此两者的驱动略有区别,稍微修改即可。
dht.h文件内容如下:
  1. /*
  2. * File:   dht.h
  3. * Author: qldeng
  4. *
  5. * Created on May 29, 2021, 12:17 PM
  6. */

  7. #ifndef DHT_H
  8. #define        DHT_H

  9. #ifdef        __cplusplus
  10. extern "C" {
  11. #endif

  12. #include "mcc_generated_files/mcc.h"

  13. #define delay_ms(d)                DELAY_milliseconds(d)
  14. #define delay_us(d) DELAY_microseconds(d)

  15. #define  u8 uint8_t
  16. #define  u16 uint16_t

  17. u8 DHT22_Init(void);                       
  18. u8 DHT22_Read_Data(float *temperature,float *humidity);   
  19. u8 DHT22_Read_Byte(void);               
  20. u8 DHT22_Read_Bit(void);               
  21. u8 DHT22_Check(void);                       
  22. void DHT22_Rst(void);


  23. #ifdef        __cplusplus
  24. }
  25. #endif

  26. #endif        /* DHT_H */

dht.c文件内容如下:

  1. #include "dht.h"
  2. //工作电压 :3.3V ~ 5.5 V
  3. //复位DHT22
  4. void DHT22_Rst(void)          
  5. {  
  6.     DHT22_SetDigitalOutput();
  7.     DHT22_SetLow();        //拉低DQ
  8.     delay_ms(30);            //拉低至少18ms
  9.     DHT22_SetHigh();        //DQ=1
  10.     delay_us(30);             //主机拉高20~40us
  11. }
  12. //等待DHT22的回应
  13. //返回1:未检测到DHT22的存在
  14. //返回0:存在
  15. u8 DHT22_Check(void)           
  16. {   
  17.         u8 retry=100;
  18.     DHT22_SetDigitalInput();
  19.      DHT22_SetPullup();
  20.            while ((DHT22_GetValue())&&retry)//DHT22会拉低40~80us
  21.         {
  22.                 retry--;
  23.                 delay_us(1);
  24.         };         
  25.         if(retry<1) return 1;
  26.         else retry=100;
  27.     while (!DHT22_GetValue()&&retry)//DHT22拉低后会再次拉高40~80us
  28.         {
  29.                 retry--;
  30.                 delay_us(1);
  31.         };
  32.         if(retry<1)
  33.                 return 1;            
  34.         return 0;
  35. }
  36. //从DHT22读取一个位
  37. //返回值:1/0
  38. u8 DHT22_Read_Bit(void)                          
  39. {
  40.         u8 dat=0;
  41.         u8 retry=100;
  42.         while((DHT22_GetValue())&&retry)//等待变为高电平
  43.         {
  44.                 retry--;
  45.                 delay_us(1);
  46.         }
  47.         retry=100;  
  48.         while(!DHT22_GetValue()&&retry)//等待变低电平
  49.         {
  50.                 retry--;
  51.                 delay_us(1);
  52.         }
  53.     delay_us(40);//wait 40us
  54.         if(DHT22_GetValue())
  55.                 dat=1;
  56.         else
  57.                 dat=0;               
  58.    
  59.         return dat;       
  60. }
  61. //从DHT22读取一个字节
  62. //返回值:读到的数据
  63. u8 DHT22_Read_Byte(void)   
  64. {        
  65.     u8 i,dat;
  66.     dat=0;
  67.         for (i=0;i<8;i++)
  68.         {
  69.                    dat<<=1;
  70.             dat|=DHT22_Read_Bit();
  71.     }                                                    
  72.     return dat;
  73. }
  74. //从DHT22读取一次数据
  75. //temp:温度值(范围:-40°C ~ 80°C 分辨率:0.1°C 精度:±0.5℃)
  76. //humi:湿度值(范围:0%RH ~ 99.9%RH 分辨率:0.1%RH 精度:±2%RH (25°C))
  77. //返回值:0,正常;1,读取失败
  78. u8 DHT22_Read_Data(float *temperature,float *humidity)   
  79. {        
  80.         u8 buf[5];
  81.         u8 i;
  82.         u8 sum;
  83.         *humidity=0;
  84.         *temperature=0;
  85.         DHT22_Rst();
  86.         if(DHT22_Check()==0)
  87.         {
  88.                 for(i=0;i<5;i++)
  89.                 {
  90.                         buf[i]=DHT22_Read_Byte();
  91.                 }
  92.                 sum = buf[0]+buf[1]+buf[2]+buf[3];
  93.                 if(sum == buf[4])
  94.                 {
  95.                         *humidity=(float)((buf[0]<<8)+buf[1])/10.0;
  96.                         *temperature=(float)((buf[2]<<8)+buf[3])/10.0;
  97.                 }
  98.                 else
  99.                 {
  100.                         *humidity=(float)((buf[0]<<8)+buf[1])/10.0;
  101.                         *temperature=(float)((buf[2]<<8)+buf[3])/10.0;
  102.                 }
  103.         }
  104.         else
  105.         {
  106.                 return 1;
  107.         }
  108.         return 0;         
  109. }
  110. //初始化DHT22同时检测DHT22的存在
  111. //返回1:不存在
  112. //返回0:存在             
  113. u8 DHT22_Init(void)
  114. {
  115.     DHT22_SetDigitalOutput();
  116.     DHT22_SetHigh();
  117.         DHT22_Rst();
  118.         return DHT22_Check();
  119. }

主函数调用驱动并打印结果:

接线:使用的是RC2

串口打印结果:


测试工程源码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
usysm 发表于 2021-6-4 13:35 | 显示全部楼层

为什么温湿度传感器dht21比dht11贵那么多
i1mcu 发表于 2021-6-4 13:36 | 显示全部楼层
DHT22 如何读取数据
i1mcu 发表于 2021-6-4 13:36 | 显示全部楼层
PIC18F47Q10 Curiosity Nano评估工具包具有完整的编程和调试功能  
pmp 发表于 2021-6-4 13:37 | 显示全部楼层
DHT22和DHT11的驱动能相互移植吗
mmbs 发表于 2021-6-4 13:38 | 显示全部楼层
CuriosityNano测评  
1988020566 发表于 2021-6-4 13:38 | 显示全部楼层
通过内置电容式湿度传感器和热敏电阻来测量周围的空气  
lzbf 发表于 2021-6-4 13:39 | 显示全部楼层
DHT22的技术应用   
youtome 发表于 2021-6-4 13:39 | 显示全部楼层
大多都是使用DHT11   
jimmhu 发表于 2021-6-4 13:39 | 显示全部楼层
温湿度模块DHT11和DHT22都不错  
xiaoyaozt 发表于 2021-6-4 13:40 | 显示全部楼层
谢谢楼主的资料。     
1988020566 发表于 2021-6-4 13:40 | 显示全部楼层
AM2302吧   
mmbs 发表于 2021-6-4 13:40 | 显示全部楼层
使用Curiosity Nano板     
pmp 发表于 2021-6-4 13:40 | 显示全部楼层
SHT11目前不支持这个功能  
i1mcu 发表于 2021-6-4 13:40 | 显示全部楼层
PIC16F15244Curiosity Nano评估工具包
usysm 发表于 2021-6-4 13:40 | 显示全部楼层
DHT22 SHT11 这两种温湿度传感器哪一种好
jimmhu 发表于 2021-6-4 13:41 | 显示全部楼层
SHT10与DHT22的精度比较   
youtome 发表于 2021-6-4 13:41 | 显示全部楼层
DHT22效果不错   
lzbf 发表于 2021-6-4 13:41 | 显示全部楼层
DHT22的设计资料  
i1mcu 发表于 2021-6-4 13:41 | 显示全部楼层
DHT22单总线不支持寻址?   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

384

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部