STM32 驱动 HTU20D 温湿度测量
HTU20D是一款基于I²C接口的数字温湿度传感器,具有宽工作电压、低功耗和小体积的特点,适用于环境监测和智能家居等场景。传感器支持Hold Master和No Hold Master两种通信模式,通过不同的指令(如0xF3、0xF5)触发温湿度测量,并采用14位(温度)和12位(湿度)分辨率输出数据。实验使用No Hold Master模式,通过STM32读取数据并转换为实际温湿度值,最终在OL
文章目录
一、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
室内温湿度数据

手握捏住传感器温湿度

模块湿度变化速度较快,温度变化速度较慢,需等待一定的缓冲时间
以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱
更多推荐



所有评论(0)