[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】05.驱动DHT11温湿度传感器的试验

[复制链接]
2737|24
 楼主| hu9jj 发表于 2021-4-5 19:56 | 显示全部楼层 |阅读模式
#申请原创#
    本次测试计划是尝试做一个多功能时钟,显示当前的温湿度是其中的一项辅助功能,传感器就选用最常见的DHT11,尽管这款传感器的测量范围和精度都有限,但对于家庭使用来说还是绰绰有余的。下图是传感器的介绍资料:


    这是一些基本的指标:


    这是传感器的性能指标:


    这款传感器是单总线数据传输方式,收到主机发出的启动信号后,返回4字节的温温度数据和1字节的校验码:


    下面是数据信号的时序要求:


    通过高电平持续时间的长短来确定数字0或数字1:


    这是封装信息:


    传感器的驱动代码借鉴了dql2015大侠的帖子(https://bbs.21ic.com/icview-3119748-1-1.html),下面是测试过程的照片,测试时与我的另一块温湿度传感器评估板进行了比较,差别不大,作为家庭使用精度是绰绰有余的。


    下面是我用逻辑分析仪抓取的数据时序图,当主机发出大于20ms的低电平信号后再拉高约20us,传感器便发回测量数据:


    这是测量数据的分析:


    下面的动画是我用电吹风进行测试,当用电吹风加热传感器时,测得的湿度数值会降低,而温度数值则会增大:


    这是DHT11的驱动代码,我是直接通过全局变量数组来传递数据的:


   
  1. #include "dht.h"
  2. #include "lcd_19264.h"

  3. extern uint8_t DHT[5];


  4. /*********************************************
  5. * 函数名称:DHT11_Rst()
  6. * 函数功能:温湿度传感器复位
  7. * 入口参数:无
  8. * 出口参数:无
  9. * 备注:工作电压 :3.3V ~ 5.5 V
  10. *********************************************/
  11. void DHT11_Rst(void)          
  12. {  
  13.     DHT11_SetDigitalOutput();
  14.     DHT11_SetLow();            //拉低DQ
  15.     delay_ms(25);            //拉低至少18ms
  16.     DHT11_SetHigh();        //DQ=1
  17.     delay_us(30);             //主机拉高20~40us
  18.    
  19. }

  20. /*********************************************
  21. * 函数名称:DHT11_Check()
  22. * 函数功能:等待传感器回应
  23. * 入口参数:无
  24. * 出口参数:返回1: 未检测到DHT11的存在
  25. *           返回0: 存在
  26. *********************************************/
  27. uint8_t DHT11_Check(void)           
  28. {   
  29.         uint8_t retry=100;
  30.     DHT11_SetDigitalInput();
  31.     DHT11_SetPullUp();
  32.            while ((DHT11_GetValue())&&retry) //DHT11会拉低40~80us
  33.         {
  34.                 retry--;
  35.                 delay_us(1);
  36.         };         
  37.         if(retry<1) return 1;
  38.         else retry=100;
  39.     while (!DHT11_GetValue()&&retry)  //DHT11拉低后会再次拉高40~80us
  40.         {
  41.                 retry--;
  42.                 delay_us(1);
  43.         };
  44.         if(retry<1)
  45.                 return 1;            
  46.         return 0;
  47. }

  48. /*********************************************
  49. * 函数名称:DHT11_Read_Val()
  50. * 函数功能:读取温湿度传感器数据
  51. * 入口参数:无
  52. * 出口参数:无
  53. * 备注:数据存放在全局变量DHT中,DHT[0]=湿度整数部分,DHT[1]=湿度小数部分,DHT[2]=温度整数部分,DHT[3]=温度小数部分,
  54. *      湿度值(范围:20% RH ~ 90% RH 分辨率:0.1%RH 精度:±5% RH (25℃))
  55. *      温度值(范围:0℃ ~ 50℃ 分辨率:0.1℃ 精度:±2)
  56. *********************************************/
  57. void DHT11_Read_Val(void)
  58. {
  59.     uint8_t dat,retry,i,j;
  60.     DHT11_Rst();
  61.     if(DHT11_Check()==0){
  62.         for(i=0; i<5; i++)
  63.         {
  64.             DHT[i]=DHT11_Read_Byte();    //调用读取字节的函数
  65.         }
  66.         if(DHT[4]==DHT[0]+DHT[1]+DHT[2]+DHT[3])
  67.             DHT[4] = 0;
  68.         else
  69.             DHT[4] = 1;
  70.     }
  71. }

  72. /*********************************************
  73. * 函数名称:DHT11_Read_Byte()
  74. * 函数功能:读取单总线一个字节数据
  75. * 入口参数:无
  76. * 出口参数:读取的字节
  77. *********************************************/
  78. uint8_t DHT11_Read_Byte(void)   
  79. {        
  80.     uint8_t i,dat,retry;
  81.     dat=0;
  82.         for (i=0;i<8;i++)
  83.         {
  84.                    retry = 100;
  85.         while((DHT11_GetValue())&&retry)//等待变为高电平
  86.         {
  87.             retry--;
  88.             delay_us(1);
  89.         }
  90.         retry=100;  
  91.         while(!DHT11_GetValue()&&retry)//等待变低电平
  92.         {
  93.             retry--;
  94.             delay_us(1);
  95.             }
  96.         delay_us(40);//wait 40us
  97.         dat<<=1;
  98.         if(DHT11_GetValue())
  99.             dat|=0x01;
  100.     }                                                    
  101.     return dat;
  102. }

  103. /*********************************************
  104. * 函数名称:DHT11_Init()
  105. * 函数功能:温湿度传感器初始化
  106. * 入口参数:无
  107. * 出口参数:0 = 初始化成功
  108. *           1 = 初始化失败
  109. *********************************************/
  110. uint8_t DHT11_Init(void)
  111. {
  112.     DHT11_SetDigitalOutput();
  113.     DHT11_SetHigh();
  114.         DHT11_Rst();
  115.         return DHT11_Check();
  116. }


    在测试时发现一个问题:我将读取一个字节的函数代码合并在读取数值函数中,读取的数值便会出错,非得独立出一个函数,然后再去调用,才能读取正确的数据,反复测试多次均是如此,具体原因尚不清楚。

本帖子中包含更多资源

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

×
名字是啥样 发表于 2021-4-6 11:35 | 显示全部楼层
感谢楼主的分享,期待楼主有更好的作品出来,这样才会有更好的效果出来。
 楼主| hu9jj 发表于 2021-4-6 15:50 | 显示全部楼层
名字是啥样 发表于 2021-4-6 11:35
感谢楼主的分享,期待楼主有更好的作品出来,这样才会有更好的效果出来。
...

谢谢支持和鼓励!
usysm 发表于 2021-4-6 20:22 | 显示全部楼层
DHT11温湿度传感器应用比较多呢  
typeof 发表于 2021-4-6 20:22 | 显示全部楼层
板子非常的给力。   
kkzz 发表于 2021-4-6 20:23 | 显示全部楼层
液晶是定制的吗   
htmlme 发表于 2021-4-6 20:23 | 显示全部楼层
         
pklong 发表于 2021-4-6 20:24 | 显示全部楼层
现在很多的单片机都做DHT11的项目。  
touser 发表于 2021-4-6 20:24 | 显示全部楼层
最常见的DHT11  
uytyu 发表于 2021-4-6 20:24 | 显示全部楼层
楼主的资料写的的非常详细呢。
iyoum 发表于 2021-4-6 20:25 | 显示全部楼层
           
jkl21 发表于 2021-4-6 20:25 | 显示全部楼层
逻  辑 分 析 仪器是什么牌子的  
wwppd 发表于 2021-4-6 20:26 | 显示全部楼层
最近也在搞这个DHT11.     
pklong 发表于 2021-4-6 20:26 | 显示全部楼层
后续可以做智能家居了。   
htmlme 发表于 2021-4-6 20:26 | 显示全部楼层
谢谢楼主分享的资料了。   
touser 发表于 2021-4-6 20:26 | 显示全部楼层
DHT11的精度怎么样  
kkzz 发表于 2021-4-6 20:26 | 显示全部楼层
液晶变化还不一样吗  
uytyu 发表于 2021-4-6 20:26 | 显示全部楼层
时序都分析的很到位了。   
typeof 发表于 2021-4-6 20:26 | 显示全部楼层
运行的效果怎么样   
iyoum 发表于 2021-4-6 20:26 | 显示全部楼层
想楼主学习一下。         
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

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