dht11温湿度传感器_DHT11及DHT21温湿度传感器时序图解析(STM32)

2023-05-16

01a3b4865e2f38958b19ddb39ffd285e.pngDHT11和DHT21是学习单总线通信中常见的传感器,在毕业设计中也常常用来测量环境的温湿度数据。下面对DHT11和DHT21进行简单的对比:

DHT11:

测量范围:20-90% RH 0-50℃

测湿精度:±5% RH

测温精度:±2℃

分辨力:1

5e7c67b77d0f993e805eb70033be000e.png

DHT11引脚说明(正面观看,左边的为1脚):

0df300494809bc7e87818f9c2ba9d5d4.png

6ecdfd0ea11e019d3adcdf60d85b4aa0.png

DHT21(AM2301):

测量范围:0-99.9% RH -40~+80℃

测湿精度:±3% RH

测温精度:±0.5℃

分辨力:0.1%RH/0.1℃

5037581b0cab104ee24ce23804f2ff0b.png

84b07a651c3ab2af6d89f19475863937.png

典型应用电路:

298df5bc9fd9c737e8b951b30cb3392d.png

说明:

(1)、DHT11和DHT21供电范围都是3V~5.5V,对于STM32单片机,我们VDD引脚接3.3V即可; (2)、DHT11的手册中说,SDA数据引脚接线长度短于20米时,用5K上拉电阻。大于20米时根据实际情况使用合适的上拉电阻; (3)、DHT11上电后,需要等待1s以越过不稳定状态,在此期间无需发现任何指令;本人尝试上电即读取,返回温湿度值都为0,1S以后温湿度值即可恢复正常; (4)、电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。 DHT11和DHT21的时序基本相同,下面以DHT11的时序图为例进行分析:

7517f83698d511bafa79a20202692420.png

10469278f6edb2a8eb7ec79e969d5380.png

注意:

DHT11和DHT21的主线拉低的时间不同,DHT11主机(MCU)至少拉低18ms,DHT21主机(MCU)至少拉低500us,为了程序上兼容,我们一般将总线拉低25ms,这样DHT11和DHT21的驱动程序就可以兼容了。

DHT11总线驱动过程:

1、MCU发送开始起始信号总线空闲状态为高电平,主机把总线拉低等待DHT11响应;与MCU相连的SDA数据引脚置为输出模式;主机把总线拉低至少18毫秒,然后拉高20-40us等待DHT返回响应信号; 2、读取DHT11响应SDA数据引脚设为输入模式;DHT11检测到起始信号后,会将总线拉低80us,然后拉高80us作为响应; 3、DHT11送出40bit数据

注意:

送出的数据高位在前。

40bit数据(5字节数据)数据包:

DHT11

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

DHT21

数据格式: 40bit数据=16bit湿度数据+16bit温度数据+8bit校验和

例子:  接收40bit数据如下:      

         0000 0010  1000 1100    0000 0001  0101 1111    1110 1110

                   湿度数据                            温度数据                    校验和

             湿度高8位+湿度低8位+温度高8位+温度低8位=和的低8位=校验和

             例如:0000 0010+1000 1100+0000 0001+0101 1111=1110 1110

二进制的湿度数据   0000 0010  1000 1100 ==>转为十进制:652,除以10即为湿度值;

             湿度=65.2%RH     

二进制的温度数据   0000 0001  0101 1111 ==>转为十进制:351,除以10即为温度值;

     温度=35.1℃      

             当温度低于0℃时温度数据的最高位置1。

             例如:-10.1℃表示为1000 0000 0110 0101  

注意:DHT21温湿度数据为16位,DHT11数据为8位,所以尽管两者时序相同,却不能用同样的数据类型计算。

/**  * @brief  读取40bit数据  * @param  none.  * @retval 1 读取成功,0读取失败.  */int DHT11_ReadData(void){    unsigned int cout = 1;    unsigned int T_H, T_L, H_H, H_L, Check;    //设置IO为输出模式    DHT_Set_Output();        //1、MCU发送开始起始信号    DHT_ResetBit();    delay_ms(25);        //拉低至少18ms    DHT_SetBit();            delay_us(20);        //拉高20~40us        //设置IO口为输入模式    DHT_Set_Input();        //2、读取DHT11响应    if(DHT_ReadBit() == Bit_RESET)    {        //等待80us的低电平        cout = 1;        while(!DHT_ReadBit() && cout++);                //等待80us的高电平        cout = 1;        while(DHT_ReadBit() && cout++);                //3、DHT11送出40bit数据        //读取8bit的湿度整数数据        H_H = DH21_ReadByte();                //读取8bit的湿度小数数据        H_L = DH21_ReadByte();                //读取8bit的温度整数数据        T_H = DH21_ReadByte();                //读取8bit的温度小数数据        T_L = DH21_ReadByte();                //读取8位的校验和        Check = DH21_ReadByte();                //校验数据是否合法,合法的话将数据保存到全局结构体变量中备用        if(Check == (H_H + H_L + T_H + T_L))        {            DHT11.Hum_H = H_H;            DHT11.Hum_L = H_L;            DHT11.Tem_H = T_H;            DHT11.Tem_L = T_L;                return 1;        }        else        {            return 0;        }    }    return 0;}
上面读取40bit数据的函数中有一个读取单字节(8bit)数据的函数DH21_ReadByte();这里涉及到1bit数据到底是0还是1的判断规则。

数据'0'还是'1'判定规则:

位数据“0”的格式为:50 微秒的低电平和 26-28 微秒的高电平,位数据“1”的格式为:50 微秒的低电平加 70微秒的高电平。 时序过程: 1、等待50us低电平结束因为接收数据时,低电平的时间都是50us,该位数据到底是0还是1,取决于低电平后面的高电平的时间多少;如果不考虑低电平的时间,我们可以简化程序,可以先等待低电平过去;2、数据拉高后,判断30us后数据总线电平的高低等待数据线拉高后,再延时30us,因为30us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。

3af1485a8b520d003669b3698d7207d2.png

位数据“0”判定图

2cb9577d84e025b6c22bf9c1b9ced2e0.png

位数据“1”判定图

该函数的具体实现如下:

/**  * @brief  读取8bit 数据  * @param  none.  * @retval none.  */int DH21_ReadByte(void){    int data=0;    char i;    char cout;        for(i=0; i<8; i++)    {        //1、等待50us低电平结束        cout=1;        while(!DHT_ReadBit() && cout++);                //2、数据拉高后,判断30us后数据总线电平的高低        //延时30us之后读取IO口的状态        delay_us(30);                //先把上次的数据移位,再保存本次的数据位。        data = data << 1;                if(DHT_ReadBit() == Bit_SET)        {                data |= 1;        }                        //等待输入的是低电平(高电平结束),进入下一位数据接收        cout=1;        while(DHT_ReadBit() && cout++);    }    return data;}

对40bit数据处理,得到温湿度数据:

/**  * @brief  获取温度  * @param  none.  * @retval Temp, 温度值  */int DHT11_GetTem(void){    //return (DHT11.Tem_H << 8 | DHT11.Tem_L);    //DHT21    return (DHT11.Tem_H*10 + DHT11.Tem_L);        //DHT11}/**  * @brief  获取湿度  * @param  none.  * @retval Hum,湿度值  */int DHT11_GetHum(void){    //return (DHT11.Hum_H << 8 | DHT11.Hum_L);    //DHT21    return (DHT11.Hum_H*10  + DHT11.Hum_L);       //DHT11}

注意:

上面函数得到的数据为真实温湿度值的放大10倍之后的值,使用时,需将函数的返回值除以10才为真实值;

欢迎关注

程序员小哈带你玩转嵌入式,微信搜索:嵌入式从0到1,更多干货等着你。

2fb1380318975391c88fb840e6e5f589.png

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

dht11温湿度传感器_DHT11及DHT21温湿度传感器时序图解析(STM32) 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • 物联网网关

    物联网网关是 连接物联网设备和互联网的重要桥梁 它负责将物联网设备采集到的数据进行处理 存储和转发 使其能够与云端或其它设备进行通信 物联网网关的作用是实现物联网设备与云端的无缝连接和数据交互 物联网网关功能 数据采集 物联网网关可以从物联
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • win10+VS2019+NVIDIA CUDA10.1 安装失败解决方案

    win10 43 VS2019 43 NVIDIA CUDA10 1安装时 xff0c 提示 NVIDIA 安装程序失败 xff0c 几乎所有组件的状态都显示 未安装 百度了一下 xff0c 原因可能是我的电脑有VS xff0c 影响了cu
  • 【转载】阿里云域名解析将一个域名指向另一个域名

    在域名解析的环节 xff0c 有时候我们会遇到将一个域名解析到另一个域名的情况 xff0c 在阿里云的云解析DNS中可以通过添加解析记录来实现 xff0c 设置CNAME项的值设置为另一个域名 xff0c 即可实现该功能 下面以阿里云服务器
  • 机器学习算法-logistic回归算法

    Logistic回归算法调试 一 算法原理 Logistic回归算法是一种优化算法 xff0c 主要用用于只有两种标签的分类问题 其原理为对一些数据点用一条直线去拟合 xff0c 对数据集进行划分 从广义上来讲这也是一种多元线性回归方法 x
  • 词频统计项目的总结

    刚开始在做词频统计时只能在代码中更改统计的段落 xff0c 这样使代码看起来非常的乱而且容易出错 xff0c 随着老师的要求有变更 xff0c 我的代码也开始进行更新 xff0c 词频统计实现可以从控制台进行输入要统计文档的名字进行统计 x
  • taishan服务器修改为u盘启动,bios改成u盘启动

    怎么在BIOS界面设置U盘启动呢 这个对于很多想要U盘重装系统的朋友来说非常头疼的事情 xff0c 相对小白用户来说 xff0c BIOS界面的专业性比较强 xff0c 而且是英文状态 xff0c 很多朋友直接懵了 xff0c 那么如何设置
  • Flex的危局,还是HTML5的盛宴?

    为InfoQ的RIA迷你书写序 xff0c 似乎是我的宿命 由于工作原因把这个任务推迟了一段时间之后 xff0c 后果居然是不仅写了序 xff0c 还成为了另一篇序的译者 互联网10年 xff0c 始于2000年 对于互联网来说 xff0c
  • c语言错误c1021,C语言命语法错误大全

    C语言 语法错误大全 fatal error C1004 unexpected end of file found 未找到文件末尾 可能是括号匹配问题 fatal error C1021 invalid preprocessor comma
  • SQL Server 2012企业版和标准版的区别

    关于使用Microsoft SQL Server 数据库的公司一般会有疑问 xff0c 企业版数据库和标准版数据库的区别在哪 xff1f 如果采购企业版的价格和标准版的价格相差很大 xff0c 从多方资料查询发现 xff0c 我认为最主要的
  • 查询SQL SERVER 数据库版本号脚本语句

    数据库直接执行此语句即可 select 64 64 version 示例 xff1a Microsoft SQL Server 2014 12 0 2000 8 X64 Feb 20 2014 20 04 26 Copyright c Mi
  • SQL SERVER 还原误操作导致还原无法停止,处理办法

    昨天遇到运行库不知道单位哪个小伙子 xff0c 把数据库还原了 xff0c 导致单位业务全部瘫痪 xff0c 主数据库一直显示正在还原 xff0c 真的是不敢动 xff0c 经过多方寻找 xff0c 找到此脚本 数据库还原日志 xff0c
  • Docker安装及部署实例.Net Core

    1 什么是Docker Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的 Linux 机器上 xff0c 也可以实现虚拟化 容器是完全使用沙箱机制
  • 将html格式的内容转换成纯文本格式

    最近做的一个东东 xff0c 想要去除掉保存的字符串内容的所有html格式 xff0c 也就是只取纯文本 xff0c 从网上查了些相关资料 xff0c 以及正则表达式的用法 xff0c 有一个方法向大家推荐 xff0c 基本去除了我想要去除
  • 待解决:PDF header signature not found

    转载于 https www cnblogs com ITGirl00 p 3531475 html
  • 从统计学看线性回归(2)——一元线性回归方程的显著性检验

    目 录 1 2 的估计 2 回归方程的显著性检验 t 检验 xff08 回归系数的检验 xff09 F 检验 xff08 回归方程的检验 xff09 相关系数的显著性检验 样本决定系数 三种检验的关系 一 2 的估计 因为假设检验以及构造与
  • TypeError: unsupported operand type(s) for +: 'float' and 'decimal.Decimal'

    TypeError unsupported operand type s for 43 39 float 39 and 39 decimal Decimal 39 浮点型和双精度类型 相加报错 from decimal import Dec
  • 计算机主机拆解报告心得体会,计算机拆装实验报告心得体会(共10篇).doc

    计算机拆装实验报告心得体会 共10篇 计算机拆装实验报告心得体会 共10篇 计算机拆装实验 实验报告 计算机拆装实验 实验报告 班级 xff1a 计算机01班 实验题目 xff1a 计算机的拆装实验 一 实验目的 xff1a 通过实验熟悉计
  • 《大数据时代》读书总结

    这本书从以下几个方面阐述了我们所处的时代是如何展现 大数据 的 xff1a 1 首先是大数据时代的思维变革 思维为什么需要变革 xff1f 怎样变革 xff1f 思维需要变革的第一个原因是 xff0c 这个时代获取和处理数据的方式更加多元
  • libevent和libcurl实现http和https服务器 cJSON使用

    前言 libevent和libcurl都是功能强大的开源库 xff1b libevent主要实现服务器 xff0c 包含了select epoll等高并发的实现 xff1b libcurl实现了curl命令的API封装 xff0c 主要作为
  • (二) launcher详解 (类加载机制 第二篇)

    sun misc Launcher类 sun misc Launcher类是不开源的 xff0c 我们只能通过IDEA反编译看到代码 xff0c 根据第一篇 xff0c 我们知道 xff0c 类加载的神器主要是在Launcher这个类中 x
  • dht11温湿度传感器_DHT11及DHT21温湿度传感器时序图解析(STM32)

    DHT11和DHT21是学习单总线通信中常见的传感器 xff0c 在毕业设计中也常常用来测量环境的温湿度数据 下面对DHT11和DHT21进行简单的对比 xff1a DHT11 xff1a 测量范围 xff1a 20 90 RH 0 50