1、说明

(1)MCU为STM32F103C8,温湿度芯片为SHT30; (2)硬件连接:SHT30连接STM32的IIC1; (3)SHT30的ADDR脚连接地,因此其设备地址为:(0x44<<1),即0x88; (4)程序中使用HAL库,代码有CubeMX生成;

2、程序

驱动头文件:sht30.h
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef __SHT30_H_
#define __SHT30_H_

#include "stdbool.h"

#define SHT_ADDR (0x44<<1)

uint8_t sht30_init();

uint8_t sht30_sample(float *t, float *h);

#endif

驱动主文件:sht30.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "sht30.h"
#include "i2c.h"

//I2C写2字节命令
uint8_t i2c_write_cmd(uint16_t cmd)
{
uint8_t cmd_buff[2];
cmd_buff[0] = cmd>>8;
cmd_buff[1] = cmd;

return HAL_I2C_Master_Transmit(&hi2c1,SHT_ADDR,cmd_buff,2,0xffff);
}

//CRC校验计算
#define CRC8_POLYNOMIAL 0x31
uint8_t CheckCrc8(uint8_t* message, uint8_t initial_value)
{
uint8_t remainder;
uint8_t i = 0, j = 0;

remainder = initial_value;

for(j = 0; j < 2;j++)
{
remainder ^= message[j];

for (i = 0; i < 8; i++)
{
if (remainder & 0x80)
{
remainder = (remainder << 1)^CRC8_POLYNOMIAL;
}
else
{
remainder = (remainder << 1);
}
}
}
return remainder;
}

//初始化代码
uint8_t sht30_init()
{
//soft reset
i2c_write_cmd(0x30a2);
HAL_Delay(25);

return i2c_write_cmd(0x2220);//repeat medium_2
}

//read temp&humi from sensor
//1-ERR
//0-OK
uint8_t sht30_sample(float *t, float *h)
{
uint8_t read_buff[6] = {0};

uint16_t temp_value;
uint16_t humi_value;

i2c_write_cmd(0xe000);//read for period mode

//read value
if(HAL_I2C_Master_Receive(&hi2c1,SHT_ADDR0x01,read_buff,6,0xffff) != HAL_OK)
{
return HAL_ERROR;
}

//check crc
if(CheckCrc8(read_buff, 0xFF) != read_buff[2] CheckCrc8(&read_buff[3], 0xFF) != read_buff[5])
{
return HAL_ERROR;
}

//translate
temp_value = ((uint16_t)read_buff[0]<<8)read_buff[1];
*t = -45 + 175*((float)temp_value/65535);

humi_value = ((uint16_t)read_buff[3]<<8)read_buff[4];
*h = 100 * ((float)humi_value / 65535);

return HAL_OK;
}


主文件进行调用:
  • 初始化
1
sht30_init();
  • 获取数据
1
2
3
4
5
6
7
sht30_sample(&temp, &humi);

char tempstr[6] = {0};
char humistr[6] = {0};
sprintf(tempstr, "%.2f", temp);
sprintf(humistr, "%.2f", humi);
SEGGER_RTT_printf(0, "temp:%s, humi:%s\r\n", tempstr, humistr);

注:这里SEGGER_RTT_printf 不支持float打印,因此用sprintf将float转换为char数组即可显示。

显示结果

获取数据如下(用手接触SHT30后温读明显升高): SHT30温湿度