首页 > 自考资讯 > 自考知识

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

头条共创 2024-07-05

DHT11和DHT21是单线总线通信中常用的传感器,通常在研究生学习中用于测量环境温度和湿度数据。

以下是DHT11 和DHT21 之间的快速比较:

双氢睾酮11:

测量范围:20~90%RH 0~50

湿度测量精度:5%RH

测温精度:2

分辨率:1

d1a0c26e6f454df58cbd597a6c9b07e9~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=eFcDoxESSfhdwuqpBIRBIMeu1gQ%3DDHT11 引脚说明(从正面看,引脚1 在左侧):

03a4518c241849dcaeaa9aad4c3730ad~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=6UUt3d3aLRmby0QndjensPxcBWA%3D 977eb16b5da94a72b7068f03108187cd~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=FpScZhAacTlKdwxB8LJ9voaGw2s%3D

DHT21(AM2301):

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

湿度测量精度:3%RH

测温精度:0.5

分辨率:0.1%RH/0.1

1936246e0e474b52931f6f6037c7aefb~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=f1eKQZhqkvcjsPgceXXM%2FGfCnSI%3D 0e2df1b1b75d4af5b353f881bc6bd9a2~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=3zRGqEmvSh3w4p8%2BAxME93ai4Jk%3D

典型应用电路:

f881bfdacdc74f53831cbc858d37e1f0~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=17tJp6FjrseUVg46vMpOWw3j1fY%3D 说明:

(1) DHT11 和DHT21 的电源范围为3V 至5.5V。对于STM32微控制器,VDD引脚可以连接到3.3V。

(2)DHT11手册规定,如果SDA数据端接线长度小于20m,则使用5K上拉电阻。如果超过20米,请根据实际情况使用合适的上拉电阻。

(3) 打开DHT11后,需要等待1秒才能克服不稳定状态。在此期间,您无需查找上电后尝试读取的指令或返回的温湿度值。 1秒后温湿度值恢复正常。

(4) 电源引脚(VDD、GND)之间可加一个100nF的电容,用于去耦滤波。

DHT11和DHT21的时序基本相同。我们以DHT11时序图为例进行分析。

d91d3693453647a0bf1a578cd7c02c73~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=INWAwdfyKABipbdk4JtgL5dxCl0%3D 5401fad1e4a04eeb9d476e7306774feb~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=ob9dOOs8naeeJD79ZYVZCLnD15E%3D注:

DHT11和DHT21的主线下拉时间不同。 DHT11 主机(MCU)将其拉低至少18ms,DHT21 主机(MCU)将其拉低至少500us,以实现程序兼容性。总线保持低电平25ms,以确保DHT11 和DHT21 驱动程序编程兼容。

DHT11总线驱动流程:

1、MCU发送启动信号

总线空闲状态为高电平,主机将总线拉低并等待DHT11 响应。

连接到MCU 的SDA 数据引脚设置为输出模式。

主机将总线保持在低电平至少18ms,然后保持高电平20-40us,等待DHT 返回响应信号。

2. 读取DHT11响应

SDA 数据引脚设置为输入模式。

DHT11 检测到启动信号后,会将总线拉低80 s,然后拉高80 s 作为响应。

3、DHT11传输40位数据

消息:

待发送的数据从上往下按顺序发送。

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

双氢睾酮11

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

双氢睾酮21

数据格式: 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

关于嵌入式物联网,有很多东西需要学习。如果你不学错路线或者内容,你的工资就会增加。

免费共享约150GB的数据包。学习内容、访谈和项目都相对较新且充实。在线购买某些鱼估计至少要花费几十美元。

点此寻找助手,0元领取:嵌入式物联网学习资料(今日头条)

23d088ddd3a04f3f9a5cb18d52f383f6~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=9%2F7E3hZ0zNpV%2B15bG7zTULqfGts%3D 二进制温度数据0000 0001 0101 1111==转换为十进制:351,除以10即可得到温度值。

温度=35.1

当温度低于0C时,最高温度数据为1。

例:-10.1表示为1000 0000 0110 0101。

注:DHT21 的温湿度数据为16 位,DHT11 的数据为8 位,因此虽然两者时序相同,但无法使用相同的数据类型进行计算。

/** * @brief 读取40位数据* @param none. * @retval 1表示读取成功,0表示读取失败。 */int DHT11_ReadData(void){ unsigned int T_H, T_L, H_H, H_L,check; //设置IO为输出模式DHT_Set_Output() //1. MCU发送脉冲至少18ms。 20~40us之间高电平//设置IO口为输入模式DHT_Set_Input(); //2.读取DHT11响应if(DHT_ReadBit()==Bit_RESET) { //80us低电平cout=1 wait.DHT_ReadBit() cout++); //等待80us高电平cout=1; //3 DHT11发送40位数据//读取8位湿度整数数据H_H=DH21_ReadByte(); ); //读取8位温度整数数据T_H=DH21_ReadByte(); //读取8位温度小数数据T_L=DH21_ReadByte(); //8位校验和Read=DH21_ReadByte();有效,如果有效,则将数据保存到全局结构变量中以供以后使用if(Check==(H_H + H_L + T_H + T_L)) { DHT11.Hum_H=H_H ; DHT11.Hum_L=H_L; T_L; return 1; } else { return 0; } return 0;} 读取40 位数据的函数DH21_ReadByte( ) 对于段(8bit)数据,包含1bit 数据是否为0 的判断规则或1。

数据'0'或'1'判断规则:

位数据“0”的格式为低电平50微秒,高电平2628微秒。

位数据“1”的格式为50微秒低电平和70微秒高电平。

计时流程:

1.等待50us低电平结束

接收数据时的低电平时间是因为位数据是0还是1取决于低电平后的高电平时间。

如果你不关心低电平时间,你可以简化你的程序,等待低电平先过去。

2、确定数据拉高后30us的数据总线电平的高低。

等待数据线变高后有30us的延迟。由于30us大于28us且小于70us,所以我们检查此时数据线是否为高电平,如果为高电平,则判断数据为高电平。 1,否则为0。

241e16bbffcb48f4a3815c84b653fcae~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=bem19sYWN3MA%2FT%2Fnp7xA9zB3lak%3D 位数据“0”判断图

24669f7fc58e42acbf3eace20378a900~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720732167&x-signature=4fkiPa7HXhidSR%2BW%2BumzbQM2FxY%3D 位数据“1”判断图

该函数的具体实现如下。

/** * @brief 读取8位数据。 * 没有@retval。 */int DH21_ReadByte(void){ int data=0; i++) { //1.等待50us直到低电平结束。 cout=1; while(!DHT_ReadBit() cout++); //2.数据拉高后,//判断IO后的数据总线电平。 30us 延迟Port Status Delay_us(30); //先移位最后一个数据,然后保存该数据位。 data=data 1; if(DHT_ReadBit()==Bit_SET) { data |=1; } //等待低电平输入,进入下一位数据接收cout=1; } 读取数据return ;}

处理40位数据,得到温湿度数据。

/** * @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返回(DHT11.Hum_H*10 + DHT11.Hum_L);

上述函数得到的数据是实际温湿度值放大10倍的值。使用函数时,必须将函数的返回值除以10 以确定实际值。

欢迎关注

原作者:从0到1嵌入

原标题:DHT11和DHT21温湿度传感器时序图分析(STM32)

原文链接:https://mp.weixin.qq.com/s/Vm8Vd6pAPwoTf-qAj03ECg

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢