STM32外设系列—DHT11

文章标题

  • 一、DHT11简介
  • 二、数据手册分析
    • 2.1 接口说明
    • 2.2 串行通信说明
      • 2.2.1 单总线通信
      • 2.2.2 单总线传输数据位定义
      • 2.2.3 时序图
  • 三、DHT11程序设计
    • 3.1 初始化GPIO
    • 3.2 发送起始信号
    • 3.3 接收一个字节数据
    • 3.4 接收温湿度信息并校准
  • 四、总结

一、DHT11简介

DHT11是一款常用的数字温湿度传感器。传感器包括一个电容式感湿元件和一个 NTC 测温元件,能够测量皱纹环境的温湿度,常用于暖通空调、除湿器、农业、冷链仓储等方面。
DHT11

二、数据手册分析

2.1 接口说明

DHT11接口说明

2.2 串行通信说明

DHT11通过串行通信的方式,将采集到的环境温湿度信息传递给单片机。数据手册中,针对DHT11的串行通信做了详细介绍。

2.2.1 单总线通信

DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口连至数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 4.7kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

2.2.2 单总线传输数据位定义

DHT11的DATA引脚,用于单片机与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出。数据格式

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

数据手册中写明,湿度的小数部分为0。8bit 校验位等于所得结果的末 8 位。
单总线格式定义
对于校验位,数据手册中举例说明。比如接收到的40位数据为

0011 01010000 00000001 10000000 01000101 0001
湿度高8位湿度低8位温度高8位温度低8位校验位

计算 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 + 0101 0001 = 0101 0001,与接收到的校验位相等,校验通过。如果校验不通过,则将此次接收到的数据丢弃,重新接收数据。

2.2.3 时序图

根据上面的介绍,如果单片机想要读取数据,需要先发送一个起始信号。起始信号需要拉低数据线至少18ms。
起始信号

DHT11检测到起始信号之后,等待起始信号低电平结束,然后输出应答信号。应答信号是先将数据线拉低83us,再拉高87us。

应答信号

然后DHT11就开始输出数据了,“0”和“1”的时序图如下

“0”和“1”的时序图

总时序图如下

总时序图

三、DHT11程序设计

3.1 初始化GPIO

根据上面的介绍,STM32的GPIO既需要用作输出,也需要用作输入。因此,STM32的GPIO需要有两种配置

/*
 *==============================================================================
 *函数名称:Drv_Dht11_Gpio_OutInSet
 *函数功能:DHT11引脚输出/输入设置
 *输入参数:state:OUT:输出(0);IN:输入(1)
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Drv_Dht11_Gpio_OutInSet (u8 state)
{
	// 结构体定义
 	GPIO_InitTypeDef  GPIO_InitStructure;
	
	// 开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 初始化GPIO结构体
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	if (state)
	{
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入
	}
	else
	{
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出
	}
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

.h文件添加下面程序

// GPIO模式
#define OUT   0   // 输出模式
#define IN    1   // 输入模式

3.2 发送起始信号

单片机的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms(最大不得超过 30ms),然后单片机的 I/O 设置为输入状态,由于上拉电阻,单片机器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作出回答信号。程序设计如下

/*
 *==============================================================================
 *函数名称:Drv_Dht11_Start
 *函数功能:向DHT11发送起始信号
 *输入参数:state:OUT:输出(0);IN:输入(1)
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Drv_Dht11_Start (void)
{
	OLED_SDA_Set();   // 拉高一小段时间
	delay_us(30);
	
	Drv_Dht11_Gpio_OutInSet(OUT);   // GPIO配置为输出模式
	OLED_SDA_Clr();   // 拉低数据线
	delay_ms(20);   // 保持20ms
	
	OLED_SDA_Set();   // 拉高一小段时间
	delay_us(30);
	
	Drv_Dht11_Gpio_OutInSet(IN);   // GPIO配置为输入模式
}

3.3 接收一个字节数据

/*
 *==============================================================================
 *函数名称:Med_Dht11_ReceOneByte
 *函数功能:接收一帧数据
 *输入参数:无
 *返回值:一字节接收数据
 *备  注:无
 *==============================================================================
 */
u8 Med_Dht11_ReceOneByte (void)
{
	u8 tempVar = 0;   // 临时循环变量
	u8 receData = 0;   // 接收数据
	
	for (tempVar = 0;tempVar < 8;tempVar ++)
	{
		while (!DHT11_SDA_DATA);   // 等待54us的低电平过去
		delay_us(30);   // 延时30us之后判断是0还是1
		
		// 如果30us之后依旧为高电平
		if (DHT11_SDA_DATA)
		{
			receData |= 1;   // 接收数据为1
		}
		while (DHT11_SDA_DATA);   // 等待高电平过去
		
		receData <<= 1;   // 左移
	}
	
	return receData;
}

3.4 接收温湿度信息并校准

/*
 *==============================================================================
 *函数名称:App_Dht11_Result_Process
 *函数功能:处理接收结果,得出正确的温湿度信息
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u8 receData[4];   // 存储温湿度结果
void App_Dht11_Result_Process (void)
{
	u8 receCheck = 0;   // 接收到的校验码
	u8 tempCal = 0;   // 临时计算变量
	
	Drv_Dht11_Start();   // 发送一个起始信号
	DHT11_SDA_Set();   // 拉高SDA
	
	// 等待应答信号
	if (!DHT11_SDA_DATA)
	{
		while (!DHT11_SDA_DATA);   // 等待83us低电平结束
		while (DHT11_SDA_DATA);   // 等待87us高电平结束
		
		// 开始接收数据
		receData[0] = Med_Dht11_ReceOneByte();   // 湿度整数
		receData[1] = Med_Dht11_ReceOneByte();   // 湿度小数
		receData[2] = Med_Dht11_ReceOneByte();   // 温度整数
		receData[3] = Med_Dht11_ReceOneByte();   // 温度小数
		receCheck = Med_Dht11_ReceOneByte();   // 校验码
		
		tempCal = receData[0] + receData[1] + receData[2] + receData[3];
		
		// 如果校验失败
		if (tempCal != receCheck)
		{
			// 清空接收
			receData[0] = receData[1] = receData[2] = receData[3] = 0;
		}
	}
}

四、总结

实际上面的程序设计有一些不足,比如某些地方不需要再拉高SDA线,在等到时使用了while语句但是没有超时检测。但是由于博主的DHT11坏了,目前买的新的还没到,无法继续调试,因此这里说明一下。后续会修改完善程序,补充应用实例。——2023年6月26日

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/33424.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速点特征直方图(FPFH)描述子提取

快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;介绍 快速点特征直方图&#xff08;Fast Point Feature Histograms&#xff0c;FPFH&#xff09;是一种基于点的描述子&#xff0c;用于描述点云数据中的局部几何信息。FPFH描述子是在…

浅尝kubernetes

浅尝kubernetes 前言&#xff1a;我们早学习一门技术之前并不需要从头到尾的详细的查看一遍&#xff0c;只需要看一看是什么&#xff1f;能干什么&#xff1f;怎么用&#xff1f;即可&#xff01; 一、了解kubernetes Kubernetes 也称为 K8s&#xff0c;是用于自动部署、扩缩和…

【C/C++实现进程间通信 二】消息队列

文章目录 前情回顾思路源码Publisher.cppSubscriber.cpp 效果 前情回顾 上一期已经讲解过了进程的相关概念以及进程间通信的实现原理&#xff0c;下面仅展示消息传递机制实现1进程间通信的相关代码。 思路 /*本项目主要用于以消息传递机制的方式进行进程间通信的测试。1.主要…

Odoo16 微信公众号模块开发示例

Odoo16 微信公众号模块开发示例 本模块基于 aiohttp asyncio 进行异步微信公众号接口开发, 仅实现了部分 API 仅供学习参考&#xff0c;更完善的同步接口请参考&#xff1a;wechatpy 或 werobot&#xff0c;可用来替代 模块中的 wechat client。 业务需求 小程序中需要用户…

pdf文档多页内插入统一图片

常用来添加公司logo、签名、印章等等 概括来说就是插入同一个图片&#xff0c;然后复制在每一页&#xff08;自动&#xff09; 用的是福昕pdf阅读器 首先打开pdf&#xff1a; 点击图像标注功能&#xff1a; 在弹出窗口中选择浏览&#xff0c;点击需要插入的图片&#xff08…

在个人电脑上部署ChatGLM2-6B中文对话大模型

简介 ChatGLM2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练&#xff0c;具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&…

计算机网络—网络层

文章目录 网络层服务虚电路网络数据报网络 IPv4IP数据报IP数据报分片 IP编址&#xff08;IPv4&#xff09;有类IP地址IP子网划分子网掩码 无类IP地址&#xff08;CIDR&#xff09;DHCPNATICMP协议 路由算法链路状态路由算法距离向量路由算法不同子网之间的路由算法学习RIP协议O…

【深度学习】3-3 神经网络的学习- 导数梯度

导数 导数就是表示某个瞬间的变化量&#xff0c;式子如下&#xff1a; 式子的左边&#xff0c;表示f(x)关于x的导数&#xff0c;即f(x)相对于x的变化程度。式子表示的导数的含义是&#xff0c;x的“微小变化”将导致函数f(x)的值在多大程度上发生变化。其中&#xff0c;表示…

了解一下EPC模式和它的优势

目录 什么是EPCEPC的优势有哪些&#xff1f;BT、BOT、EPC分别是什么模式&#xff1f;总结 什么是EPC EPC是Engineering&#xff08;工程&#xff09;&#xff1a;代表设计、采购和施工总承包。Procurement&#xff08;采购&#xff09;&#xff1a;代表采购和物资管理。Constru…

各牌浏览器设置地址栏显示完整URL

有时候&#xff0c;我们在浏览器的地址栏输入URL后&#xff0c;需要查看完整的URL路径&#xff0c;比如想看到是http协议还是https协议。 目前大多数浏览器都直接将协议头隐藏&#xff0c;需要复制出地址&#xff0c;或者点击地址栏才能看到&#xff0c;比较麻烦。 浏览器支持通…

Docker 部署 jar 项目

文章目录 1、上传jar包2、新建 Dockerfile 文件3、新建 deploy.sh 脚本&#xff08;创建并运行&#xff09;4、新建 upgrade.sh 脚本&#xff08;更新&#xff09; 1、上传jar包 2、新建 Dockerfile 文件 添加jar包及修改端口 # 基础镜像 FROM java:8 # 添加jar包 ADD servic…

【STM32】基于stm32的阿里云智能家居

摘 要 智能家居是一种通过物联网将家里的各种电器设备连接在一起&#xff0c;并由中心控制器统一管理的信息系统。系统的核心是各类家居信息的采集与处理。阿里云能够提供云端的数据存储和分析功能&#xff0c;可以作为智能家居中心控制器的重要平台。 本文主要研究了基于阿里云…

WPF 控件设置透明度的方法

方法一&#xff1a;通过 Opacity 属性设置背景色透明度。范围从0-1&#xff0c;0表示完全透明&#xff0c;看不见。 通过 Opacity 属性去改变控件透明度 会影响子控件的透明度&#xff0c;是因为Opacity属性是在UIElement 类(以及Brush基类)中定义&#xff0c;所有元素都具有该…

Unity VR 开发教程:Meta Quest 一体机开发 (二)混合现实 MR 透视 Passthrough 环境配置

文章目录 &#x1f4d5;教程说明&#x1f4d5;配置透视的串流调试功能&#x1f4d5;第一步&#xff1a;设置 OVRManager&#x1f4d5;第二步&#xff1a;添加 OVRPassthroughLayer 脚本&#x1f4d5;第三步&#xff1a;在场景中添加虚拟物体&#x1f4d5;第四步&#xff1a;删除…

系统架构设计师 5:软件工程

一、软件工程 1 软件过程模型 软件要经历从需求分析、软件设计、软件开发、运行维护&#xff0c;直至被淘汰这样的全过程&#xff0c;这个全过程称为软件的生命周期。 为了使软件生命周期中的各项任务能够有序地按照规程进行&#xff0c;需要一定的工作模型对各项任务给予规…

JavaScript进阶----《getter 和 setter 是什么》

前言&#xff1a; 这两个属性在学习前端的时候看到过&#xff0c;但是由于项目中没有用到过&#xff0c;所以一直没有细致的了解。今天 review 同事代码的时候&#xff0c;遇到了这个写法&#xff0c;看了半天也不知道如何处理。再不学习真的以后连别人的代码都不知道什么意思了…

spring Cloud使用Skywalking搭建笔记

skywalking支持dubbo&#xff0c;SpringCloud&#xff0c;SpringBoot集成&#xff0c;代码无侵入&#xff0c;通信方式采用GRPC&#xff0c;性能较好&#xff0c;实现方式是java探针&#xff0c;支持告警&#xff0c;支持JVM监控&#xff0c;支持全局调用统计等等&#xff0c;功…

uniapp 中 引入vant组件 和 vant 报错Unclosed bracket 的问题解决

在uniapp 中引入vant组件&#xff0c;遇到一个报错&#xff0c;所以在此记录一下完整过程 一、引入vant组件 方式一&#xff1a;前往 GitHub官网 Vant 下载压缩文件&#xff0c;获取下载中的dist 文件 方式二&#xff1a;通过npm install 方式引入 npm i vant/weapp -S --pr…

Android Studio 找不到 uploadArchives 入口

在4.2之前版本的 Android Studio 中想要module 打包arr&#xff0c;上传Maven 我们只需要 在对应module的build.gradle文件顶部添加 apply plugin: maven然后每一次修改记得要修改版本号&#xff0c;相同版本号提交失败&#xff0c;是不会覆盖的 defaultConfig {......versi…

2022年12月份青少年软件编程Python等级考试试卷六级真题(含答案)

一、单选题(共25题&#xff0c;共50分) 1.数据文件“abc.txt”中包含若干个英文单词&#xff0c;如图所示&#xff1a; 读取文件“abc.txt”中数据的Python程序段如下&#xff1a; file abc.txt word_b [] for word in open(file):if word[0:1] a and len(word)>4:wo…