[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】+使用IO驱动单总线温湿度传感器DHT22

[复制链接]
3802|27
 楼主| dql2015 发表于 2021-3-27 10:56 | 显示全部楼层 |阅读模式
本帖最后由 dql2015 于 2021-3-27 11:04 编辑

#申请原创#
DHT22(AM2302)是已校准的数字温湿度传感器,用于检测环境温湿度,标准单总线接口,拥有比DHT11更高的精度和更大的量程。DHT22湿敏电容数字温湿度模块是一款含有己校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。主要技术指标如下:温度分辨率:0.1°C
精度:±0.5℃
检测范围:-40°C ~ 80°C
湿度
分辨率:0.1%RH
精度:±2%RH (25°C)
检测范围:0%RH ~ 99.9%RH
工作电压 :3.3V ~ 5.5 V
通信时序:


这里采用MCC快速配置一个IO PB4来驱动DHT22。


驱动头文件dht.h
  1. #ifndef DHT_H
  2. #define        DHT_H

  3. #ifdef        __cplusplus
  4. extern "C" {
  5. #endif

  6. #include "mcc_generated_files/mcc.h"

  7. #define delay_ms(d)                DELAY_milliseconds(d)
  8. #define delay_us(d) DELAY_microseconds(d)

  9. #define  u8 uint8_t
  10. #define  u16 uint16_t

  11. u8 DHT22_Init(void);                        
  12. u8 DHT22_Read_Data(u16 *temperature,u16 *humidity);   
  13. u8 DHT22_Read_Byte(void);               
  14. u8 DHT22_Read_Bit(void);               
  15. u8 DHT22_Check(void);                        
  16. void DHT22_Rst(void);                        

  17. #ifdef        __cplusplus
  18. }
  19. #endif

  20. #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(u16 *temperature,u16 *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=(u16)((buf[0]<<8)+buf[1]);
  96.                         *temperature=(u16)((buf[2]<<8)+buf[3]);
  97.                 }
  98.                 else
  99.                 {
  100.                         *humidity=(u16)((buf[0]<<8)+buf[1]);
  101.                         *temperature=(u16)((buf[2]<<8)+buf[3]);
  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. }


主机从DHT22读取的温湿度数据总是前一次的测量值,如两次测量间隔时间很长,连续读两次以第二次
获得的值为实时温湿度值,建议同时两次读取间隔时间最小为 2S。

主函数进行初始化,定时读取DHT温湿度并打印,由于CuriosityNano的printf函数不支持打印小数,因此这里的温湿度值是实际值*10。
  1. #include "mcc_generated_files/mcc.h"
  2. #include "dht.h"
  3. void KeyInterruptHandler(void)
  4. {
  5.     LED_Toggle();
  6. }
  7. int main(void)
  8. {
  9.     SYSTEM_Initialize();
  10.     PB0_SetDigitalOutput();
  11.     //PB1_SetDigitalInput();
  12.     LED_SetDigitalOutput();
  13.     LED_SetHigh();
  14.     KEY_SetPullUp();
  15.     PORTB_KEY_SetInterruptHandler(KeyInterruptHandler);
  16.     printf("AVR128DB48 Curiosity Nano DHT22 Test,by dql2015[url=home.php?mod=space&uid=31587]@21IC[/url] 2021-03-27\r\n");
  17.      DELAY_milliseconds(3000);
  18.      while(DHT22_Init())
  19.      {
  20.          printf("no dht22\r\n");
  21.          DELAY_milliseconds(500);
  22.      }
  23.     u16 t,h;
  24.     while (1)
  25.     {        
  26.     DHT22_Read_Data(&t,&h);
  27.     printf("Temp:%d Hum:%d\r\n", t, h);
  28.     DELAY_milliseconds(1000);
  29.     }
  30. }
实物接线图:

实验结果:

测试工程源码:




本帖子中包含更多资源

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

×
 楼主| dql2015 发表于 2021-3-27 10:57 | 显示全部楼层
DHT22数据手册


本帖子中包含更多资源

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

×
hu9jj 发表于 2021-3-27 14:00 | 显示全部楼层
恰巧我也准备尝试驱动DHT11温湿度传感器,就不知道与DHT22差别在哪,也许可以借鉴您的代码。
 楼主| dql2015 发表于 2021-3-27 17:54 | 显示全部楼层
hu9jj 发表于 2021-3-27 14:00
恰巧我也准备尝试驱动DHT11温湿度传感器,就不知道与DHT22差别在哪,也许可以借鉴您的代码。 ...

代码一样,直接用,就是精度和测量范围不同
hudi008 发表于 2021-4-1 21:38 | 显示全部楼层
用dht11好还是dht21好   
lzmm 发表于 2021-4-1 21:38 | 显示全部楼层
DHT22 SHT11 这两种温湿度传感器哪一种好  
minzisc 发表于 2021-4-1 21:38 | 显示全部楼层
DHT22和DHT11的驱动能相互移植吗
selongli 发表于 2021-4-1 21:39 | 显示全部楼层
        
fentianyou 发表于 2021-4-1 21:39 | 显示全部楼层
DHT22在分辨率和精度上都有很大的提升。  
xiaoyaodz 发表于 2021-4-1 21:39 | 显示全部楼层
它应用专用的数字模块采集技术和温湿度传感技术
febgxu 发表于 2021-4-1 21:40 | 显示全部楼层
              
sdlls 发表于 2021-4-1 21:40 | 显示全部楼层
DHT22是比DHT11精度高的温湿度传感器
pixhw 发表于 2021-4-1 21:41 | 显示全部楼层
温湿度复合传感器。  
kkzz 发表于 2021-4-1 21:41 | 显示全部楼层
湿度方面,SHT1x和DHT22就相差很大了
selongli 发表于 2021-4-1 21:41 | 显示全部楼层
谢谢楼主分享的。   
minzisc 发表于 2021-4-1 21:41 | 显示全部楼层
DHT22单总线不支持寻址?  
lzmm 发表于 2021-4-1 21:41 | 显示全部楼层
         
fentianyou 发表于 2021-4-1 21:42 | 显示全部楼层
dht22相关文档代码介绍  
hudi008 发表于 2021-4-1 21:42 | 显示全部楼层
单总线仅能挂接单个DHT22传感器?
xiaoyaodz 发表于 2021-4-1 21:42 | 显示全部楼层
据说好点点的DHT22。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

384

帖子

8

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