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