STM32学习之温湿度检测——DHT11

2023-10-27

一准备材料

1、参考资料

2、器件准备

  • STM32板子
    在这里插入图片描述
  • DHT11
    在这里插入图片描述

二、原理说明

1、通信协议:单总线协议

(1)简介

单总线是DALLAS公司研制开发的种协议由一个总线主节点、和多个从节点组成系统,通过根信号线对从芯片进行数据的读取。每一个符合OneWire协议的从芯片都有一个唯一的地址,包括48位的序列号、8位的家族代码和8位的CRC代码。主芯片对各个从芯片的寻址依据这64位的不同来进行。单总线利用一根线实现双向通信。因此其协议对时序的要求较严格,如应答等时序都有明确的时间要求。,基本的时序包括复位及应答时序、写一位时序、读一位时序。在复位及应答时序中,主器件发出复位信号后,要求从器件在规定的时间内送回应答信号;在位读和位写时序中,主器件要在规定的时间内读出或写出数据。

注释:
1、知道是哪家公司的开发的
2、知道通过一根数据线来进行数据的传输

(2)单总线工作原理

单总线器件内部设置有寄生供电电路(Parasite Power Circuit)。当单总线处于高电平时,一方面通过二极管VD向芯片供电,另方面对内部电容C(约800pF)充电;当单总线处于低电平时,二极管截止,内部电容c向芯片供电。由于电容c的容量有限,因此要求单总线能间隔地提供高电平以能不断地向内部电容C充电、维持器件的正常工作。这就是通过网络线路“窃取”电能的“寄生电源”的工作原理。要注意的是,为了确保总线上的某些器件在工作时(如温度传感器进行温度转换、E2PROM写人数据时)有足够的电流供给,除了上拉电阻之外,还需要在总线上使用MOSFET(场效应晶体管)提供强上拉供电。

单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。主设备I/O口可直接驱动200m范围内的从设备,经过扩展后可达1km范围。

注释:
1、可以自己讲出来单总线协议的原理

  • 高电平时:1、需要通过二极管VD给芯片供电;2、需要给电容C充电
  • 低电平时:1、此时二极管截止;2、此时电容放电给芯片供电
  • 有特殊器件(温度传感器、E2PROM写人数据时)还需要足够的电流,所以需要MOSFET(场效应晶体管)来通过强上拉供电(即有足够的电流)

2、单总线的数据传输速率一般为16.3Kbit/s

(3)结构

单总线主机或从机设备通过一个漏极开路或三态端口连接至该数据线,这样允许设备在不发送数据时释放数据总线,以允许设备在不发送数据时能够释放总线,而让其他设备使用总线,其内部等效电路。
单总线要求外接一个约5 k的上拉电阻.这样,当单总线在闲置时,状态为高电平。如果传输过程需要暂时挂起,且要求传输过程还能够继续,则总线必须处于空闲状态。
传输之间的恢复时间没有限制,只要总线在恢复期间处于空闲状态(高电平)。如果总线保持低电平超过480us,总线上的所有器件将复位。另外,在寄生方式供电时,为了保证单总线器件在某些工作状态下(如:温度转换器件、EEPROM写入等)具有足够的电源电流,必须在总线上提供强上拉。

注释:
1、漏极开路 指 MOSFET 的漏极输出电路,在实际应用中可以将多个开漏输出的弓|脚连接到一条线上,这样就形成“线与逻辑”关系。注意这个公共点必须接-一个 上拉电阻。当这些引脚的任- -路变为逻辑 0后,开漏线上的逻辑就为0了。在I2C等接口总线中就用此法判断总线占用状态。
2、三态端口:有三种状态1、高电平;2、低电平 3、高阻态(禁止态),在总线上高阻态的引脚不受信号影响。
3、外接上拉电阻,当单总线闲置时状态为高电平。

(4)单总线通信信号类型

单总线通信协议定义了如下几种类型,即复位脉冲、应答脉冲、写0、写1、读0和读1,除了应答脉冲外,所有的信号都由主机发出同步信号,并且发送的所有的命令和数据都是字节的低位在前。

单总线通信协议中不同类型的信号都采用一种类似脉宽调制的波形表示,逻辑0用较长的低电平持续周期表示,逻辑1用较长的高电平持续周期表示。在单总线通信协议中,读写时隙的概念十分重要,当系统主机向从设备输出数据时产生写时隙,当主机从从机设备读取数据时产生读时隙,每一个时隙总线只能传输一位数据。无论是在读时隙还是写时隙,它们都以主机驱动数据线位低电平开始,数据线的下降沿是从设备触发其内部的延时电路,使之与主机同步。在写时隙内,该延迟电路决定从设备采样数据线的时间窗口。

单总线通信协议中存在两种写时隙:写1和写0。主机采用写1时隙向从机写入1,而采用写0时隙向从机写入0,。所有写时隙至少要60us,且在两次独立的写时隙之间至少需要1us的恢复时间。两种写时隙均起始于主机拉低数据总线。产生1时隙的方式:主机拉低总线后,接着必须在15us之内释放总线,由上拉电阻将总线拉至高电平;产生写0时隙的方式为在主机拉低后,只需要在整个时隙间保持低电平即可(至少60us)。在写时隙开始后15us~60us期间,单总线器件采样总电平状态。如果在此期间采样值为高电平,则逻辑1被写入器件;如果为0,写入逻辑0。

在下图中,黑色实现代表系统主机拉低总线,黑色虚线代表上拉电阻将总线拉高。

在这里插入图片描述
注释
1、写“1”,主机总线拉低15us内拉高,并且持续到60us以后完成
2、写“0”,主机总线拉低,持续60us以上完成

对于读时隙,单总线器件仅在主机发出读时隙时,才向主机传输数据。所有主机发出读数据命令后,必须马上产生读时隙,以便从机能够传输数据。所有读时隙至少需要60us,且在两次独立的读时隙之间至少需要1us的恢复时间。每个读时隙都由主机发起,至少拉低总线1us。在主机发出读时隙之后,单总线器件才开始在总线上发送0或1。若从机发送1,则保持总线为高电平;若发出0,则拉低总线。

当发送0时,从机在读时隙结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态。从机发出的数据在起始时隙之后,保持有效时间15us,因此主机在读时隙期间必须释放总线,并且在时隙起始后的15us之内采样总线状态。

在这里插入图片描述
上图黑色实线代表系统主机拉低总线,灰色实线代表总局拉低总线,而黑色的虚线则代表上拉电阻总线拉高。以上对单总线通信过程的几种信号进行了介绍,但由于复位脉冲以应答脉冲与单总线通信过程初始化的密切关系,对这两种信号的介绍将放在单总线通信初始化中阐述。
注释:
1、单总线器件才开始在总线上发送0或1。若从机发送1,则保持总线为高电平;若发出0,则拉低总线。
2、读数据命令发出15us主机内必须采样总线状态。

(5)单总线通信初始化

单总线上的所有通信都是以初始化序列开始,初始化序列包括主机发出的复位脉冲及从机的应答脉冲,这一过程如下图所示。在图中,黑色实线代表系统主机拉低总线,灰色实线代表从机拉低总线,而黑色的虚线则代表上拉电阻极爱那个总线拉高。
在这里插入图片描述
 系统主设备发送端发出的复位脉冲式一个480us ~ 960us的低电平,然后释放总线进入接受状态。此时系统总线通过4.7K的上拉电阻接至VCC高电平,时间约为15us~60us,接种在接收端的设备就开始检测I/O引脚上的下降沿以及监视在脉冲的到来。主设备处于这种状态下的时间至少为480us。

作为从设备的奇迹爱你在接收到系统主设备发出的复位脉冲之后,向总线发出一个应答脉冲,表示从设备已准备好,可根据各种命令发送或接受数据。通常情况下,器件等待15us ~ 60us即可发送应答脉冲(该脉冲是一个60us~240us的低电平信号,它由从机强迫将总线拉低)。

复位脉冲式主设备以广播方式发出的,因而总线上所有的从设备同时发出应答脉冲。一旦器件检测到应答脉冲后,主设备就认为总线上已连接了从设备,接着主设备将发送有关的ROM功能命令。如果主设备未能检测到应答脉冲,则认为总线上没有挂接单总线从设备。

注释:
1、所为的复位信号就是主机输出至少为480us的低脉冲,将处于闲置状态的总线拉低,出现一个下降沿,总线上的从设备可以接受到这个下降沿,然后等待15us ~ 60us后,输出一个60us~240us的低电平信号,这个信号就是响应信号
2、主机接到响应信号后就说明总线上挂接有从设备,否则就没有挂接从设备。

(6)单总线通信的ROM命令

当主机检测到应答脉冲后,就发出ROM命令,这些命令与各个从机设备的唯一64位ROM代码相关,允许主机在单总线上连接多个从设备时,指定操作某个从设备。使得主机可以操作某个从机设备。这些命令能使主机检测到总线上有多少个从机设备以及设备类型,或者有没有设备处于报警状态。从机设备支持5种ROM命令,每种命令长度为8位。丰机在发出功能命今之前,必须发出ROM命今。

在这里插入图片描述
注释:
1、知道从机设备有唯一64位ROM代码
2、知道ROM命令有5种,每种命令长度为8位。

(7)单总线通信的功能命令

主机发出ROM命令,访问指定的从机,接着发出某个功能命令。这些命令允许主机写入或读出从机暂存器、启动工作以及判断从机的供电方式

注释:
1、上面介绍的注释单总线的通用情况,具体的使用情况还是需要看器件说明书。

2、DHT11原理

一、产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括-一个电容式感湿元件和-个NTC测温元件,并与–个高性能8位单片机相连接。
二、应用范围
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括-一个电容式感湿元件和一-个NTC测温元件,并与–个高性能8位单片机相连接。
三、产品亮点 成本低、长期稳定、相对湿度和温度测量、品质卓越、超快响应、抗干扰能力强、超长的 信号传输距离、数字信号输出、精确校准。
在这里插入图片描述
在这里插入图片描述

(1)功能

可以检测周围环境的温度和湿度

(2)时序解读

DHT11数据信号时序图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据计算:
在这里插入图片描述

在这里插入图片描述

(3)引脚说明

在这里插入图片描述

1、VDD 供电3.3~5.5V DC
2、DATA 串行数据,单总线
3、NC 空脚
4、GND 接地,电源负极

三、实物连接

原理图:
在这里插入图片描述

在这里插入图片描述

四、代码实现

1、初始化

在这里插入图片描述
下面了解复位函数
在这里插入图片描述

#define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}

GPIOA->CRH&=0XFFFF0FFF:表达的意思可以看下图,就是将选择的PA11配置为输入模式
那为什么要这样配置呢?我们这里不是要输出复位信号吗?
在这里插入图片描述
GPIOA->CRH|=3<<12:表达的是将选择的PA11配置为开漏输出

下面是应答信号:
在这里插入图片描述

2、读取数据

在这里插入图片描述
读取字节函数
在这里插入图片描述
读取一位数据函数:
在这里插入图片描述
注释:
每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不建议连续多次读取传感器,每次读取传感器间隔大于2秒即可获得准确的数据。

  • 头文件
#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"   
 
//IO方向设置
#define DHT11_IO_IN()  {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;}
#define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;}
//IO操作函数											   
#define	DHT11_DQ_OUT PAout(11) //数据端口	PA11 
#define	DHT11_DQ_IN  PAin(11)  //数据端口	PA11


u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度
u8 DHT11_Read_Byte(void);//读出一个字节
u8 DHT11_Read_Bit(void);//读出一个位
u8 DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11    
#endif



  • .c文件
#include "dht11.h"
#include "delay.h"


      
//复位DHT11
void DHT11_Rst(void)	   
{                 
	DHT11_IO_OUT(); 	//SET OUTPUT
    DHT11_DQ_OUT=0; 	//拉低DQ
    delay_ms(20);    	//拉低至少18ms
    DHT11_DQ_OUT=1; 	//DQ=1 
	delay_us(30);     	//主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	DHT11_IO_IN();//SET INPUT	 
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=100)return 1;
	else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		delay_us(1);
	};
	if(retry>=100)return 1;	    
	return 0;
}
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void) 			 
{
 	u8 retry=0;
	while(DHT11_DQ_IN&&retry<100)//等待变为低电平
	{
		retry++;
		delay_us(1);
	}
	retry=0;
	while(!DHT11_DQ_IN&&retry<100)//等待变高电平
	{
		retry++;
		delay_us(1);
	}
	delay_us(40);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}
//从DHT11读取一个字节
//返回值:读到的数据
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在    	 
u8 DHT11_Init(void)
{	 
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PG端口时钟
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;				 //PG11端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOG, &GPIO_InitStructure);				 //初始化IO口
 	GPIO_SetBits(GPIOA,GPIO_Pin_11);						 //PG11 输出高
			    
	DHT11_Rst();  //复位DHT11
	return DHT11_Check();//等待DHT11的回应
} 

五、总结

1、基本原理、代码、连线搞定,感觉非常OK
2、道阻且长,行则将至。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32学习之温湿度检测——DHT11 的相关文章

  • DANA简介

    Dynamically Allocated Neural Network DANA Accelerator https github com bu icsg dana spinalHDL Doc https spinalhdl github

随机推荐

  • 04-----git查看相应信息的操作

    git branch a 查看所有分支 git log p master remotes origin master 查看本地的master分支和remotes origin master分支的差别 git status 可以查看到工作区
  • shell 脚本学习

    1 bin bash 指定解释器是 bash 解释器有几种 2 a 1 给a赋值为1 注意中间不能有空格 赋值时不能有空格 3 unset a 取消变量a 4 readonly a 10 声明a为只读变量 并且赋值为10 注意这时就不能用u
  • Flutter环境搭建报错:What went wrong: A problem occurred configuring root project 'android'

    window下 在AS中搭建Flutter环境 创建Flutter项目报错 报错信息如下 文件加载失败 需要更换gradle文件中的镜像 找到 gradle文件 2 更改镜像 更改镜像 repositories google jcenter
  • 软件2.0时代之三:毛新生谈他眼中的Web2.0

    软件2 0时代之三 毛新生谈他眼中的Web2 0 2007 08 31 来自 CSDN 共有评论 7 条 发表评论 收藏到我的网摘 Web是一个 活物 是一个时时新 日日新 每天都在生长着的世界上最大的开放分布式系统 Web和以前的IT系统
  • How to Install one Plug-in into Eclipse

    How to Install One New Plug in Old Way before Eclipse 3 4 Installed new plug ins by dumping them in the eclipse plugins
  • 笔试

    文章目录 前言 36 异步FIFO的设计 1 先从同步FIFO说起 2 异步FIFO介绍 3 空满判断 4 跨时钟域问题 5 关于格雷码的转换 6 代码实现异步FIFO 7 几点思考 8 写在后面 往期精彩 前言 嗨 来啦 今天学习一个 比
  • 对象数组去重——数组删除所有含有固定id的对象

    一 重要方法 filter 方法可以创建一个新的数组 新数组中的元素是通过检查指定数组中符合条件的所有元素 1 数组去重 86 77 77 86 gt 86 77 去除重复元素依靠的是indexOf总是返回第一个元素的位置 后续的重复元素位
  • The inferior stopped because it received a signal from the Operating System.

    前景提要 要理解这个错误的根源 根源 用户的指针指向了系统的内存区域 表象 程序异常结束 exe crashed 编译可以通过 dedug时出现 The inferior stopped because it received a sign
  • 阿里云 OSS介绍

    1 什么是阿里云 OSS OSS 为 Object Storage Service 即对象存储服务 是阿里云提供的海量 安全 低成本 高可靠的云存储服务 OSS 具有与平台无关的 RESTful API 接口 可以在任意应用 任意时间 任意
  • 代码重复率检查工具jsinspect 检查重复代码,去掉冗余代码。

    jscpd jsinspect npm install g jsinspect 检测复制粘贴和结构类似的JavaScript代码
  • Flutter 图片裁剪

    参考一 参考二 参考三
  • 「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

    OceanBase 4 1 体验 前言 OCP Express在线升级功能 租户级物理备库 TP 事务处理 和AP 分析处理 优化 TP 性能优化 AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4 1的初体验
  • 自动化测试实现多线程

    自动化测试实现多线程 进程 进程就是一个程序在一个数据集上的一次动态执行过程 我们编写的程序用来描述进程要完成哪些功能以及如何完成 线程 线程页脚轻量级进程 他是一个基本的CPU执行单元 是进程中的实现 线程的出现是为了降低上下文切换的小号
  • vue调试工具vue-devtools安装及使用(支持vue3版本)

    github下载地址 https gitee com h5web devtools 6 0 0 beta 15 1 下载Github源文件 devtools 6 0 0 beta 15 git clone https gitee com h
  • Blender雕刻基础:使用方法与技巧

    如何正确进入雕刻模式 1 在启动对话框界面中或是文件菜单新建项 选择Sculpting直接进入雕刻模式 选择雕刻模式默认只有Sculpting 雕刻 和Shading 着色 两个选项卡 2 如果选择的是常规 界面中的物体并不是真正用以雕刻的
  • activiti源码解析系列8 - 任务完成命令类

    我们在完成任务的时候都执行了哪些操作呢 主要涉及删除表 默认非级联 ACT RU TASK ACT RU IDENTITYLINK ACT RU VARIABLE 主要看一个CompleteTaskCmd protected Void ex
  • react,tsx中使用微信jssdk分享总结

    React tsx的H5项目使用企业微信JS SDK 步骤 1 配置域名 点击企业微信PC版左下角登录管理后台 应用管理 应用 设置应用主页 网页授权及JS SDK 2 引入JS SDK 在React项目内终端下载 npm install
  • go 并发的非阻塞缓存

    本节中我们会做一个无阻塞的缓存 这种工具可以帮助我们来解决现实世界中并发程序出现但没有现成的库可以解决的问题 这个问题叫作缓存 memoizing 函数 译注 Memoization的定义 memoization 一词是Donald Mic
  • ApiPost测试

    1 api接口地址 1 错误地址 2 正确地址 3 原因
  • STM32学习之温湿度检测——DHT11

    一准备材料 1 参考资料 STM32不完全手册 库函数版本 STM32F103xCDE DS CH V5 pdf STM32中文参考手册 V10 pdf DHT11 DHT11 下载链接 https pdf1 alldatasheetcn