STM32 驱动 SHT40 温湿度测量

0 阅读4分钟

一、SHT40 简介

SHT40 是由 Sensirion 推出的一款高精度数字温湿度传感器,采用紧凑型封装和低功耗设计,能够同时测量环境温度与相对湿度,并通过I²C接口输出校准后的数字信号;其具有响应速度快、长期稳定性好、抗污染能力强等特点,广泛应用于智能家居、物联网设备以及工业环境监测等场景。

在这里插入图片描述

二、引脚功能

引脚功能
GND电源地
VIN电源正
SCLIIC时钟线
SDAIIC数据线

三、指令介绍

在这里插入图片描述

测量指令

命令精度特点
0xFD高精度最准确,耗时最长
0xF6中精度平衡性能
0xE0低精度最快、最低功耗

加热器指令

功率1 s0.1 s
200 mW0x390x32
110 mW0x2F0x24
20 mW0x1E0x15

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

室内温湿度数据 在这里插入图片描述

手捂住传感器温湿度

在这里插入图片描述 模块湿度变化速度较快,温度变化速度较慢,需等待一定的缓冲时间

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