一、HTU20D 简介

HTU20D 是一款基于 I²C 接口的数字温湿度传感器,集成了温度与相对湿度测量功能,内部已完成信号调理与校准,能够直接输出高精度数字数据。它工作电压范围宽、功耗低、体积小,适合嵌入式系统使用,常见于环境监测、智能家居、气象设备等场景。
在这里插入图片描述

二、引脚功能

引脚 功能
- 电源地
+ 电源正
CL IIC时钟线
DA IIC数据线

三、指令与寄存器

指令

Command Code 说明
Trigger Temperature Measurement 0xE3 温度测量(Hold Master
Trigger Humidity Measurement 0xE5 湿度测量(Hold Master
Trigger Temperature Measurement 0xF3 温度测量(No Hold Master
Trigger Humidity Measurement 0xF5 湿度测量(No Hold Master
Write User Register 0xE6 写用户寄存器
Read User Register 0xE7 读用户寄存器
Soft Reset 0xFE 软复位

用户寄存器

在这里插入图片描述
用户寄存器参数默认即可

四、IIC时序与数据

时序说明

HTU20D(F) 传感器支持两种通信模式:Hold Master 模式和No Hold Master 模式。

在第一种模式(Hold Master)中,传感器在测量过程中会控制并拉低 SCK 时钟线,从而阻塞通信;
而在第二种模式(No Hold Master)中,在传感器进行测量时,SCK 时钟线保持释放状态,总线可以用于其他通信。

No Hold Master 模式允许在 HTU20D(F) 进行测量时,I²C 总线继续处理其他通信任务。

在 Hold Master 模式下,HTU20D(F) 在测量期间会拉低 SCK 线,使主机进入等待状态。当测量完成后,传感器释放 SCK 线,表示内部处理完成,可以继续通信。

在 No Hold Master 模式下,MCU 需要轮询传感器,以判断内部测量是否完成。具体方法是:
MCU 发送一个起始信号(Start),随后发送 I²C 读地址

如果测量已经完成,HTU20D(F) 会返回 ACK,MCU 可以继续读取数据
如果测量尚未完成,HTU20D(F) 会返回 NACK,此时 MCU 需要重新发送 Start +读地址 再次查询

对于这两种模式,由于测量的最大分辨率为 14 位,数据的最低 2 位(LSB)用于状态信息:
Bit1:表示测量类型
0 → 温度
1 → 湿度
Bit0:当前未使用(保留位)

No Hold Master 时序

在这里插入图片描述
本次测试采用的是 No Hold Master 模式,需发送 0xF3 0xF5 测量命令;配置寄存器参数默认,则温度14位分辨率,湿度12位分辨率,根据手册得知温度转化时间 max 16ms ,湿度转化时间 max 50ms,故转化延时需大于 50ms 。

    MyI2C_Start();//起始信号
	MyI2C_SendByte(HTU20D_W);//发送写地址
	MyI2C_ReceiveAck();//接收应答 未作处理
	MyI2C_SendByte(Command);//发送命令
	MyI2C_ReceiveAck();//接收应答 未作处理
	Delay_ms(150);//等待测量 
	MyI2C_Start();//起始信号
	MyI2C_SendByte(HTU20D_R);//发送读地址
	while(MyI2C_ReceiveAck())//判断测量完成与否
	{
		Delay_ms(50);
		MyI2C_Start();
		MyI2C_SendByte(HTU20D_R);
	}
 	Data = MyI2C_ReceiveByte();//接收高位数据
	MyI2C_SendAck(0);//发送应答
	Data = (Data << 8) | (MyI2C_ReceiveByte());//接收低位数据
	MyI2C_SendAck(1);//发送非应答,舍弃检验数据 CRC
	MyI2C_Stop();//停止信号

Hold Master 时序

在这里插入图片描述

数据说明

由于数据帧 Data(LSB ) 最后两位为状态位,进行数据计算转换前需置0,CRC检验本文未使用舍弃了该帧未接收

转换公式
在这里插入图片描述

五、程序

HTU20D .C

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"
#include "Delay.h"
#define HTU20D_W 0x80
#define HTU20D_R 0x81
#define Temp_Command 0xF3  //No Hold master
#define Humi_Command 0xF5  //No Hold master
uint16_t HTU20D_Read(uint8_t Command)
{
	uint16_t Data;

	MyI2C_Start();										            //起始信号
	MyI2C_SendByte(HTU20D_W);							        //发送写地址
	MyI2C_ReceiveAck();								            //接收应答 未作处理
	MyI2C_SendByte(Command);				     	        //发送命令
	MyI2C_ReceiveAck();								            //接收应答 未作处理
	
	Delay_ms(150);									              //等待测量 
	
	MyI2C_Start();										            //起始信号
	MyI2C_SendByte(HTU20D_R);							        //发送读地址
	while(MyI2C_ReceiveAck())						    	    //判断测量完成与否
	{
		Delay_ms(50);
		MyI2C_Start();
		MyI2C_SendByte(HTU20D_R);
	}
 	Data = MyI2C_ReceiveByte();                   //接收高位数据
	MyI2C_SendAck(0);					      			        //发送应答
	Data = (Data << 8) | (MyI2C_ReceiveByte());   //接收低位数据
	MyI2C_SendAck(1);					      			        //发送非应答,舍弃检验数据
	MyI2C_Stop();                                 //停止信号
	
	return Data;
}
float HTU20D_Convert_Temp(void)
{
	uint16_t  temp;
	temp = HTU20D_Read(Temp_Command);
	temp &= 0xFFFC;
	return  (-46.85 + 175.72 * ((float)temp / 65536.0));
}
float HTU20D_Convert_Humi(void)
{
	uint16_t  humi;
	humi = HTU20D_Read(Humi_Command);
	humi &= 0xFFFC;
	return (-6 + 125 * ((float)humi / 65536.0));
}

main.C

#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "HTU20D.h"
#include "MyI2C.h"
float  Temp=0;
float  Humi=0;
int main(void)
{
	Delay_ms(1000);//上电延时
	MyI2C_Init();
	OLED_Init();
	while(1)
	{
		Temp = HTU20D_Convert_Temp();
		Delay_ms(200);
		Humi = HTU20D_Convert_Humi();
		OLED_ShowSignedNum(1,2,Temp,2);OLED_ShowChar(1,5,'.');OLED_ShowNum(1,6,(Temp-(int)Temp)*100,2);OLED_ShowChar(1,8,0x43);
		OLED_ShowSignedNum(2,2,Humi,2);OLED_ShowChar(2,5,'.');OLED_ShowNum(2,6,(Humi-(int)Humi)*100,2);OLED_ShowChar(2,8,0x25);
		Delay_ms(500);
	}
}

六、实验现象

----------------------------------------------------OLED接线------------------------------------------------------
SCL-----PB8
SDA-----PB9
---------------------------------------------------HTU20D 接线--------------------------------------------------
SCL-----PB10
SDA-----PB11

室内温湿度数据

在这里插入图片描述

手握捏住传感器温湿度

在这里插入图片描述

模块湿度变化速度较快,温度变化速度较慢,需等待一定的缓冲时间

以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐