diff --git a/Drivers/MS5607/ms5607.c b/Drivers/MS5607/ms5607.c index c3bde7f..4b30ff8 100644 --- a/Drivers/MS5607/ms5607.c +++ b/Drivers/MS5607/ms5607.c @@ -33,15 +33,24 @@ void MS56XX_Init(void) MS56XX_Read_PromData(MS56XX_C_Value); } -static uint32_t MS56XX_ReadD1_Press(void) +static HAL_StatusTypeDef MS56XX_ReadD1_Press(uint32_t *D1_Value) { uint8_t D1_Value_Buff[3] = {0xFF, 0xFF, 0xFF}; uint8_t _cmd[] = {0x48}; uint8_t _addr[] = {0x00}; - HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } osDelay(20); - HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); - HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff); + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D1_Value_Buff, 3, 0xff) != HAL_OK) + { + return HAL_ERROR; + } uint32_t press; press = D1_Value_Buff[0]; @@ -49,18 +58,28 @@ static uint32_t MS56XX_ReadD1_Press(void) press += D1_Value_Buff[1]; press <<= 8; press += D1_Value_Buff[2]; - return press; + *D1_Value = press; + return HAL_OK; } -static uint32_t MS56XX_ReadD2_Temp(void) +static HAL_StatusTypeDef MS56XX_ReadD2_Temp(uint32_t *D2_Value_) { uint8_t D2_Value_Buff[3] = {0x00, 0x00, 0x00}; uint8_t _cmd[] = {0x58}; uint8_t _addr[] = {0x00}; - HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff); + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } osDelay(20); - HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff); - HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff); + if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _addr, 1, 0xff) != HAL_OK) + { + return HAL_ERROR; + } + if(HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, D2_Value_Buff, 3, 0xff) != HAL_OK) + { + return HAL_ERROR; + } uint32_t Temp; Temp = D2_Value_Buff[0]; @@ -68,13 +87,17 @@ static uint32_t MS56XX_ReadD2_Temp(void) Temp += D2_Value_Buff[1]; Temp <<= 8; Temp += D2_Value_Buff[2]; - return Temp; + *D2_Value_ = Temp; + return HAL_OK; } -static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //计算温度 +static HAL_StatusTypeDef MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //计算温度 { - uint32_t D2_Value = MS56XX_ReadD2_Temp(); //循环读取 D2 - + uint32_t D2_Value; + if(MS56XX_ReadD2_Temp(&D2_Value) != HAL_OK) //循环读取 D2 + { + return HAL_ERROR; + } // term_printf("D2:%d\r\n", D2_Value); if(D2_Value > (MS56XX_C_Value[5] * 256)) @@ -88,15 +111,23 @@ static void MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) // // term_printf("dT:%d\r\n", *dT); *MS56XX_Temp = 2000 + *dT * ((int32_t)MS56XX_C_Value[6]/8388608.0); //算出温度值的100倍,2001表示20.01° 公式TEMP =20°C + dT * TEMPSENS =2000 + dT * C6 / 2^23 + return HAL_OK; } -uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) //计算温度补偿压力 +static HAL_StatusTypeDef MS56XX_GetPressureTemp(float *Temp, float *Press) //计算温度补偿压力 { int32_t dT; int32_t MS56XX_Temperature; - uint32_t D1_Value = MS56XX_ReadD1_Press(); //循环读取 D1 + uint32_t D1_Value; + if(MS56XX_ReadD1_Press(&D1_Value) != HAL_OK) //循环读取 D1 + { + return HAL_ERROR; + } - MS56XX_GetTemperature(&dT, &MS56XX_Temperature);//读取dT,Temp + if(MS56XX_GetTemperature(&dT, &MS56XX_Temperature) != HAL_OK)//读取dT,Temp + { + return HAL_ERROR; + } // term_printf("TEMP:%d\r\n", MS56XX_Temperature); // term_printf("dT:%d\r\n", dT); @@ -145,28 +176,55 @@ uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press) // if(MS56XX_Temperature<-6000) { MS56XX_Temperature=-6000; - *Temp = ((float)MS56XX_Temperature)/100; - return 0; } if(MS56XX_Temperature>8500) { MS56XX_Temperature=8500; - *Temp = ((float)MS56XX_Temperature)/100; - return 0; } if(Tmp_Pressure<1000) { Tmp_Pressure=1000; - *Press = ((float)Tmp_Pressure)/100; - return 0; } if(Tmp_Pressure>120000) { Tmp_Pressure=120000; - *Press = ((float)Tmp_Pressure)/100; - return 0; } *Temp = ((float)MS56XX_Temperature)/100; *Press = ((float)Tmp_Pressure)/100; - return 1; + return HAL_OK; } + +static float calculateAverage(float arr[], int avgLength) { + float sum = 0; + + // 遍历数组(最多10个元素),收集非零值直到达到指定数量 + for (int i = 0; i < 10; ++i) { + sum += arr[i]; + } + + // 计算平均值并限制最大值 + float average = sum / avgLength; + return average; +} + +#define COLLECT_DATA_NUM 10 +HAL_StatusTypeDef MS56XX_GetPressure(float *Press) +{ + float temp_buff; + float pressure_buff[COLLECT_DATA_NUM] = {0}; + uint8_t ret_falt = 0; + for(uint8_t i = 0;i= COLLECT_DATA_NUM) + { + return HAL_ERROR; + } + *Press = calculateAverage( pressure_buff,COLLECT_DATA_NUM - ret_falt); + return HAL_OK; +} \ No newline at end of file diff --git a/Drivers/MS5607/ms5607.h b/Drivers/MS5607/ms5607.h index 6a96947..1da2607 100644 --- a/Drivers/MS5607/ms5607.h +++ b/Drivers/MS5607/ms5607.h @@ -8,11 +8,12 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "comm_types.h" +#include "cmsis_os.h" #define MS5607_ADDRESS 0x77<<1 void MS56XX_Init(void); -uint8_t MS56XX_GetPressureTemp (float *Temp, float *Press); +HAL_StatusTypeDef MS56XX_GetPressure(float *Press); #ifdef __cplusplus } diff --git a/Drivers/Sht3x/sht30.c b/Drivers/Sht3x/sht30.c index f9e7e7b..ab746aa 100644 --- a/Drivers/Sht3x/sht30.c +++ b/Drivers/Sht3x/sht30.c @@ -170,19 +170,19 @@ static float calculateAverage(float arr[], int avgLength) { * @retval */ #define COLLECT_DATA_NUM 10 -BOOL get_temp_humi_data(float* temdata, float* humidata) +HAL_StatusTypeDef get_temp_humi_data(float* temdata, float* humidata) { float collect_temdata[COLLECT_DATA_NUM] = {0}; float collect_humidata[COLLECT_DATA_NUM] = {0}; float tmp_temdata,tmp_humidata; - uint8_t ret_falt = 0;; + uint8_t ret_falt = 0; for(int i=0; i= -40) && (tmp_temdata.fValue <= 85), return FALSE, "sht30温度值校验失败"); -// AssertError((tmp_humidata.fValue >= 0) && (tmp_humidata.fValue <= 100), return FALSE, "sht30湿度值校验失败"); - if(tmp_temdata < -50) + if(tmp_temdata < -50.0) { -// tmp_temdata.fValue = -40; -// term_printf("sht30温度值校验失败"); -// return FALSE; - goto error_return; + tmp_temdata = -50.0; } - if(tmp_temdata > 125) + if(tmp_temdata > 125.0) { -// tmp_temdata.fValue = 125; -// term_printf("sht30温度值校验失败"); -// return FALSE; - goto error_return; + tmp_temdata = 125.0; } - if(tmp_humidata < 0) + if(tmp_humidata < 0.0) { -// tmp_humidata.fValue = 0; -// term_printf("sht30湿度值校验失败"); -// return FALSE; - goto error_return; + tmp_humidata = 0.0; } - if(tmp_humidata > 100) + if(tmp_humidata > 100.0) { -// tmp_humidata.fValue = 100; -// term_printf("sht3湿度值校验失败"); -// return FALSE; - goto error_return; + tmp_humidata = 100.0; } *temdata = tmp_temdata; *humidata = tmp_humidata; - //g_stTempHumiData.temp = tmp_temdata.fValue; - //g_stTempHumiData.humi = tmp_humidata.fValue; - return TRUE; + return HAL_OK; error_return: *temdata = 0; *humidata = 0; - return FALSE; + return HAL_ERROR; } #if 0 diff --git a/Drivers/Sht3x/sht30.h b/Drivers/Sht3x/sht30.h index c5fc1cd..15e7990 100644 --- a/Drivers/Sht3x/sht30.h +++ b/Drivers/Sht3x/sht30.h @@ -2,6 +2,7 @@ #define __SHT30_H_ #include "comm_types.h" +#include "main.h" #define SHT30 "SHT30" @@ -21,6 +22,6 @@ typedef struct _stTempHumiData{ extern stTempHumiData g_stTempHumiData; u_int8_t sht30_init(); -BOOL get_temp_humi_data(float* temdata, float* humidata); +HAL_StatusTypeDef get_temp_humi_data(float* temdata, float* humidata); //void TEST_read_sht30_value(); #endif diff --git a/Drivers/Tmp117/tmp117.c b/Drivers/Tmp117/tmp117.c index d033ba0..03cd9c4 100644 --- a/Drivers/Tmp117/tmp117.c +++ b/Drivers/Tmp117/tmp117.c @@ -1,5 +1,6 @@ #include "tmp117.h" #include "i2c.h" +#include "cmsis_os.h" // 初始化温度传感器 @@ -17,28 +18,60 @@ HAL_StatusTypeDef TMP117_Read(uint8_t reg, uint8_t *buffer) { I2C_MEMADD_SIZE_8BIT, buffer, 2, 100); } +static float calculateAverage(float arr[], int avgLength) { + float sum = 0; + + // 遍历数组(最多10个元素),收集非零值直到达到指定数量 + for (int i = 0; i < 10; ++i) { + sum += arr[i]; + } + + // 计算平均值并限制最大值 + float average = sum / avgLength; + return average; +} // 获取温度值(单位:℃) +#define COLLECT_DATA_NUM 10 HAL_StatusTypeDef TMP117_Get_Temp(float *temp) { uint8_t raw_data[2] = {0}; int16_t temp_raw; + uint8_t ret_falt = 0; + float ret_temp; + float temp_temp[COLLECT_DATA_NUM] = {0}; - if (HAL_OK == TMP117_Read(TMP117_TEMP_REG, raw_data)) { - temp_raw = (raw_data[0] << 8) | raw_data[1]; - *temp = temp_raw * 0.0078125f; + for(int i = 0; i= COLLECT_DATA_NUM) { *temp = 0; return HAL_ERROR; } - if(*temp <= -60) + + ret_temp = calculateAverage(temp_temp, COLLECT_DATA_NUM - ret_falt); + + if(ret_temp <= -60) { *temp = -60; - } - if(*temp >= 150) + }else if(ret_temp >= 150) { *temp = 150; + }else + { + *temp = ret_temp; } return HAL_OK; }