Compare commits

...

7 Commits

11 changed files with 442 additions and 115 deletions

View File

@ -20,6 +20,8 @@
#define ADC_GAIN_ENABLE 190
#define ADC_GAIN_DISABLE 1900
#define K_128 0xA12EE1FE #define K_128 0xA12EE1FE
// 延时REV_MUTE_DELAY us启动ADC采集数据 // 延时REV_MUTE_DELAY us启动ADC采集数据

View File

@ -10,6 +10,7 @@
#include "FIR.h" #include "FIR.h"
#include "LowPassFilter.h" #include "LowPassFilter.h"
#include "encrypt.h" #include "encrypt.h"
#include "ms5607.h"
#define AVE_TIME 600 //滑动平均时间最大600 #define AVE_TIME 600 //滑动平均时间最大600
#define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数 #define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数
@ -93,30 +94,30 @@ void config_adc_gain(uint8_t channel, uint16_t max_val)
switch(channel) switch(channel)
{ {
case 0x01: case 0x01:
if(max_val <= 180) if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_s = 1; gain_status.gain_status_s = 1;
else if(max_val >= 1900) else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_s = 0; gain_status.gain_status_s = 0;
break; break;
case 0x02: case 0x02:
if(max_val <= 180) if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_n = 1; gain_status.gain_status_n = 1;
else if(max_val >= 1900) else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_n = 0; gain_status.gain_status_n = 0;
break; break;
case 0x03: case 0x03:
if(max_val <= 180) if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_e = 1; gain_status.gain_status_e = 1;
else if(max_val >= 1900) else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_e = 0; gain_status.gain_status_e = 0;
break; break;
case 0x04: case 0x04:
if(max_val <= 180) if(max_val <= ADC_GAIN_ENABLE)
gain_status.gain_status_w = 1; gain_status.gain_status_w = 1;
else if(max_val >= 1900) else if(max_val >= ADC_GAIN_DISABLE)
gain_status.gain_status_w = 0; gain_status.gain_status_w = 0;
break; break;
@ -1067,22 +1068,33 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
//采集温度,湿度,大气压 //采集温度,湿度,大气压
static void getTempHumiPress(void) static void getTempHumiPress(void)
{ {
//采集备用温度与大气压
float backupTemperature1; float backupTemperature1;
float backupTemperature2; //采集MS5607并判错
uint8_t hp203_ret = get_HP203_data(&backupTemperature1, &g_stMcs_Para.pressure); if(MS56XX_GetPressure(&g_stMcs_Para.pressure) != HAL_OK)
uint8_t sht30_ret = get_temp_humi_data(&backupTemperature2, &g_stMcs_Para.humidity); {
#if TEMP_SENSOR == SHT30_SENSOR //置错误标志位
g_stMcs_Para.temperature = backupTemperature2; g_error_log.temp_error_HP203B = 1;
#endif /*TEMP_SENSOR == SHT30_SENSOR*/ //错误处理
}
#if TEMP_SENSOR == TMP117_SENSOR else
TMP117_Init(); {
osDelay(20); //恢复错误标志位
uint8_t tmp117_ret = TMP117_Get_Temp(&g_stMcs_Para.temperature); g_error_log.temp_error_HP203B = 0;
}
// TMP117出问题 //采集SHT45并判错
if(tmp117_ret != HAL_OK) if(get_temp_humi_data(&backupTemperature1, &g_stMcs_Para.humidity) != HAL_OK)
{
//错误处理
//置错误标志位
g_error_log.temp_error_SHT30 = 1;
}
else
{
//恢复错误标志位
g_error_log.temp_error_SHT30 = 0;
}
//采集TMP117并判错
if(TMP117_Get_Temp(&g_stMcs_Para.temperature) != HAL_OK)
{ {
//置错误标志位 //置错误标志位
g_error_log.temp_error_TMP117 = 1; g_error_log.temp_error_TMP117 = 1;
@ -1094,36 +1106,6 @@ static void getTempHumiPress(void)
//恢复错误标志位 //恢复错误标志位
g_error_log.temp_error_TMP117 = 0; g_error_log.temp_error_TMP117 = 0;
} }
#endif /*TEMP_SENSOR == TMP117_SENSOR*/
// SHT30出问题
if(sht30_ret == FALSE)
{
//置错误标志位
g_error_log.temp_error_SHT30 = 1;
//错误处理
#if TEMP_SENSOR == SHT30_SENSOR
g_stMcs_Para.temperature = backupTemperature1;
#endif /*TEMP_SENSOR == SHT30_SENSOR*/
}
else
{
//恢复错误标志位
g_error_log.temp_error_SHT30 = 0;
}
//HP203B出问题
if(hp203_ret == FALSE)
{
//置错误标志位
g_error_log.temp_error_HP203B = 1;
//错误处理
}
else
{
//恢复错误标志位
g_error_log.temp_error_HP203B = 0;
}
} }
void tem_hum_update_task(void const * argument) void tem_hum_update_task(void const * argument)
@ -1132,9 +1114,11 @@ void tem_hum_update_task(void const * argument)
uint16_t time_s_temp_humi = 0;//1秒计时温湿度更新 uint16_t time_s_temp_humi = 0;//1秒计时温湿度更新
// 开机先采集一次大气压温湿度 // 开机先采集一次大气压温湿度
MS56XX_Init();
if(tem_hun_check_flag) if(tem_hun_check_flag)
{ {
//采集温湿度与大气压 //采集温湿度与大气压
osDelay(10);//等待传感器初始化
getTempHumiPress(); getTempHumiPress();
} }

View File

@ -127,7 +127,7 @@ void MX_FREERTOS_Init(void) {
osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 2*1024);// ˇçË١çĎň osThreadDef(anemometer, wind_task, osPriorityHigh, 0, 2*1024);// ˇçË١çĎň
anemometerHandle = osThreadCreate(osThread(anemometer), NULL); anemometerHandle = osThreadCreate(osThread(anemometer), NULL);
osThreadDef(temhum_update_task, tem_hum_update_task, osPriorityAboveNormal, 0, 512);//温湿度,大气压更新 osThreadDef(temhum_update_task, tem_hum_update_task, osPriorityAboveNormal, 0, 1024);//温湿度,大气压更新
temhum_update_taskHandle = osThreadCreate(osThread(temhum_update_task), NULL); temhum_update_taskHandle = osThreadCreate(osThread(temhum_update_task), NULL);
// osThreadDef(sensorTask, SensorTask, osPriorityRealtime, 0, 128); // osThreadDef(sensorTask, SensorTask, osPriorityRealtime, 0, 128);

View File

@ -44,6 +44,7 @@
#include "sht30.h" #include "sht30.h"
#include "hp203b.h" #include "hp203b.h"
#include "tmp117.h" #include "tmp117.h"
#include "ms5607.h"
#include "inflash.h" #include "inflash.h"
/* USER CODE END Includes */ /* USER CODE END Includes */

230
Drivers/MS5607/ms5607.c Normal file
View File

@ -0,0 +1,230 @@
#include "ms5607.h"
#include "i2c.h"
#include "filter.h"
#include "anemometer_dev.h"
#include "uart_dev.h"
static void MS56XX_Reset(void)
{
uint8_t _cmd[] = {0x1e};
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
osDelay(5);
}
static void MS56XX_Read_PromData(uint16_t *VAL_C)
{
uint8_t _cmd[] = {0xa0};
uint8_t temp_buff[2] = {0};
for(uint8_t i = 0; i < 8; i++)
{
HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff);
HAL_I2C_Master_Receive(&hi2c3, MS5607_ADDRESS, temp_buff, 2, 0xff);
*(VAL_C + i) = temp_buff[0];
*(VAL_C + i) <<= 8;
*(VAL_C + i) += temp_buff[1];
_cmd[0] += 0x02;
}
}
static uint16_t MS56XX_C_Value[8] = {0};
void MS56XX_Init(void)
{
MS56XX_Reset();
MS56XX_Read_PromData(MS56XX_C_Value);
}
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};
if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK)
{
return HAL_ERROR;
}
osDelay(20);
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];
press <<= 8;
press += D1_Value_Buff[1];
press <<= 8;
press += D1_Value_Buff[2];
*D1_Value = press;
return HAL_OK;
}
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};
if(HAL_I2C_Master_Transmit(&hi2c3, MS5607_ADDRESS, _cmd, 1, 0xff) != HAL_OK)
{
return HAL_ERROR;
}
osDelay(20);
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];
Temp <<= 8;
Temp += D2_Value_Buff[1];
Temp <<= 8;
Temp += D2_Value_Buff[2];
*D2_Value_ = Temp;
return HAL_OK;
}
static HAL_StatusTypeDef MS56XX_GetTemperature (int32_t *dT, int32_t *MS56XX_Temp) //计算温度
{
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))
{
*dT = D2_Value - MS56XX_C_Value[5] * 256; //公式 dT = D2 - TREF = D2 - C5 * 2^8
}else
{
*dT = MS56XX_C_Value[5] * 256 - D2_Value; //公式 dT = D2 - TREF = D2 - C5 * 2^8
*dT *= -1;
}
// 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;
}
static HAL_StatusTypeDef MS56XX_GetPressureTemp(float *Temp, float *Press) //计算温度补偿压力
{
int32_t dT;
int32_t MS56XX_Temperature;
uint32_t D1_Value;
if(MS56XX_ReadD1_Press(&D1_Value) != HAL_OK) //循环读取 D1
{
return HAL_ERROR;
}
if(MS56XX_GetTemperature(&dT, &MS56XX_Temperature) != HAL_OK)//读取dTTemp
{
return HAL_ERROR;
}
// term_printf("TEMP:%d\r\n", MS56XX_Temperature);
// term_printf("dT:%d\r\n", dT);
// term_printf("TEMP:%d\r\n", MS56XX_Temperature);
int64_t OFF = ((int64_t)MS56XX_C_Value[2] * 131072) + ((int64_t)MS56XX_C_Value[4] * dT )/ 64.0; //公式 OFF = OFFT1 + TCO *dT = C2 *2^17 +(C4 *dT )/ 2^6
int64_t SENS = ((int64_t)MS56XX_C_Value[1] * 65536) + ((int64_t)MS56XX_C_Value[3] * dT )/ 128.0; //公式SENS = SENST1 + TCS* dT= C1 * 2^16 + (C3 * dT )/ 2^7
// term_printf("OFF:%d\r\n", OFF);
// term_printf("SENS:%d\r\n", SENS);
//温度补偿部分 逻辑看芯片手册
int64_t T2 = 0;
int64_t OFF2 = 0;
int64_t SENS2 = 0;
if (MS56XX_Temperature < 2000 ) // second order temperature compensation when under 20 degrees C
{
T2 = (dT * dT) / 2147483648.0;
OFF2 = 61 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) / 16;
SENS2 = 2 * ((MS56XX_Temperature - 2000) * (MS56XX_Temperature - 2000)) ;
if (MS56XX_Temperature < -1500)
{
OFF2 = OFF2 + 15 * ((MS56XX_Temperature + 1500) * (MS56XX_Temperature + 1500));
SENS2 = SENS2 + 8 * ((MS56XX_Temperature + 1500) * (MS56XX_Temperature + 1500));
}
}
// term_printf("T2:%d\r\n", T2);
MS56XX_Temperature = MS56XX_Temperature - T2;
OFF = OFF - OFF2;
SENS = SENS - SENS2;
int32_t Tmp_Pressure = ((int32_t)D1_Value * SENS/2097152 - OFF) / 32768; //公式 P = D1 * SENS - OFF = (D1 * SENS / 2^21 - OFF) / 2^15
// term_printf("\r\nC1-C6:%d %d %d %d %d %d\r\n", MS56XX_C_Value[1], MS56XX_C_Value[2], MS56XX_C_Value[3], MS56XX_C_Value[4], MS56XX_C_Value[5], MS56XX_C_Value[6]);
// term_printf("D1:%d\r\n", D1_Value);
//
// term_printf("dT:%d\r\n", dT);
//
// term_printf("OFF:%d\r\n", OFF);
// term_printf("SENS:%d\r\n", SENS);
// term_printf("P:%d\r\n", Tmp_Pressure);
// term_printf("TEMP:%d\r\n", MS56XX_Temperature);
// term_printf("PRESS:%d\r\n", Tmp_Pressure);
if(MS56XX_Temperature<-6000)
{
MS56XX_Temperature=-6000;
}
if(MS56XX_Temperature>8500)
{
MS56XX_Temperature=8500;
}
if(Tmp_Pressure<1000)
{
Tmp_Pressure=1000;
}
if(Tmp_Pressure>120000)
{
Tmp_Pressure=120000;
}
*Temp = ((float)MS56XX_Temperature)/100;
*Press = ((float)Tmp_Pressure)/100;
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;i++)
{
if(MS56XX_GetPressureTemp(&temp_buff, &pressure_buff[i]) != HAL_OK)
{
ret_falt++;
pressure_buff[i] = 0;
}
}
if(ret_falt >= COLLECT_DATA_NUM)
{
return HAL_ERROR;
}
*Press = calculateAverage( pressure_buff,COLLECT_DATA_NUM - ret_falt);
return HAL_OK;
}

22
Drivers/MS5607/ms5607.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef __MS5607_H__
#define __MS5607_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "comm_types.h"
#include "cmsis_os.h"
#define MS5607_ADDRESS 0x77<<1
void MS56XX_Init(void);
HAL_StatusTypeDef MS56XX_GetPressure(float *Press);
#ifdef __cplusplus
}
#endif
#endif /*__ __MS5607_H__ */

View File

@ -33,7 +33,7 @@ static u_int8_t i2c_write_cmd(u_int8_t addr,u_int16_t cmd)
cmd_buff[0] = cmd>>8; cmd_buff[0] = cmd>>8;
cmd_buff[1] = cmd; cmd_buff[1] = cmd;
u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xffff); u_int8_t ret = HAL_I2C_Master_Transmit(&hi2c1,addr,cmd_buff,2,0xff);
return ret; return ret;
} }
@ -83,7 +83,7 @@ u_int8_t sht30_init()
if(ret == TRUE) if(ret == TRUE)
term_printf("Sensor Sht30 Check OK.\r\n Temp:%.2f,Humi:%.2f\r\n", temp,humi); term_printf("Sensor Sht30 Check OK.\r\n Temp:%.2f,Humi:%.2f\r\n", temp,humi);
else else
term_printf("Sensor Sht30 Check Err.\r\n"); // term_printf("Sensor Sht30 Check Err.\r\n");
return 0; return 0;
} }
@ -101,7 +101,7 @@ u_int8_t sht30_collect_data(stTempHumiSensor stSensorDev, float *temp, float *hu
i2c_write_cmd(stSensorDev.i2c_reg_addr,stSensorDev.cmd_read_data); i2c_write_cmd(stSensorDev.i2c_reg_addr,stSensorDev.cmd_read_data);
if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xffff) != HAL_OK){ if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xff) != HAL_OK){
return HAL_ERROR; return HAL_ERROR;
} }
@ -119,73 +119,107 @@ u_int8_t sht30_collect_data(stTempHumiSensor stSensorDev, float *temp, float *hu
} }
/**
* @brief 湿
* @param
* @retval
*/
u_int8_t sht45_collect_data(stTempHumiSensor stSensorDev, float *temp, float *humi)
{
u_int8_t read_buff[6] = {0};
uint8_t _cmd[] = {0xFD};
u_int16_t temp_value;
u_int16_t humi_value;
HAL_I2C_Master_Transmit(&hi2c1,stSensorDev.i2c_reg_addr,_cmd,1,0xff);
osDelay(15);
if(HAL_I2C_Master_Receive(&hi2c1,stSensorDev.i2c_reg_addr,read_buff,6,0xff) != HAL_OK){
return HAL_ERROR;
}
if(CheckCrc8(read_buff, 0xFF) != read_buff[2] && CheckCrc8(&read_buff[3], 0xFF) != read_buff[5]){
return HAL_ERROR;
}
temp_value = ((u_int16_t)read_buff[0]<<8)|read_buff[1];
*temp = -45 + 175*((float)temp_value/65535);
humi_value = ((u_int16_t)read_buff[3]<<8)|read_buff[4];
*humi = -6 + 125*((float)humi_value / 65535);
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;
}
/** /**
* @brief »ñÈ¡ÎÂʪÈÊý¾Ý * @brief »ñÈ¡ÎÂʪÈÊý¾Ý
* @param * @param
* @retval * @retval
*/ */
#define COLLECT_DATA_NUM 10 #define COLLECT_DATA_NUM 10
BOOL get_temp_humi_data(float* temdata, float* humidata) HAL_StatusTypeDef get_temp_humi_data(float* temdata, float* humidata)
{ {
U_DataType collect_temdata[COLLECT_DATA_NUM]={0x00}; float collect_temdata[COLLECT_DATA_NUM] = {0};
U_DataType collect_humidata[COLLECT_DATA_NUM]={0x00}; float collect_humidata[COLLECT_DATA_NUM] = {0};
U_DataType tmp_temdata,tmp_humidata; float tmp_temdata,tmp_humidata;
uint8_t ret_falt = 0;
for(int i=0; i<COLLECT_DATA_NUM; i++){ for(int i=0; i<COLLECT_DATA_NUM; i++){
int ret = sht30_collect_data(g_stTempHumiSensor,&collect_temdata[i].fValue, &collect_humidata[i].fValue); if(sht45_collect_data(g_stTempHumiSensor,&collect_temdata[i], &collect_humidata[i]) == HAL_ERROR)
// AssertError(ret == HAL_OK, return FALSE, "sht30采样失败"); {
if(ret == HAL_ERROR) ret_falt++;
// return FALSE; collect_temdata[i] = 0;
goto error_return; collect_humidata[i] = 0;
}
osDelay(1); osDelay(1);
} }
if(ret_falt >= COLLECT_DATA_NUM)
tmp_temdata = filter_middle(collect_temdata,COLLECT_DATA_NUM, FILTER_DATA_TYPE_FLOAT);
tmp_humidata = filter_middle(collect_humidata,COLLECT_DATA_NUM, FILTER_DATA_TYPE_FLOAT);
// 断言有问题
// AssertError((tmp_temdata.fValue >= -40) && (tmp_temdata.fValue <= 85), return FALSE, "sht30温度值校验失败");
// AssertError((tmp_humidata.fValue >= 0) && (tmp_humidata.fValue <= 100), return FALSE, "sht30湿度值校验失败");
if(tmp_temdata.fValue < -50)
{ {
// tmp_temdata.fValue = -40;
// term_printf("sht30温度值校验失败");
// return FALSE;
goto error_return;
}
if(tmp_temdata.fValue > 125)
{
// tmp_temdata.fValue = 125;
// term_printf("sht30温度值校验失败");
// return FALSE;
goto error_return;
}
if(tmp_humidata.fValue < 0)
{
// tmp_humidata.fValue = 0;
// term_printf("sht30湿度值校验失败");
// return FALSE;
goto error_return;
}
if(tmp_humidata.fValue > 100)
{
// tmp_humidata.fValue = 100;
// term_printf("sht3湿度值校验失败");
// return FALSE;
goto error_return; goto error_return;
} }
*temdata = tmp_temdata.fValue; tmp_temdata = calculateAverage(collect_temdata,COLLECT_DATA_NUM - ret_falt);
*humidata = tmp_humidata.fValue; tmp_humidata = calculateAverage(collect_humidata,COLLECT_DATA_NUM - ret_falt);
//g_stTempHumiData.temp = tmp_temdata.fValue; if(tmp_temdata < -50.0)
//g_stTempHumiData.humi = tmp_humidata.fValue; {
return TRUE; tmp_temdata = -50.0;
}
if(tmp_temdata > 125.0)
{
tmp_temdata = 125.0;
}
if(tmp_humidata < 0.0)
{
tmp_humidata = 0.0;
}
if(tmp_humidata > 100.0)
{
tmp_humidata = 100.0;
}
*temdata = tmp_temdata;
*humidata = tmp_humidata;
return HAL_OK;
error_return: error_return:
*temdata = 0; *temdata = 0;
*humidata = 0; *humidata = 0;
return FALSE; return HAL_ERROR;
} }
#if 0 #if 0

View File

@ -2,6 +2,7 @@
#define __SHT30_H_ #define __SHT30_H_
#include "comm_types.h" #include "comm_types.h"
#include "main.h"
#define SHT30 "SHT30" #define SHT30 "SHT30"
@ -21,6 +22,6 @@ typedef struct _stTempHumiData{
extern stTempHumiData g_stTempHumiData; extern stTempHumiData g_stTempHumiData;
u_int8_t sht30_init(); 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(); //void TEST_read_sht30_value();
#endif #endif

View File

@ -1,5 +1,6 @@
#include "tmp117.h" #include "tmp117.h"
#include "i2c.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); 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) HAL_StatusTypeDef TMP117_Get_Temp(float *temp)
{ {
uint8_t raw_data[2] = {0}; uint8_t raw_data[2] = {0};
int16_t temp_raw; 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)) { for(int i = 0; i<COLLECT_DATA_NUM; i++)
{
TMP117_Init();
osDelay(20);
if(TMP117_Read(TMP117_TEMP_REG, raw_data) != HAL_OK)
{
ret_falt++;
temp_temp[i] = 0;
}else
{
temp_raw = (raw_data[0] << 8) | raw_data[1]; temp_raw = (raw_data[0] << 8) | raw_data[1];
*temp = temp_raw * 0.0078125f; temp_temp[i] = temp_raw * 0.0078125f;
} }
else
}
if(ret_falt >= COLLECT_DATA_NUM)
{ {
*temp = 0; *temp = 0;
return HAL_ERROR; return HAL_ERROR;
} }
if(*temp <= -60)
ret_temp = calculateAverage(temp_temp, COLLECT_DATA_NUM - ret_falt);
if(ret_temp <= -60)
{ {
*temp = -60; *temp = -60;
} }else if(ret_temp >= 150)
if(*temp >= 150)
{ {
*temp = 150; *temp = 150;
}else
{
*temp = ret_temp;
} }
return HAL_OK; return HAL_OK;
} }

View File

@ -375,6 +375,7 @@
<state>$PROJ_DIR$\..\App\Inc</state> <state>$PROJ_DIR$\..\App\Inc</state>
<state>$PROJ_DIR$\..\Drivers\HP203B</state> <state>$PROJ_DIR$\..\Drivers\HP203B</state>
<state>$PROJ_DIR$\..\Drivers\Tmp117</state> <state>$PROJ_DIR$\..\Drivers\Tmp117</state>
<state>$PROJ_DIR$\..\Drivers\MS5607</state>
</option> </option>
<option> <option>
<name>CCStdIncCheck</name> <name>CCStdIncCheck</name>
@ -1487,6 +1488,7 @@
<state>$PROJ_DIR$\..\App\Inc</state> <state>$PROJ_DIR$\..\App\Inc</state>
<state>$PROJ_DIR$\..\Drivers\HP203B</state> <state>$PROJ_DIR$\..\Drivers\HP203B</state>
<state>$PROJ_DIR$\..\Drivers\Tmp117</state> <state>$PROJ_DIR$\..\Drivers\Tmp117</state>
<state>$PROJ_DIR$\..\Drivers\MS5607</state>
</option> </option>
<option> <option>
<name>CCStdIncCheck</name> <name>CCStdIncCheck</name>
@ -1814,7 +1816,7 @@
<data> <data>
<extensions></extensions> <extensions></extensions>
<cmdline></cmdline> <cmdline></cmdline>
<hasPrio>1</hasPrio> <hasPrio>184</hasPrio>
<buildSequence>inputOutputBased</buildSequence> <buildSequence>inputOutputBased</buildSequence>
</data> </data>
</settings> </settings>
@ -2367,6 +2369,15 @@
<name>$PROJ_DIR$\..\Drivers\HP203B\hp203b.h</name> <name>$PROJ_DIR$\..\Drivers\HP203B\hp203b.h</name>
</file> </file>
</group> </group>
<group>
<name>MS5607</name>
<file>
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.h</name>
</file>
</group>
<group> <group>
<name>RingQueue</name> <name>RingQueue</name>
<file> <file>

View File

@ -2994,6 +2994,15 @@
<name>$PROJ_DIR$\..\Drivers\HP203B\hp203b.h</name> <name>$PROJ_DIR$\..\Drivers\HP203B\hp203b.h</name>
</file> </file>
</group> </group>
<group>
<name>MS5607</name>
<file>
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\Drivers\MS5607\ms5607.h</name>
</file>
</group>
<group> <group>
<name>RingQueue</name> <name>RingQueue</name>
<file> <file>