【模块系列】DHT11时序理论

news2024/11/25 6:55:23

前言

  基于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~4
    	for(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;
    	//主机拉低至少20ms
    	DHT11_DataL();
    	DHT11_DelayMs(20);
    	//主机拉高至少20us-40us
    	DHT11_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.coloradmin.cn/o/616587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fiddler抓包返回的Response中总是出现“Response body is encoded. Click to decode. “的解决办法

在进行网页开发和接口调试时&#xff0c;我们经常会用到Fiddler这个工具。 但是&#xff0c;有时候我们会遇到一个非常头疼的问题&#xff0c;就是在抓取网页返回的Response时总是出现“Response body is encoded. Click to decode.”的提示。 这种情况下我们可能无法正常查看…

【Web服务应用】Nginx七层反向代理与四层反向代理

Nginx七层反向代理与四层反向代理 一、代理1.1什么是代理1.2正向代理1.3反向代理1.4反向代理的适用场景1.5正向代理与反向代理的区别 二、反向代理2.1负载均衡2.2动静分离 三、Nginx实战3.1七层反向代理&#xff0c;负载均衡&#xff0c;动静分离3.2四层反向代理 一、代理 1.1…

测试复习(自用)

测试复习 通识/基础/概念 什么是软件测试 验证软件特性是否满足用户的需求 专业名词 需求 满足用户期望或正式文档&#xff08;合同、标准、规范&#xff09;所具备的条件和权能&#xff0c;包含用户需求和软件需求 用户需求软件需求 是测试人员开展软件测试工作的依据 如…

【Mysql】基础入门篇

文章目录 什么是数据库见见数据库服务器、数据库、表之间的关系数据逻辑存储MySQL架构SQL分类存储引擎 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还需要数据库&#xff0c;文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题 文件不利于数据查询和管理 文…

五年后,你是什么档次

每晚一到两篇的阅读 1.认清现实&#xff0c;她就是喜欢钱 2.不要再找理由&#xff0c;自卑才是你最大的动力 3.提高自己的任性指数 4.尽量把钱花在有营养的地方 5.不要成为一条被溺死的鱼 6.总有一天&#xff0c;卫生纸比钞票值钱 7.穷忙的人&#xff0c;不要开Toyota 8.目标就…

easypoi模板导出文件,支持Liunx系统(自用)

springboot使用easypoi通过使用模板导出文件 第一步:导入poi以及easypoi的maven坐标 首先&#xff0c;easypoi是依赖于Apache的poi实现的&#xff0c;因此需要先引入poi <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifac…

智慧加油站解决方案,提高加油区和卸油区的安全性和效率

英码科技智慧加油站解决方案是一个综合应用了AI智能算法的视觉分析方案&#xff0c;旨在提高加油区和卸油区的安全性和效率。 加油区算法&#xff1a; 吸烟检测&#xff1a;通过AI算法分析视频流&#xff0c;检测是否有人在加油区域吸烟&#xff0c;以防止火灾风险。 打电话…

Web Scoket简述

Web Socket 简介 初次接触 Web Socket 的人&#xff0c;我们已经有了 HTTP 协议&#xff0c;为什么还需要另一个协议&#xff1f;它能带来什么好处&#xff1f; 因为 HTTP 协议有一个缺陷&#xff1a;通信只能由客户端发起。http基于请求响应实现。 &#xff08;准确来说HTTP…

使用Cloudflare Zaraz 可让同意管理变得简单明了

视您的居住地而定&#xff0c;在首次造访网站时&#xff0c;可能会要求您同意使用Cookie。如果您曾经点选过「核准」以外的其他选项&#xff0c;您就会注意到&#xff0c;关于应该或不应该允许哪些服务使用Cookie 的选项清单可能非常长。这是因为网站通常会整合许多第三方工具进…

陕西省赛2023-部分Reverse复现

目录 我的upx -d怎么坏了 动调脱upx壳&#xff1a; babypython BadCoffee ob混淆&#xff1a; 我的upx -d怎么坏了 打开附件&#xff0c;发现是upx壳&#xff0c;应该是修改了区段名或者特征码 但是修改过还是不对.....(哭.jpg)应该还是改了其他 好学长告诉我直接动态调试…

【Matter】Nordic Mattter(开发大纲)

nRF Connect SDK 支持Mattter Nordic提供的Matter用户指南 子页面&#xff1a; Matter概况开始使用Matter如何创建 Matter 最终产品 Matter网络拓扑结构 Thread&#xff1a;Thread是一种开放的低功耗无线通信协议&#xff0c;旨在为物联网设备提供安全、稳定、高效的IPv6连接。…

混合动力汽车耐久测试

一 背景 整车厂可通过发动机和电机驱动的结合为多款车型提供混合动力驱动技术。汽车集成电机驱动可大大减少二氧化碳的排放&#xff0c;不仅如此&#xff0c;全电动驱动或混合动力驱动的汽车还将使用户体验到更好的驾驶感受&#xff0c;且这种汽车可通过电动机来实现更快的加速…

机器学习 | 降维问题

目录 一、主成分分析 二、奇异值分解 2.1 奇异值分解原理 2.2 奇异值分解实践 三、特征值与特征向量 一、主成分分析 主成分有如下特征&#xff1a; 每个主成分是原变量的线性组合&#xff1b;各个主成分之间互不相关&#xff1b;主成分按照方差贡献率从大到小依次排列&…

【诗视野文学社】五一特刊|本期诗人:胭脂茉莉 李本 薛宏 文爱艺 唐根金 王宁 迪夫 东楠灵

【诗视野文学社】五一特刊 本期诗人&#xff1a;胭脂茉莉 李本 薛宏 文爱艺 唐根金 王宁 迪夫 东楠灵 脂茉莉简介&#xff1a;刘彦芹&#xff0c;女&#xff0c;作家、诗人&#xff0c;江苏人&#xff0c;年少习诗&#xff0c;评论及随笔见诸媒体及报刊&#xff0c;诗歌被选入海…

中国人民大学与加拿大女王大学金融硕士引领你走出职场困境,勇往直前!

走到一定职位时&#xff0c;想更进一步基本无望&#xff0c;到了自己事业的瓶颈期。从底层一路冲到中层靠的是能力&#xff0c;靠的是忠诚&#xff0c;靠的是勤奋&#xff0c;而再向上走&#xff0c;该凭借什么&#xff0c;完全找不到方向。而那些极个别的人却在自己看不到的地…

基于PySpark的10亿级数据集LAION-5B元数据快速处理实践(全文分享)

推荐语 多模态大模型训练如火如荼展开&#xff0c;但以LAION-5B为代表的大规模多模态数据集获取却成了一个令人头疼的问题。 OpenDataLab两位工程师在浦数 AI Talk做了非常实用的LAION-5B下载经验分享&#xff0c;我们整理了其演讲内容、Parquet文件、图片下载工具&#xff0…

Hive执行计划之一文读懂Hive执行计划

目录 文章目录 概述1.hive执行计划的查看2.学会查看Hive执行计划的基本信息3.执行计划步骤操作过程4.explain extended 概述 Hive的执行计划描述了一个hiveSQL语句的具体执行步骤&#xff0c;通过执行计划解读可以了解hiveSQL语句被解析器转换为相应程序语言的执行逻辑。通过…

软件测试人员迷茫之中如何找到职业发展的方向?

出现迷茫或焦虑的原因是什么&#xff1f; 也许每个人的原因不一样&#xff0c;但不外乎是下面这些原因叠加的结果。 1、敏捷和DevOps开发模式的推行&#xff0c;虽然20年的历史是否已经证明“敏捷已经失败了” 暂且不管&#xff0c;但敏捷/DevOps之风刮的还是很厉害&#xff0c…

每日一练 | 华为认证真题练习Day53

1、现在有以下10.24.0.0/24&#xff0c;10.24.1.0/24&#xff0c;10.24.2.0/24&#xff0c;10.24.3.0/24四个网段&#xff0c;这四个网段可以汇总为以下哪个网段&#xff1f;&#xff08;多选&#xff09; A. 10.24.0.0/23 B. 10.24.1.0/23 C. 10.24.0.0/22 D. 10.24.0.0/2…

Window环境rabbitmq安装教程

首先我们需要取官网下载对应的两个安装包 第一个是rabbitmq安装包路径在括号里&#xff08;Installing on Windows Manually — RabbitMQ&#xff09; 我们选择window下载即可。 下图是下载的样子&#xff0c;确认是这两个就没问题了 第二个是erlang&#xff08;http://erlang…