【模块系列】DHT11时序理论

news/2024/10/23 8:38:24/

前言

  基于stm32f103C6T6核心板+STM32CubeMX的DHT11的使用。其实吧,要不是网上关于stm32调用DHT11的代码大多数用不了或者乱七八糟的,我也不想推时序的,嘎嘎麻烦。写着写着就发现,本章的篇幅有点长了,所以本文就先介绍DHT11的时序流程,和我写的关键库,和经验。在详细的程序应用介绍和工程文件的话在写另一篇。

常见问题

  1. STM32像DHT11发出控制指令,DHT11无响应(低电平响应),并且在示波器或逻辑分析仪中看到,没有后续时序。

    答:这种情况大概率是STM32引脚的输入,输出模式没有切换。引脚还强制在输出模式下,锁定在某个电平。

  2. STM32像DHT11发出控制指令,检测不到DHT11的响应(低电平响应),并且在示波器或逻辑分析仪中看到,可以看到有后续时序。

    答:可能是控制指令的时序错了,拉低的时间是ms级,等待反应的时间是us级。注意检测的时间。并且在STM32中,一般函数只提供ms级的函数延迟,us级的话,要自己通过主频+NOP()的调用,反推出来。

  3. STM32读取DHT11的数据时,只能读取到一次,即使是放在主循环中也没用,也已经确保不是DHT中的判断时序的循环卡住。

    答:这个应该还是比较少见的。但是我遇见了,就顺带讲了。我出现这个问题是STM32的引脚切换函数中的引脚的配置结构,有一个引脚速率空缺了,以为没事,但是确出问题了。所以说啊,大家一定要养成好习惯,配置结构一定要配置完啊。

DHT11

  • 基本参数

    简介:DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有可靠性与卓越的长期稳定性,成本低、相对湿度和温度测量、快响应、抗干扰能力强、信号传输距离长、数字信号输出、精确校准。传感器包括一个电容式感湿元件和一个NTC 测温元件。

    下面是网上常见的DHT11形状和引脚介绍,一般商家制作成模块时只会引出三个引脚,NC脚不引出,并且在模块上已经会有DATA引脚的上拉电阻和电源指示灯了,不过没有防反接保护,所以说接线时一定要注意。

    在这里插入图片描述

    型号工作电压温度检测范围湿度检测范围
    DHT113.3-5.5V0°C~50°C20%RH-90%RH(2℃)
    • 温度分辨率:1℃    温度精度:±2℃
    • 湿度分辨率:1%RH  湿度精度: ±5%RH(0-50)℃
  • 时序介绍

    主要的三大块时序:DHT11触发采集时序,DHT11高电平时序,DHT11低电平时序

    • 文字流程:

      读取DHT11数据的文字流程,使用STM32作为主机:

      1. 主机将DHT11数据引脚拉为低电平,持续至少18ms。
      2. 主机将DHT11数据引脚拉为高电平,持续20~40us,等待DHT11响应。
      3. 如果DHT11存在,则会有80us的响应信号,此时数据引脚会被拉为低电平,否则数据引脚始终为高电平。
      4. 接下来控制权转移给DHT11,DHT11会继续把数据引脚拉高80us,然后开始返回数据。
      5. 首先,DHT11会拉低数据引脚50us,表示开始传输数据位。
      6. 接下来便是DHT11发送数据位,数据位的高低电平取决于数据位拉高的时间:如果数据位高电平的时间为26us~28us,则代表数据位是低电平 ‘0’;如果数据位高电平的时间为70us,则代表数据位是高电平 ‘1’。
    • 数据结构:

        40位数据=8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位

在这里插入图片描述

  1. DHT11触发采集时序

      主机将DHT11数据引脚拉为低电平,持续至少18ms。主机将DHT11数据引脚拉为高电平,持续20~40us,等待DHT11响应。接下来控制权转移给DHT11,如果DHT11存在,则会有80us的响应信号,此时数据引脚会被DHT11拉为低电平,否则数据引脚始终为高电平。DHT11会继续把数据引脚拉高80us,然后开始返回数据。

    在这里插入图片描述

  2. DHT11高电平时序

      DHT11将数据引脚拉低50us,表示要发送数据位。DHT11将数据引脚拉高,持续70us,表示数据位是1。

    在这里插入图片描述

  3. DHT11低电平时序

      DHT11将数据引脚拉低50us,表示要发送数据位。DHT11将数据引脚拉高,持续26~28us,表示数据位是0。

    在这里插入图片描述

  4. DHT11总时序

      当DHT11开始发送数据时,主机就要切换到输入模式,并对信号判断是’0’还是’1’。

    在这里插入图片描述

在强调一下,经过对上述文件描述和图片的分析可以发现,DHT11传输数据时,并不是通过数据引脚的高低电平差来表示数据信息。而是,通过数据位高电平的时长来表示数据的信息。

我的代码

  下面我用逻辑分析仪,OLED,计算器调试的时候,可以看到DHT11有响应数据,而且经过计算也符合校验的。OLED上的,第一行是第一个八位数据和第二个八位数据(也就是湿度数据),第二行是第三个八位数据和第四个八位数据(也就是温度数据),第三行是校验和。第四行的不用管。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  代码部分我也经量用了宏定义来调用,可能方便移植到其它单片机使用。花了傍晚和早上写的可能还有点粗糙哈。也欢迎大家提建议和说看法。
  实践环境:代码是基于STM32CubeMX生成的,主频是72MHz,DHT11的DATA引脚接到PA1。

  • DHT.C

    #include "main.h"
    #include "DHT11.h"
    //控制接口
    #define DHT11_DataPinx 	GPIO_PIN_1
    #define DHT11_DataGPIOx GPIOA
    #define DHT11_DataH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET)
    #define DHT11_DataL() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET)
    #define DHT11_DataR() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)#define DHT11_5NOP(); __NOP;__NOP;__NOP;__NOP;__NOP;//数据存放数组
    unsigned char DHT11_DATA[5];//DHT11毫秒延时
    //参数1: Xms延时
    void DHT11_DelayMs(int ms)
    {HAL_Delay(ms);
    }
    //DHT11的10微秒延时
    void DHT11_Delay10Us()
    {for(char i=100;i>0;i--){DHT11_5NOP();}
    }//DHT11数据引脚设置为输入模式
    void DHT11_DataSetIn()
    {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11_DataPinx;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DHT11_DataGPIOx, &GPIO_InitStruct);
    }
    //DHT11数据引脚设置为输出模式
    void DHT11_DataSetOut()
    {GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DHT11_DataGPIOx, &GPIO_InitStruct);
    }//判断数据位
    //返回值:
    char DHT11_IfBit()
    {char Start;char StartNum=0;do{DHT11_Delay10Us();Start=HAL_GPIO_ReadPin(DHT11_DataGPIOx,DHT11_DataPinx);StartNum++;}while(Start);//电平判断if(StartNum<5){Start=0;}else{Start=1;}return Start;
    }//等待收集数据
    void DHT11_ReadData()
    {char Start;DHT11_Init();DHT11_DataSetIn();//拉高判断do{Start=HAL_GPIO_ReadPin(DHT11_DataGPIOx,DHT11_DataPinx);}while(!Start);//拉低判断do{Start=HAL_GPIO_ReadPin(DHT11_DataGPIOx,DHT11_DataPinx);}while(Start);//拉高判断do{Start=HAL_GPIO_ReadPin(DHT11_DataGPIOx,DHT11_DataPinx);}while(!Start);//第一个数据开始传输//数组索引0~4for(char i=0;i<5;i++){for(char a=0;a<8;a++){Start=DHT11_IfBit();DHT11_DATA[i]=DHT11_DATA[i]|Start;//拉高判断do{Start=HAL_GPIO_ReadPin(DHT11_DataGPIOx,DHT11_DataPinx);}while(!Start);if(a>=7) break;DHT11_DATA[i]=DHT11_DATA[i]<<1;}}//设置为输出模式DHT11_DataSetOut();
    }//DHT11初始化
    //返回值: 0.有响应  1.无响应
    char DHT11_Init(void)
    {char Start=1;//主机拉低至少20msDHT11_DataL();DHT11_DelayMs(20);//主机拉高至少20us-40usDHT11_DataH();DHT11_Delay10Us();DHT11_Delay10Us();DHT11_Delay10Us();//设置为输入模式DHT11_DataSetIn();Start=HAL_GPIO_ReadPin(DHT11_DataGPIOx,DHT11_DataPinx);//设置为输出模式DHT11_DataSetOut();return Start;
    }//DHT11获取数据
    //参数: 0:返回湿度  1:返回温度
    float DHT11_GetData(char Mode)
    {float ReData;switch(Mode){case 0:ReData=DHT11_DATA[0]+DHT11_DATA[1]/255.0f;break;case 1:ReData=DHT11_DATA[2]+DHT11_DATA[3]/255.0f;break;}return ReData;
    }
    
  • DHT11.H

    #ifndef __DHT11_H__
    #define __DHT11_H__char DHT11_Init(void);
    void DHT11_ReadData(void);
    float DHT11_GetData(char Mode);#endif
    

工程

工程的文章:【STM32CubeMX项目】STM32&&DHT11&&工程文件


http://www.ppmy.cn/news/245891.html

相关文章

所有的android平板,[图]联想推出四款Android平板

访问购买页面: Tab 4 8是四款Android平板中最入门的平板&#xff0c;该机装备了1280*800像素的8.0英寸屏幕&#xff0c;2GB的内存&#xff0c;16GB/32GB的内置存储&#xff0c;高通骁425处理器。该平板具备杜比Atmos扬声器&#xff0c;将于今年5月份发货&#xff0c;共有黑色和…

平板系统win10 Android,Pad变PC:将Win10装入Android平板

对于商务人群来说&#xff0c;轻巧便携、续航长以及超强性能&#xff0c;可以在移动办公中事半功倍。但是&#xff0c;笔记本无论如何发展&#xff0c;始终达不到用户追求的“极致”便携。因此&#xff0c;IT厂商们推出了大屏平板供用户使用&#xff0c;而随着平板电脑的发展&a…

Android平板的磁盘分区,Pad变PC:教你将Win10装入Android平板

原标题:Pad变PC:教你将Win10装入Android平板 对于商务人群来说,轻巧便携、续航长以及超强性能,可以在移动办公中事半功倍。但是,笔记本无论如何发展,始终达不到用户追求的“极致”便携。因此,IT厂商们推出了大屏平板供用户使用,而随着平板电脑的发展,无论是性能还是屏…

平板改文件服务器,平板改监控服务器

平板改监控服务器 内容精选 换一换 本节定义了云耀云服务器上报云监控的监控指标的命名空间&#xff0c;监控指标列表&#xff0c;各项监控指标的具体含义与使用说明&#xff0c;用户可以通过云监控检索云耀云服务器服务产生的监控指标和告警信息。SYS.ECS对于不同的操作系统、…

android+64g+tf,2G运存+64G内存 Win8平板这点干货够用?

1Win8平板为何物 这点配置够用否 随着iPad Air2和iPad mini3的推出&#xff0c;新一波平板电脑降价潮显现&#xff0c;近期以22nm Atom处理器为主的Win8平板最为火热&#xff0c;“10英寸左右高分屏2GB RAM32GB eMMC”的国产Win8平板基本在千元左右&#xff0c;不少用户反应32G…

066:cesium flyto一个具体的点位置

第066个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置飞行定位功能,如果你知道位置的经纬度和高度,你可以使用相机的 flyTo 函数直接飞到 CesiumJS 中的那个位置。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式…

使用Python和Pyecharts制作中国疫情地图可视化教程

引言 前些年新冠病毒疫情肆虐全球,如何更直观地展示全国疫情数据,是每一个数据科学家需要思考的问题。本文将介绍如何使用Python的第三方库Pyecharts制作一张中国疫情地图,并对代码进行详细解释,适合初学者学习。 什么是Pyecharts? Pyecharts是一个基于Echarts的Python可…

电脑vcomp140.dll丢失怎么修复

vcomp140.dll是Microsoft的Visual C Redistributable for Visual Studio 2015的一部分。它是一个动态链接库文件&#xff0c;主要用于在Windows操作系统上运行使用Visual Studio 2015编写和编译的软件。与其他许多Windows动态链接库文件类似&#xff0c;vcomp140.dll包含函数和…