基于STM32的DHT11温湿度测量

news2025/6/24 7:29:14

目录

1.简介

2.主要参数 

 3.引脚说明

4.注意事项

5.单总线协议

6.数据格式

7.工作时序

8.分模块编写程序


1.简介

  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。DHT11实物图和内部框图如下图。
DHT11
DHT11内部框图
DHT11内部框图

2.主要参数 

温湿度性能
湿度量程5  -  95  %RH误差:±5%RH(25℃)
湿度量程-20  -  60 ℃误差:±2℃(25℃)
电气特性
供电电压3.3 - 5.5单位:V
供电电流
0.06(待机) 、1.0(测量)   
单位:mA
采样周期>2单位:s

 3.引脚说明

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

4.注意事项

1、典型应用电路中建议连接线长度短于5m时用4.7K上拉电阻,大于5m时根据实际情况降
      低上拉电阻的阻值。
2、使用3.3V电压供电时连接线尽量短,接线过长会导致传感器供电不足,造成测量偏差。
3、每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取2次,但不
      建议连续多次读取传感器,每次读取传感器间隔大于2秒即可获得准确的数据。
4、电源部分如有波动,会影响到温度。如使用开关电源,温度就会跳动。

5.单总线协议

   DHT11器件采用单总线通信来实现数据交换和控制,这种通信方式只有一根数据线。设备可以通过漏极开路或三态端口连接到数据线上,以允许设备在不发送数据时释放总线并让其他设备使用。为了让总线保持高电平状态,通常需要外接一个约4.7kΩ的上拉电阻。由于DHT11器件采用主从结构,只有在主机呼叫从机时,从机才能作出响应。因此,主机访问DHT11器件时必须严格遵循单总线序列,否则器件将不会响应主机。

6.数据格式

  DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次传送40位数据,
高位先出。
(1)数据格式:
8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位。
注:其中湿度小数部分为0。
(2)校验位数据定义:
“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”8bit校验
位等于所得结果的末8位。
(3)校验:
校验位=湿度高位+湿度低位+温度高位+温度低位

7.工作时序

首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(40~50us)时间,作为响应信号,然后DHT11拉高数据线,保持t4(40~50us)时间后,开始输出数据。

8.分模块编写程序

(1)IO方向设置和输出设置

//IO方向设置
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3;}
IO操作函数
#define	DHT11_DQ_OUT PAout(0) //数据端口	PC2
#define	DHT11_DQ_IN  PAin(0)  //数据端口	PC2 

(2)STM32发出复位信号

void DHT11_Rst(void)
{
    DHT11_IO_OUT();					//设置IO口输出模式
    DHT11_DQ_OUT = 0;				//拉低DQ 至少18ms
    delay_ms(20);
    DHT11_DQ_OUT = 1;				//主机拉高20~40us
    delay_us(30);
}

(3)等待DHT11回应(检测DHT11是否存在)

u8 DHT11_Check(void)
{
    u8 retry = 0;
    DHT11_IO_IN();//SET INPUT

    while(DHT11_DQ_IN && retry < 100)		//DHT11会拉低40~80us(拉低会跳出while)
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
        return 1;
    else
        retry = 0;

    while(!DHT11_DQ_IN && retry < 100)		//DHT11拉低后会再次拉高(DHT11_DQ_IN = 1)40~80us (!DHT11_DQ_IN 为0 跳出while 表示DHT11拉高)
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
    {
        return 1;
    }

    return 0;
}

(4)读一个位数据

u8 DHT11_Read_Bit(void)
{
    u8 retry = 0;

    while(DHT11_DQ_IN && retry < 100)		//主机读时 DHT11会先拉低12~14us(拉低会跳出while)
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
        return 1;
    else
        retry = 0;

    while(!DHT11_DQ_IN && retry < 100)		//主机读时 为0(再拉高26~28us) 为1(再拉高116~118us)
    {
        retry++;
        delay_us(1);
    }

    delay_us(40);							//等40us 判断此时电位 高电平为1 低电平为0

    if(DHT11_DQ_IN)
        return 1;
    else
        return 0;
}

(5)读一个字节数据

u8 DHT11_Read_Byte(void)
{
    u8 i, dat;
    dat = 0;

    for (i = 0; i < 8; i++)
    {
        dat <<= 1;
        dat |= DHT11_Read_Bit();
    }

    return dat;
}

(6)一次性读取数据并校验

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++)
        {
            buf[i] = DHT11_Read_Byte();       //5个字节读入buf数组
        }

        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])//校验 前四个字节和等于第五个字节
        {
            *humi = buf[0];
            *temp = buf[2];
        }
    }
    else
        return 1;

    return 0;
}

(7)初始化代码

u8 DHT11_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PC端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				 //PC2端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);				 //初始化IO口
    GPIO_SetBits(GPIOA, GPIO_Pin_0);						 //PC2 输出高

    DHT11_Rst();  //复位DHT11
    return DHT11_Check();//等待DHT11的回应
}

说明:本文章部分内容参考 ASARI温湿度模块DHT11 产品手册

以上就是DHT11的所有内容了,更多传感器驱动代码请订阅我的传感器专栏

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

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

相关文章

【数据分类】PNN数据分类 概率神经网络数据分类【Matlab代码#31】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 模式识别之数据分类2. 概率神经网络&#xff08;PNN&#xff09;3. 基于PNN的数据分类步骤4. 部分代码展示5. 仿真结果展示6. 资源获取说明 【可更换其他算法&#xff0c;获取资源请见文章…

web基础与HTTP服务

web基础与HTTP服务 一、web基础1、域名1.域名概述2.域名的结构3.域名注册 2、网页与HTML1.网页概述网页分类动态网页语言编程语言如下 2.HTML概述HTML 基本标签Web概述 二、HTTP服务1、HTTP版本2、HTTP请求方法3、GET 和 POST 区别4、HTTP状态码1.HTTP常见状态码 5、HTTP 请求流…

关于安卓以及微软用户chatgpt上一篇文章如今第五点无法正常进入更新解决方法以及附加本地部署

目录 一、问题出现&#xff1a; 1、问题&#xff1a; 原因&#xff1a; 二、解决办法&#xff08;本地部署chatgpt&#xff09; 1、解决&#xff08;国内网络使用真的chatgpt并非镜像&#xff09;一次部署终生使用 第一步&#xff1a; ​编辑第二步&#xff1a; 三、实现结…

S32K144开发板

目录 一&#xff0e;S32K144开发板概述 二&#xff0e;产品技术和功能规格 三&#xff0e;开发环境 1.S32K144的开发环境主流是这么三种&#xff1a; 2.开发板Demo工程 四&#xff0e;S32K144开发板实物图 五、汽车大灯硬件架构 一&#xff0e;S32K144开发板概述 S32K14…

Linux (centos)中文乱码问题解决 及说明

首先要区别3个概 &#xff1a;编码集、字符集、字体 是完全不同的东西&#xff0c;我们要解决的是字符集问题。 当一个系统初始化完毕后&#xff0c;会生成一个 /usr/lib/locale/locale-archive 文件&#xff0c;这个是字符集二进制文件&#xff0c;是系统不同语言运行的核心&…

计算机网络四 网络层

网络层的作用 网络层是计算机网络中的一个重要层次&#xff0c;它的主要作用是实现不同网络之间的通信和数据传输。网络层通过将数据分组并添加路由信息&#xff0c;使得数据可以在不同的网络之间传输。 网络层功能 异构网络互连 异构网络互连是指将不同类型的网络连接起来…

C++ 学习 ::【基础篇:07】:C++ C11 标准中 关键字 auto 的基本介绍与使用

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

redis 五种数据类型简介

redis的五种数据类型是&#xff1a;1、string&#xff08;字符串&#xff09;&#xff1b;2、hash&#xff08;哈希&#xff09;&#xff1b;3、list&#xff08;列表&#xff09;&#xff1b;4、set&#xff08;集合&#xff09;&#xff1b;5、sort set &#xff08;有序集合…

【初识 Docker | 中级篇】 Docker 安装 MySQL

文章目录 前言一、安装 docker1、安装docker2、安装docker-compose 二、mysql 单机安装1.创建mysql配置1.1.创建目录1.2.创建docker-compose.yml 2.启动mysql容器 三、mysql 主从复制安装1.主服务器容器配置1.1.修改my.cnf配置文件1.2.重启容器实例&#xff0c;创建同步用户 2.…

【 TensorFlow】URLError: <urlopen error no host given> 错误的 有效的解决方法

URLError: 错误的 有效的解决方法&#x1f60e; 前言&#x1f64c;错误运行截图&#xff1a;解决方案流程图&#xff1a;运行成功截图 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&a…

opencv_c++学习(二十六)

一、ORB特征点 ORB特征点计算步骤: Step1:选择某个像素点作为中心点P&#xff0c;其像素值为I。 Step2:设置判定FAST角点(其方法比较两个像素之间的差值)的像素阈值&#xff0c;例如 T p 20 % ∗ I p T_p 20\%*I_p Tp​20%∗Ip​ Step3:比较中心点的像素值与半径为3的圆周上…

传统加密技术(恺撒+仿射)

1.Caesar cipher恺撒密码 是一种最简单且最广为人知的加密技术。它是一种替换加密的技术&#xff0c;明文中的所有字母都在字母表上向后&#xff08;或向前&#xff09;按照一个固定数目进行偏移后被替换成密文。 加密对象&#xff1a;英文字母 密钥格式&#xff1a;k&#…

哈希表、unordered_map和unordered_set模拟

目录 哈希表 闭散列 开散列 unordered_map和unordered_set模拟 对开散列的哈希表改造 unordered_set模拟 unordered_map模拟 哈希表 哈希概念&#xff1a;通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系&#xff0c;那么在查找时通过该…

当下的程序员该如何面对复杂的就业坏境

已经2023年了&#xff0c;我们都知道现在开发趋向于年轻化&#xff0c;大部分都是90后、95后&#xff0c;毕竟&#xff0c;软件开发不像硬件开发一样&#xff0c;年限越高&#xff0c;相对来说越吃香。 31岁,前端工程师&#xff0c;工作经历8年&#xff0c;7年左右都在外包公司…

LAMP架构(Apache、Mysql、PHP服务的部署)

目录 一、LAMP架构 1.LAMP组件 二、编译安装Apache httpd服务 1.关闭防火墙&#xff0c;拉取软件包 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径 6.添加httpd系统服务 7.修改httpd 服务配置文件 8.浏览器访问验证 三、编译安装mysqld服务 1.…

java.lang.IllegalStateException: Failed to load ApplicationContext

问题描述 mvn clean install的时候报的如下异常&#xff1a; 紧接着又往下翻了一下日志还有一个这个错误 按正常来说通过可以取pom当中的properties标签的值呀。但是可以发现编译过后的application当中的值并没有被替换。 解决过程 &#xff08;1&#xff09;我先是将server.…

1:400 万中国土壤数据介绍

一、土壤数据在科研以及日常生产生活中具有重要性价值。以下是其主要方面&#xff1a; 农业生产&#xff1a;土壤数据对于农业生产至关重要。通过了解土壤的物理、化学和生物学特性&#xff0c;农民可以合理管理土壤&#xff0c;选择适合的作物和肥料&#xff0c;调整灌溉和排水…

yolov8_track追踪加分割(yolo目标检测+追踪+分割)

**这个仓库包含了最先进的多目标追踪器。其中一些基于运动信息,另一些则基于运动和外观描述。对于后者,最先进的ReID模型也会自动下载。目前支持的模型有:DeepOCSORT LightMBN、BoTSORT LightMBN、StrongSORT LightMBN、OCSORT和ByteTrack。 我们提供了如何将这个包与流行的…

【轻量化网络系列(4)】ShuffleNetV1论文超详细解读(翻译 +学习笔记+代码实现)

前言 前面我们学了MobileNetV1-3&#xff0c;从这篇开始我们学习ShuffleNet系列。ShuffleNet是Face&#xff08;旷视&#xff09;在2017年发布的一个高效率可以运行在手机等移动设备的网络结构&#xff0c;论文发表在CVRP2018上。这个新的轻量级网络使用了两个新的操作&#…

软考A计划-试题模拟含答案解析-卷一

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…