WLE5CC_NODE_STS/STS/RC/sht3x.c

170 lines
4.8 KiB
C
Raw Blame History

//-- 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;
}