一、SHT40 简介
SHT40 是由 Sensirion 推出的一款高精度数字温湿度传感器,采用紧凑型封装和低功耗设计,能够同时测量环境温度与相对湿度,并通过I²C接口输出校准后的数字信号;其具有响应速度快、长期稳定性好、抗污染能力强等特点,广泛应用于智能家居、物联网设备以及工业环境监测等场景。
二、引脚功能
| 引脚 | 功能 |
|---|---|
| GND | 电源地 |
| VIN | 电源正 |
| SCL | IIC时钟线 |
| SDA | IIC数据线 |
三、指令介绍
测量指令
| 命令 | 精度 | 特点 |
|---|---|---|
| 0xFD | 高精度 | 最准确,耗时最长 |
| 0xF6 | 中精度 | 平衡性能 |
| 0xE0 | 低精度 | 最快、最低功耗 |
加热器指令
| 功率 | 1 s | 0.1 s |
|---|---|---|
| 200 mW | 0x39 | 0x32 |
| 110 mW | 0x2F | 0x24 |
| 20 mW | 0x1E | 0x15 |
SHT40 的指令体系非常简洁:通过单字节指令选择测量精度、读取信息、执行复位或启用加热功能,正常环境下加热功能不用启动,当环境湿度较大、传感器有水雾时合理启用。
四、IIC时序与数据说明
时序说明
起始信号-->写地址-->接收应答-->发送指令-->接收应答-->停止信号
起始信号-->读地址-->接收应答-->接收温度数据高位-->发送应答-->接收温度数据低位-->发送应答-->接收CRC-->发送应答-->接收湿度数据高位-->发送应答-->接收湿度数据低位-->发送应答-->接收CRC-->发送非应答-->停止信号
SHT40不像大部分IIC设备需要读写寄存器,直接发送测量指令,然后读取数据既可。
数据说明
I²C 通信以 8 位(1字节)为单位,每 2 个数据字节后跟 1 个 CRC 校验字节,传感器每次测量返回 6 字节数据,顺序是固定的,即: 温度 MSB ,温度 LSB,温度 CRC,湿度 MSB,湿度 LSB,湿度 CRC
转换公式
SHT40输出的温度 (2字节) 与湿度 (2字节) 数据,可通过上图公式转化
CRC 校验机制
每 2 字节数据(16-bit)对应 1 个 CRC,主机收到数据后,可以对前两个字节根据公式计算 CRC,与传感器返回的 CRC 对比校验,用于判断数据是否正确
五、程序
SHT40.C
#include "stm32f10x.h"
#include "MyI2C.h"
#include "Delay.h"
#define SHT40_W 0x88
#define SHT40_R 0x89
uint16_t temp=0;
uint16_t humi=0;
//Command:0xFD(高精度测量) 0xF6(中精度测量) 0xE0(低精度测量)
void SHT40_Read(uint8_t Command)
{
MyI2C_Start(); //起始信号
MyI2C_SendByte(SHT40_W); //发送写地址
MyI2C_ReceiveAck(); //接收应答 未作处理
MyI2C_SendByte(Command); //发送命令
MyI2C_ReceiveAck(); //接收应答 未作处理
MyI2C_Stop(); //停止信号
Delay_ms(100);
MyI2C_Start(); //起始信号
MyI2C_SendByte(SHT40_R); //发送读地址
MyI2C_ReceiveAck(); //接收应答 未作处理
temp = MyI2C_ReceiveByte(); //接收温度数据
MyI2C_SendAck(0); //发送应答
temp = (temp << 8) | (MyI2C_ReceiveByte()); //接收温度数据
MyI2C_SendAck(0); //发送应答
MyI2C_ReceiveByte(); //接收CRC 未作处理
MyI2C_SendAck(0); //发送应答
humi = MyI2C_ReceiveByte(); //接收湿度数据
MyI2C_SendAck(0); //发送应答
humi = (humi << 8) | (MyI2C_ReceiveByte()); //接收温度数据
MyI2C_SendAck(0); //发送应答
MyI2C_ReceiveByte(); //接收CRC 未作处理
MyI2C_SendAck(1); //发送非应答
MyI2C_Stop(); //停止信号
}
float SHT40_Convert_Temp(void)
{
return (-45 + 175 * ((float)temp / 65535.0));
}
float SHT40_Convert_Humi(void)
{
return (-6 + 125 * ((float)humi / 65535.0));
}
main.C
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "SHT40.h"
#include "MyI2C.h"
float Temp=0;
float Humi=0;
int main(void)
{
Delay_ms(1000);//上电延时
MyI2C_Init();
OLED_Init();
while(1)
{
SHT40_Read(0xFD);//0xFD(高精度测量) 0xF6(中精度测量) 0xE0(低精度测量)
Temp = SHT40_Convert_Temp();
Humi = SHT40_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(700);
}
}
六、实验现象
----------------------------------------------------OLED接线-----------------------------------
SCL-----PB8
SDA-----PB9
----------------------------------------------------SHT40接线----------------------------------
SCL-----PB10
SDA-----PB11
室内温湿度数据
手捂住传感器温湿度
模块湿度变化速度较快,温度变化速度较慢,需等待一定的缓冲时间
以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱