170 lines
4.8 KiB
C
170 lines
4.8 KiB
C
//-- Includes -----------------------------------------------------------------
|
||
#include "sht3x.h"
|
||
//-- Defines ------------------------------------------------------------------
|
||
// Generator polynomial for CRC
|
||
#define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
|
||
|
||
static uint8_t SHT3x_Send_Data(SHT3x_CMD cmd);
|
||
static uint8_t SHT3x_Readout_Data(uint8_t *receive_original_data);
|
||
|
||
static float SHT3X_CalcTemperature(uint16_t rawValue);
|
||
static float SHT3X_CalcHumidity(uint16_t rawValue);
|
||
|
||
SHT3x_ReadData SHT3x_Data = {0.0, 0.0};
|
||
extern I2C_HandleTypeDef hi2c2;
|
||
#define I2Cx hi2c2
|
||
/**
|
||
* @function: static uint8_t SHT3x_Send_Data(SHT3x_CMD cmd)
|
||
* @description: SHT3x发送数据
|
||
* @param {SHT3x_CMD}cmd待发送的指令数据
|
||
* @return {0}发送成功
|
||
* @return {1}发送失败
|
||
*/
|
||
static uint8_t SHT3x_Send_Data(SHT3x_CMD cmd)
|
||
{
|
||
uint8_t cmd_buf[2];
|
||
cmd_buf[0] = cmd >> 8;
|
||
cmd_buf[1] = cmd;
|
||
#if SHT3X_USING_HARDWARE_I2C
|
||
if (HAL_I2C_IsDeviceReady(&I2Cx, SHT3X_ADDRESS, 100, 1000))
|
||
return 1;
|
||
if (HAL_I2C_Master_Transmit(&I2Cx, SHT3X_ADDRESS, cmd_buf, 2, HAL_MAX_DELAY))
|
||
return 1;
|
||
return 0;
|
||
#endif
|
||
|
||
}
|
||
|
||
/**
|
||
* @function: uint8_t SHT3x_Soft_Reset(void)
|
||
* @description: SHT3x软件复位
|
||
* @param {*}
|
||
* @return {0}发送成功
|
||
* @return {1}发送失败
|
||
*/
|
||
uint8_t SHT3x_Soft_Reset(void)
|
||
{
|
||
if (SHT3x_Send_Data(SOFT_RESET))
|
||
return 1;
|
||
SHT3x_Delay_ms(10);
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* @function: uint8_t SHT3x_Init_Measurement_Mode(SHT3x_CMD Mode)
|
||
* @description: SHT3x测量模式设置
|
||
* @param {SHT3x_CMD} Mode
|
||
* @return {0}发送成功
|
||
* @return {1}发送失败
|
||
*/
|
||
uint8_t SHT3x_Init_Measurement_Mode(SHT3x_CMD Mode)
|
||
{
|
||
if (SHT3x_Send_Data(Mode))
|
||
return 1;
|
||
return 0;
|
||
SHT3x_Delay_ms(20);
|
||
}
|
||
|
||
/**
|
||
* @function: static uint8_t SHT3x_Readout_Data(uint8_t *receive_original_data)
|
||
* @description: 从SHT3x周期模式读取数据
|
||
* @param {uint8_t} *receive_original_data读取的数据6byte
|
||
* @return {0}发送成功
|
||
* @return {1}发送失败
|
||
*/
|
||
static uint8_t SHT3x_Readout_Data(uint8_t *receive_original_data)
|
||
{
|
||
#if SHT3X_USING_HARDWARE_I2C
|
||
if (HAL_I2C_IsDeviceReady(&I2Cx, SHT3X_ADDRESS, 100, 1000))
|
||
return 2;
|
||
SHT3x_Send_Data(FETCH_DATA_PERIODIC);
|
||
SHT3x_Delay_ms(20);
|
||
if (HAL_I2C_Master_Receive(&I2Cx, SHT3X_ADDRESS, receive_original_data, 6, HAL_MAX_DELAY))
|
||
return 1;
|
||
return 0;
|
||
#endif
|
||
}
|
||
|
||
/**
|
||
* @function: uint8_t SHT3x_Get_TemperatureHumidity(void)
|
||
* @description: SHT3x温湿度读取
|
||
* @param {*}
|
||
* @return {0}发送成功
|
||
* @return {1}发送失败
|
||
*/
|
||
uint8_t SHT3x_Get_TemperatureHumidity(float *temperature, float *humidity)
|
||
{
|
||
uint8_t raw_data[6];
|
||
uint16_t raw_temperature = 0;
|
||
uint16_t raw_humidity = 0;
|
||
SHT3x_Readout_Data(raw_data);
|
||
if (CRC8_Calculation(raw_data, 0xFF) != raw_data[2] ||
|
||
CRC8_Calculation(&raw_data[3], 0xFF) != raw_data[5])
|
||
return 1;
|
||
// /*温度转换*/
|
||
raw_temperature = ((uint16_t)raw_data[0] << 8) | raw_data[1];
|
||
|
||
// Temperature = -49 + 315 * ((float)original_temperature / 65535);//华氏度°F
|
||
//*temperature = (int)(-45.0 + (float)175.0 * ((float)raw_temperature / 65535)); //摄氏度°C
|
||
*temperature = SHT3X_CalcTemperature(raw_temperature);
|
||
/*湿度转换*/
|
||
raw_humidity = ((uint16_t)raw_data[3] << 8) | raw_data[4];
|
||
//SHT3x_Data.SHT3x_Humidity = 100 * ((float)original_humidity / 65535);
|
||
//*humidity = (int)(100.0 * ((float)raw_humidity / 65535));
|
||
*humidity = SHT3X_CalcHumidity(raw_humidity);
|
||
return 0;
|
||
}
|
||
|
||
|
||
//-----------------------------------------------------------------------------
|
||
static float SHT3X_CalcTemperature(uint16_t rawValue)
|
||
{
|
||
// calculate temperature [<5B>C]
|
||
// T = -45 + 175 * rawValue / (2^16-1)
|
||
return (float)(175.0f * (float)rawValue / 65535.0f - 45.0f);
|
||
}
|
||
|
||
//-----------------------------------------------------------------------------
|
||
static float SHT3X_CalcHumidity(uint16_t rawValue)
|
||
{
|
||
// calculate relative humidity [%RH]
|
||
// RH = rawValue / (2^16-1) * 100
|
||
return (float)(100.0f * (float)rawValue / 65535.0f);
|
||
}
|
||
/**
|
||
* @function: uint8_t CRC8_Calculation(uint8_t *const message, uint8_t initial_value)
|
||
* @description: CRC8的校验计算
|
||
* @param {uint8_t} *const message带校验数据信息
|
||
* @param {uint8_t} initial_value设定初值0xFF
|
||
* @return {uint8_t}remainder计算的CRC码
|
||
*/
|
||
uint8_t CRC8_Calculation(uint8_t *const message, uint8_t initial_value)
|
||
{
|
||
const uint8_t CRC8_POLYNOMIAL = 0x31;
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
/* 返回计算的CRC码 */
|
||
return remainder;
|
||
}
|
||
|
||
|
||
|