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) 的相关文章

  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

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

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • 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