Compare commits
12 Commits
1041bc976e
...
1fbf61f7d4
Author | SHA1 | Date |
---|---|---|
|
1fbf61f7d4 | |
|
d49c313dab | |
|
798a442abe | |
|
e0c5dcd299 | |
|
83a9a79dcd | |
|
34c91c3099 | |
|
075d293173 | |
|
afe80d0695 | |
|
d49f35ffeb | |
|
980d3a2429 | |
|
117777c092 | |
|
955999ece9 |
|
@ -35,9 +35,13 @@
|
|||
#define DRIVE_FREQ_MHz ((float32_t)0.2)
|
||||
|
||||
// 驱动方波个数 实际个数 DRIVE_NUM+1
|
||||
|
||||
#define DRIVE_NUM 2
|
||||
|
||||
// 温度探头版本,SHT30=1,TMP117=2
|
||||
#define SHT30_SENSOR 1
|
||||
#define TMP117_SENSOR 2
|
||||
#define TEMP_SENSOR TMP117_SENSOR
|
||||
|
||||
|
||||
///已将DISTANCE写入配置文件,在结构体g_stConfigInfo.transducer_distace中
|
||||
// 传播距离 风速计算公式中的L参数
|
||||
|
@ -140,7 +144,7 @@ typedef struct _error_log{
|
|||
uint16_t tof_error_WE:1; /* 接受东西信号(tofy,tofx<0)很小 */
|
||||
uint16_t temp_error_SHT30:1; /* SHT30错误日志(温湿度) */
|
||||
uint16_t temp_error_HP203B:1; /* HP203B错误日志(大气压) */
|
||||
uint16_t error_4:1; /* 保留 */
|
||||
uint16_t temp_error_TMP117:1; /* TMP117错误日志(温度) */
|
||||
uint16_t error_5:1; /* 保留 */
|
||||
uint16_t error_6:1; /* 保留 */
|
||||
uint16_t error_7:1; /* 保留 */
|
||||
|
|
|
@ -23,23 +23,23 @@ typedef enum
|
|||
typedef enum
|
||||
{
|
||||
FRT_REGISTER_MIN_WIND_DIRECTION = 0, /* 最小风向 */
|
||||
FRT_REGISTER_THROUGH_WIND_DIRECTION = 1, /* 极小风向 */
|
||||
FRT_REGISTER_AVERAGE_WIND_DIRECTION = 2, /* 平均风向 */
|
||||
FRT_REGISTER_INSTANTANEOUS_WIND_DIRECTION = 3, /* 瞬时风向 */
|
||||
FRT_REGISTER_PEAK_WIND_DIRECTION = 4, /* 极大风向 */
|
||||
FRT_REGISTER_MAX_WIND_DIRECTION = 5, /* 最大风向 */
|
||||
FRT_REGISTER_MIN_WIND_SPEED = 6, /* 最小风速 */
|
||||
FRT_REGISTER_THROUGH_WIND_SPEED = 7, /* 极小风速 */
|
||||
FRT_REGISTER_AVERAGE_WIND_SPEED = 8, /* 平均风速 */
|
||||
FRT_REGISTER_INSTANTANEOUS_WIND_SPEED = 9, /* 瞬时风速 */
|
||||
FRT_REGISTER_PEAK_WIND_SPEED = 10, /* 极大风速 */
|
||||
FRT_REGISTER_MAX_WIND_SPEED = 11, /* 最大风速 */
|
||||
FRT_REGISTER_TEMPERATURE = 12, /* 大气温度 */
|
||||
FRT_REGISTER_HUMIDITY = 13, /* 大气湿度 */
|
||||
FRT_REGISTER_PRESSURE = 14, /* 大气压 */
|
||||
FRT_REGISTER_RAIN = 15, /* 雨量 */
|
||||
FRT_REGISTER_LIGHT_INTENSITY_HIGH = 16, /* 光照高位 */
|
||||
FRT_REGISTER_LIGHT_INTENSITY_LOW = 17, /* 光照低位 */
|
||||
FRT_REGISTER_AVERAGE_WIND_DIRECTION = 1, /* 平均风向 */
|
||||
FRT_REGISTER_MAX_WIND_DIRECTION = 2, /* 最大风向 */
|
||||
FRT_REGISTER_MIN_WIND_SPEED = 3, /* 最小风速 */
|
||||
FRT_REGISTER_AVERAGE_WIND_SPEED = 4, /* 平均风速 */
|
||||
FRT_REGISTER_MAX_WIND_SPEED = 5, /* 最大风速 */
|
||||
FRT_REGISTER_TEMPERATURE = 6, /* 大气温度 */
|
||||
FRT_REGISTER_HUMIDITY = 7, /* 大气湿度 */
|
||||
FRT_REGISTER_PRESSURE = 8, /* 大气压 */
|
||||
FRT_REGISTER_RAIN = 9, /* 雨量 */
|
||||
FRT_REGISTER_LIGHT_INTENSITY_HIGH = 10, /* 光照强度高位 */
|
||||
FRT_REGISTER_LIGHT_INTENSITY_LOW = 11, /* 光照强度低位 */
|
||||
FRT_REGISTER_THROUGH_WIND_DIRECTION = 12, /* 极小风向 */
|
||||
FRT_REGISTER_INSTANTANEOUS_WIND_DIRECTION = 13, /* 瞬时风向 */
|
||||
FRT_REGISTER_PEAK_WIND_DIRECTION = 14, /* 极大风向 */
|
||||
FRT_REGISTER_THROUGH_WIND_SPEED = 15, /* 极小风速 */
|
||||
FRT_REGISTER_INSTANTANEOUS_WIND_SPEED = 16, /* 瞬时风速 */
|
||||
FRT_REGISTER_PEAK_WIND_SPEED = 17, /* 极大风速 */
|
||||
|
||||
FRT_REGISTER_DEVICE_ADDR = 20, /* 设备地址 */
|
||||
FRT_REGISTER_COMMU_BAUDRATE = 21, /* 波特率 */
|
||||
|
|
|
@ -6,9 +6,11 @@
|
|||
#include "fdacoefs.h"
|
||||
#include "sht30.h"
|
||||
#include "hp203b.h"
|
||||
#include "tmp117.h"
|
||||
#include "FIR.h"
|
||||
#include "LowPassFilter.h"
|
||||
#include "encrypt.h"
|
||||
#include "rain.h"
|
||||
|
||||
#define AVE_TIME 600 //滑动平均时间,秒,最大600
|
||||
#define COVER_TINE 10 //探头遮挡后导致的接收次数过小的报错临界次数
|
||||
|
@ -460,6 +462,7 @@ char str[100];
|
|||
//}
|
||||
|
||||
|
||||
SlidingWindow_10min win_10min = {0};
|
||||
void wind_task(void const * argument)
|
||||
{
|
||||
//软件加密校验
|
||||
|
@ -527,7 +530,6 @@ void wind_task(void const * argument)
|
|||
// 接受信号很小
|
||||
if(tofx<0||tofy<0)
|
||||
{
|
||||
tof_error_log_NS ++;
|
||||
// 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据
|
||||
// 但是持续的遮挡会导致风速数据保持不变。
|
||||
// 连续10次采样有问题判定为有遮挡,置错误标志位,将声速与风速分量置0
|
||||
|
@ -540,6 +542,7 @@ void wind_task(void const * argument)
|
|||
}
|
||||
else
|
||||
{
|
||||
tof_error_log_NS ++;
|
||||
continue;
|
||||
}
|
||||
// 手动设置渡越时间差为0,会在探头受遮挡的时候输出0,持续遮挡的时候也输出0,但是计算出声速将变得很大
|
||||
|
@ -594,7 +597,6 @@ void wind_task(void const * argument)
|
|||
// 如果测量的信号幅值过小。
|
||||
if(tofx<0||tofy<0)
|
||||
{
|
||||
tof_error_log_WE ++;
|
||||
// 放弃本次采样,可以有效筛选雨滴等导致的异常大的风速数据
|
||||
// 但是持续的遮挡会导致风速数据保持不变。
|
||||
// 连续10次采样有问题判定为有遮挡,置错误标志位,将声速与风速分量置0
|
||||
|
@ -607,6 +609,7 @@ void wind_task(void const * argument)
|
|||
}
|
||||
else
|
||||
{
|
||||
tof_error_log_WE ++;
|
||||
continue;
|
||||
}
|
||||
// 手动设置渡越时间差为0,会在探头受遮挡的时候输出0,持续遮挡的时候也输出0,但是计算出声速将变得很大
|
||||
|
@ -663,6 +666,9 @@ void wind_task(void const * argument)
|
|||
{
|
||||
av_speed = 0;
|
||||
av_angle = 0;
|
||||
//滑动平均值索引归零
|
||||
win_10min.count = 0;
|
||||
win_10min.index = 0;
|
||||
}
|
||||
// 360一圈
|
||||
if(av_speedy<0)
|
||||
|
@ -844,7 +850,6 @@ void update_mcs_param(float new_wind_speed, float new_wind_dirction)
|
|||
}
|
||||
}
|
||||
|
||||
SlidingWindow_10min win_10min = {0};
|
||||
SlidingWindow_3s win_3s = {0};
|
||||
//求和函数
|
||||
float sum(float arr[], int n)
|
||||
|
@ -1060,81 +1065,93 @@ void my_update_mcs_param(float new_wind_speed, float new_wind_dirction)
|
|||
win_10min.index = (win_10min.index + 1) % g_usrConfigInfo.speed_average_time;//更新索引
|
||||
}
|
||||
|
||||
//采集温度,湿度,大气压
|
||||
static void getTempHumiPress(void)
|
||||
{
|
||||
//采集备用温度与大气压
|
||||
float backupTemperature1;
|
||||
float backupTemperature2;
|
||||
uint8_t hp203_ret = get_HP203_data(&backupTemperature1, &g_stMcs_Para.pressure);
|
||||
uint8_t sht30_ret = get_temp_humi_data(&backupTemperature2, &g_stMcs_Para.humidity);
|
||||
#if TEMP_SENSOR == SHT30_SENSOR
|
||||
g_stMcs_Para.temperature = backupTemperature2;
|
||||
#endif /*TEMP_SENSOR == SHT30_SENSOR*/
|
||||
|
||||
#if TEMP_SENSOR == TMP117_SENSOR
|
||||
TMP117_Init();
|
||||
osDelay(20);
|
||||
uint8_t tmp117_ret = TMP117_Get_Temp(&g_stMcs_Para.temperature);
|
||||
|
||||
// TMP117出问题
|
||||
if(tmp117_ret != HAL_OK)
|
||||
{
|
||||
//置错误标志位
|
||||
g_error_log.temp_error_TMP117 = 1;
|
||||
//使用备用温度
|
||||
g_stMcs_Para.temperature = backupTemperature1;
|
||||
}
|
||||
else
|
||||
{
|
||||
//恢复错误标志位
|
||||
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)
|
||||
{
|
||||
uint8_t tem_hun_check_flag = JudgeEncrypt();
|
||||
|
||||
uint16_t time_s_temp_humi = 0;//1秒计时,温湿度更新
|
||||
uint32_t time_s_1Day = 0;//1天的秒数
|
||||
|
||||
float backupTemperature;
|
||||
uint8_t hp203_ret;
|
||||
uint8_t sht30_ret;
|
||||
// 开机先采集一次大气压温湿度
|
||||
if(tem_hun_check_flag)
|
||||
{
|
||||
uint8_t hp203_ret = get_HP203_data(&backupTemperature, &g_stMcs_Para.pressure);
|
||||
uint8_t sht30_ret = get_temp_humi_data(&g_stMcs_Para.temperature, &g_stMcs_Para.humidity);
|
||||
}
|
||||
|
||||
// 采集HP203B传感器数据(大气压)
|
||||
if(hp203_ret == FALSE)
|
||||
{
|
||||
g_error_log.temp_error_HP203B = 1;
|
||||
/// 错误处理
|
||||
}
|
||||
// 采集SHT30传感器数据(温湿度)
|
||||
if(sht30_ret == FALSE)
|
||||
{
|
||||
g_error_log.temp_error_SHT30 = 1;
|
||||
/// 错误处理
|
||||
g_stMcs_Para.temperature = backupTemperature;
|
||||
//采集温湿度与大气压
|
||||
getTempHumiPress();
|
||||
}
|
||||
|
||||
while(1)
|
||||
{
|
||||
osDelay(1000);
|
||||
if(!tem_hun_check_flag)continue;
|
||||
getLightRainData();//雨量光照
|
||||
time_s_temp_humi ++;
|
||||
time_s_1Day ++;
|
||||
// 温湿度大气压更新
|
||||
if (time_s_temp_humi >= g_usrConfigInfo.temp_hum_update_time)
|
||||
{
|
||||
hp203_ret = get_HP203_data(&backupTemperature, &g_stMcs_Para.pressure);
|
||||
sht30_ret = get_temp_humi_data(&g_stMcs_Para.temperature, &g_stMcs_Para.humidity);
|
||||
// 采集HP203B传感器数据(大气压)
|
||||
if(hp203_ret == FALSE)
|
||||
{
|
||||
g_error_log.temp_error_HP203B = 1;
|
||||
/// 错误处理
|
||||
}
|
||||
else
|
||||
{
|
||||
// 没出问题清除错误日志
|
||||
g_error_log.temp_error_HP203B = 0;
|
||||
}
|
||||
// 采集SHT30传感器数据(温湿度)
|
||||
if(sht30_ret == FALSE)
|
||||
{
|
||||
g_error_log.temp_error_SHT30 = 1;
|
||||
/// 错误处理
|
||||
g_stMcs_Para.temperature = backupTemperature;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 没出问题清除错误日志
|
||||
g_error_log.temp_error_SHT30 = 0;
|
||||
}
|
||||
getTempHumiPress();
|
||||
// 计时重置
|
||||
time_s_temp_humi = 0;
|
||||
}
|
||||
// 一天重启
|
||||
if (time_s_1Day >= 86400)
|
||||
{
|
||||
__iar_builtin_set_FAULTMASK(1);
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
// 风速风向更新
|
||||
my_update_mcs_param(weather_info.instantaneous_wind_speed, weather_info.instantaneous_wind_direction);
|
||||
}
|
||||
|
|
|
@ -238,7 +238,7 @@ static u_int16_t FRT_swap_endian_16(u_int16_t value)
|
|||
*/
|
||||
static u_int16_t FRT_ReadRegMinWindDiretion(void *pMsg)
|
||||
{
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.min_wind_direction *10);
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.min_wind_direction);
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
|
@ -249,7 +249,7 @@ static u_int16_t FRT_ReadRegMinWindDiretion(void *pMsg)
|
|||
*/
|
||||
static u_int16_t FRT_ReadRegThroughWindDiretion(void *pMsg)
|
||||
{
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.trough_wind_direction *10);
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.trough_wind_direction);
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
|
@ -260,7 +260,7 @@ static u_int16_t FRT_ReadRegThroughWindDiretion(void *pMsg)
|
|||
*/
|
||||
static u_int16_t FRT_ReadRegAverageWindDirection(void *pMsg)
|
||||
{
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.average_wind_direction *10);
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.average_wind_direction);
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
|
@ -271,7 +271,7 @@ static u_int16_t FRT_ReadRegAverageWindDirection(void *pMsg)
|
|||
*/
|
||||
static u_int16_t FRT_ReadRegInstantaneousWindDirection(void *pMsg)
|
||||
{
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.instantaneous_wind_direction *10);
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.instantaneous_wind_direction);
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
|
@ -282,7 +282,7 @@ static u_int16_t FRT_ReadRegInstantaneousWindDirection(void *pMsg)
|
|||
*/
|
||||
static u_int16_t FRT_ReadRegPeakWindDiretion(void *pMsg)
|
||||
{
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.peak_wind_direction *10);
|
||||
u_int16_t value = (u_int16_t)(g_stMcs_Para.peak_wind_direction);
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
|
@ -293,7 +293,7 @@ static u_int16_t FRT_ReadRegPeakWindDiretion(void *pMsg)
|
|||
*/
|
||||
static u_int16_t FRT_ReadRegMaxWindDirection(void *pMsg)
|
||||
{
|
||||
u_int16_t value=(u_int16_t)(g_stMcs_Para.max_wind_direction *10);
|
||||
u_int16_t value=(u_int16_t)(g_stMcs_Para.max_wind_direction);
|
||||
return FRT_swap_endian_16(value);
|
||||
}
|
||||
|
||||
|
@ -1357,8 +1357,8 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
|
|||
u_int16_t reg_num= (data[4] << 8)| data[5];
|
||||
if ( \
|
||||
start_reg_addr < 0x00 ||\
|
||||
(start_reg_addr > FRT_REGISTER_LIGHT_INTENSITY_LOW && start_reg_addr < FRT_REGISTER_DEVICE_ADDR) ||\
|
||||
(start_reg_addr > FRT_REGISTER_RAIN_POWER_CONTROL && start_reg_addr < FRT_REGISTER_TRANSDUCER_CFG_1R5) ||\
|
||||
(start_reg_addr > FRT_REGISTER_PEAK_WIND_SPEED && start_reg_addr < FRT_REGISTER_DEVICE_ADDR) ||\
|
||||
(start_reg_addr > FRT_REGISTER_TEMPHUM_UPDATE_TIME && start_reg_addr < FRT_REGISTER_TRANSDUCER_CFG_1R5) ||\
|
||||
start_reg_addr > FRT_REGISTER_ID_4 \
|
||||
)
|
||||
|
||||
|
@ -1369,8 +1369,8 @@ void FRT_MsgProc_ReadRegister(device_handle device, void *pMsg)
|
|||
|
||||
if ( \
|
||||
reg_num < 0x01 ||\
|
||||
(((reg_num + start_reg_addr - 1) > FRT_REGISTER_LIGHT_INTENSITY_LOW) && ((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_RAIN_POWER_CONTROL) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_TRANSDUCER_CFG_1R5)) ||\
|
||||
(((reg_num + start_reg_addr - 1) > FRT_REGISTER_PEAK_WIND_SPEED) && ((reg_num + start_reg_addr - 1) < FRT_REGISTER_DEVICE_ADDR)) ||\
|
||||
(((reg_num + start_reg_addr -1) > FRT_REGISTER_TEMPHUM_UPDATE_TIME) && ((reg_num + start_reg_addr -1) < FRT_REGISTER_TRANSDUCER_CFG_1R5)) ||\
|
||||
((reg_num + start_reg_addr -1) > FRT_REGISTER_ID_4) \
|
||||
)
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ uart_device_info uart_devices[]={
|
|||
[3] = {
|
||||
.init = 0,
|
||||
.uart_index = RAIN_RS485_UART_INDEX,
|
||||
.uart_baudrate = 4800,
|
||||
.uart_baudrate = 9600,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ void task_shell_term_main_loop(void const * argument);
|
|||
#include "frt_protocol.h"
|
||||
#include "inflash.h"
|
||||
#include "hp203b.h"
|
||||
#include "tmp117.h"
|
||||
#include "encrypt.h"
|
||||
#include "rain.h"
|
||||
/* USER CODE END Includes */
|
||||
|
@ -190,6 +191,8 @@ void SensorTask(void const * argument)
|
|||
}
|
||||
/* USER CODE END Application */
|
||||
|
||||
uint16_t time_s_1Hour = 0;//1小时的秒数
|
||||
uint8_t time_h_1Day = 0;//1天的小时
|
||||
void LEDTask(void const * argument)
|
||||
{
|
||||
/* USER CODE BEGIN StartDefaultTask */
|
||||
|
@ -198,9 +201,22 @@ void LEDTask(void const * argument)
|
|||
for(;;)
|
||||
{
|
||||
osDelay(1000);
|
||||
time_s_1Hour ++;
|
||||
if(LED_Check_flag)
|
||||
{getLightRainData();
|
||||
{
|
||||
HAL_GPIO_TogglePin(GPIOC,GPIO_LED_CTRL_Pin);
|
||||
// 一天重启
|
||||
if (time_s_1Hour >= 3600)
|
||||
{
|
||||
time_s_1Hour = 0;
|
||||
time_h_1Day++;
|
||||
}
|
||||
if (time_h_1Day >= 24)
|
||||
{
|
||||
time_h_1Day = 0;
|
||||
__iar_builtin_set_FAULTMASK(1);
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
}
|
||||
}
|
||||
/* USER CODE END StartDefaultTask */
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include "uart_dev.h"
|
||||
#include "sht30.h"
|
||||
#include "hp203b.h"
|
||||
#include "tmp117.h"
|
||||
|
||||
#include "inflash.h"
|
||||
/* USER CODE END Includes */
|
||||
|
@ -173,6 +174,7 @@ void Flash_EnableReadProtection(void)
|
|||
term_printf("Version 1.0.0 Build: %s %s\r\n",__DATE__,__TIME__);
|
||||
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
|
||||
sht30_init();
|
||||
TMP117_Init();
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Call init function for freertos objects (in cmsis_os2.c) */
|
||||
|
|
|
@ -10,14 +10,44 @@ void initLowPassFilter(SL_LowPassFilter* filter, float alpha)
|
|||
filter->alpha = alpha;
|
||||
// 初始化上一次的输出值为0
|
||||
filter->previous = 0.0f;
|
||||
|
||||
filter->x = 0;
|
||||
filter->times = 0;
|
||||
}
|
||||
|
||||
// 更新滤波器输出值
|
||||
float updateFilter(SL_LowPassFilter* filter, float new_input)
|
||||
{
|
||||
// 更新滤波后的值
|
||||
float output = (1.0f - filter->alpha) * filter->previous + filter->alpha * new_input;
|
||||
// 滤波新值
|
||||
float filtedData = (1.0f - filter->alpha) * filter->previous + filter->alpha * new_input;
|
||||
|
||||
// //差值大于一定值认为有问题,暂定4
|
||||
// if((filter->x) - filtedData > 4 || (filtedData) - filter->x > 4 )
|
||||
// {
|
||||
//// 将有问题的值存起来
|
||||
// (filter->x) = filtedData;
|
||||
//// 使用上一次的正确值当结果
|
||||
// filtedData = filter->previous;
|
||||
//// 清空计数
|
||||
// filter->times = 0;
|
||||
// }else
|
||||
// {
|
||||
//// 差值在允许范围内
|
||||
//// 差值合理一定时间后认为数据没问题
|
||||
// if(filter->times < 3)
|
||||
// {
|
||||
// filter->times++;
|
||||
//// 没满足次数,使用旧值
|
||||
// filtedData = filter->previous;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
//// 将值存起来,直接使用滤波后的值
|
||||
// (filter->x) = filtedData;
|
||||
// }
|
||||
// }
|
||||
|
||||
// 更新上一次的输出值
|
||||
filter->previous = output;
|
||||
return output;
|
||||
filter->previous = filtedData;
|
||||
return filtedData;
|
||||
}
|
|
@ -9,6 +9,8 @@
|
|||
typedef struct {
|
||||
float alpha; // 滤波器系数
|
||||
float previous; // 上一次的输出值
|
||||
float x; // 上一次的输入值
|
||||
uint8_t times; // 次数
|
||||
} SL_LowPassFilter;
|
||||
|
||||
extern SL_LowPassFilter low_pass_filter_x;
|
||||
|
|
|
@ -84,6 +84,18 @@ BOOL Hp203bReadTempture(float *press)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
/****************************
|
||||
*名称:get_press_data
|
||||
*功能:获取气压与备用温度数据
|
||||
|
@ -99,12 +111,12 @@ BOOL get_HP203_data(float* tempdata, float* press)
|
|||
uint8_t temp_falt = 0;
|
||||
uint8_t press_falt = 0;
|
||||
// 压强
|
||||
U_DataType collect_pressure[COLLECT_HB203_DATA_NUM]={0x00};
|
||||
float collect_pressure[COLLECT_HB203_DATA_NUM]={0x00};
|
||||
|
||||
for(int i=0; i<COLLECT_HB203_DATA_NUM; i++){
|
||||
hp203_set_mode();
|
||||
osDelay(5);
|
||||
ret = Hp203bReadPressure(&collect_pressure[i].fValue);
|
||||
ret = Hp203bReadPressure(&collect_pressure[i]);
|
||||
if(ret == FALSE)
|
||||
{
|
||||
press_falt++;
|
||||
|
@ -117,25 +129,25 @@ BOOL get_HP203_data(float* tempdata, float* press)
|
|||
{
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
U_DataType tmp_press = filter_middle(collect_pressure, COLLECT_HB203_DATA_NUM - press_falt, FILTER_DATA_TYPE_FLOAT);
|
||||
if(tmp_press.fValue < 300)
|
||||
//求平均
|
||||
float tmp_press = calculateAverage(collect_pressure, COLLECT_HB203_DATA_NUM - press_falt);
|
||||
if(tmp_press < 300)
|
||||
{
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
if(tmp_press.fValue > 1200)
|
||||
if(tmp_press > 1200)
|
||||
{
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
// 温度
|
||||
U_DataType collect_tempture[COLLECT_HB203_DATA_NUM]={0x00};
|
||||
float collect_tempture[COLLECT_HB203_DATA_NUM]={0x00};
|
||||
|
||||
for(int i=0; i<COLLECT_HB203_DATA_NUM; i++){
|
||||
hp203_set_mode();
|
||||
osDelay(5);
|
||||
ret = Hp203bReadTempture(&collect_tempture[i].fValue);
|
||||
ret = Hp203bReadTempture(&collect_tempture[i]);
|
||||
if(ret == FALSE)
|
||||
{
|
||||
temp_falt++;
|
||||
|
@ -148,21 +160,21 @@ BOOL get_HP203_data(float* tempdata, float* press)
|
|||
{
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
U_DataType tmp_tempture = filter_middle(collect_tempture, COLLECT_HB203_DATA_NUM - temp_falt, FILTER_DATA_TYPE_FLOAT);
|
||||
if(tmp_tempture.fValue < -50)
|
||||
//求平均
|
||||
float tmp_tempture = calculateAverage(collect_tempture, COLLECT_HB203_DATA_NUM - temp_falt);
|
||||
if(tmp_tempture < -50)
|
||||
{
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
if(tmp_tempture.fValue > 95)
|
||||
if(tmp_tempture > 95)
|
||||
{
|
||||
// return FALSE;
|
||||
goto error_return;
|
||||
}
|
||||
|
||||
*tempdata = tmp_tempture.fValue;
|
||||
*press = tmp_press.fValue;
|
||||
*tempdata = tmp_tempture;
|
||||
*press = tmp_press;
|
||||
return TRUE;
|
||||
|
||||
error_return:
|
||||
|
|
|
@ -19,28 +19,28 @@ void rainLightPowerOff(void)
|
|||
//获取雨量指令,返回的雨量是十倍,两个字节
|
||||
void getRainData(void)
|
||||
{
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x03, 0x00, 0x01, 0x74, 0x0A};
|
||||
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
||||
}
|
||||
|
||||
//清空雨量指令
|
||||
void clearRainData(void)
|
||||
{
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x06, 0x00, 0x00, 0x00, 0x5A, 0x09, 0xF1};
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x06, 0x01, 0x05, 0x00, 0x00, 0x98, 0x37};
|
||||
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
||||
}
|
||||
|
||||
//获取光照指令,返回一倍光照,四个字节
|
||||
void getLightData(void)
|
||||
{
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x65, 0xCB};
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x05, 0x00, 0x02, 0xD4, 0x0A};
|
||||
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
||||
}
|
||||
|
||||
//同时获取光照雨量指令,返回一倍光照,四个字节;十倍雨量两个字节
|
||||
void getLightRainData(void)
|
||||
{
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09};
|
||||
uint8_t getRainDataCmd[] = {0x01, 0x03, 0x00, 0x03, 0x00, 0x04, 0xB4, 0x09};
|
||||
uart_dev_write(g_rain_uart_handle, getRainDataCmd, sizeof(getRainDataCmd));
|
||||
}
|
||||
|
||||
|
@ -219,7 +219,7 @@ static void rainMsgHandler(device_handle device, u_int8_t *pMsg, u_int32_t MsgLe
|
|||
break;
|
||||
//数据光照雨量
|
||||
case 13:
|
||||
msgData[0] = pMsg[7];//¹âÕÕ
|
||||
msgData[0] = pMsg[7];
|
||||
msgData[1] = pMsg[8];
|
||||
msgData[2] = pMsg[9];
|
||||
msgData[3] = pMsg[10];
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
#include "tmp117.h"
|
||||
#include "i2c.h"
|
||||
|
||||
|
||||
// 初始化温度传感器
|
||||
HAL_StatusTypeDef TMP117_Init(void)
|
||||
{
|
||||
// 配置值:
|
||||
uint8_t config_data[2] = {0x0C, 0x00}; // 高字节在前,单次转换,1100 0000 0000,12.5ms
|
||||
return HAL_I2C_Mem_Write(&hi2c1, TMP117_ADDR << 1, TMP117_CONFIG_REG,
|
||||
I2C_MEMADD_SIZE_8BIT, config_data, 2, 100);
|
||||
}
|
||||
|
||||
// 从寄存器读取双字节数据
|
||||
HAL_StatusTypeDef TMP117_Read(uint8_t reg, uint8_t *buffer) {
|
||||
return HAL_I2C_Mem_Read(&hi2c1, TMP117_ADDR << 1, reg,
|
||||
I2C_MEMADD_SIZE_8BIT, buffer, 2, 100);
|
||||
}
|
||||
|
||||
// 获取温度值(单位:℃)
|
||||
HAL_StatusTypeDef TMP117_Get_Temp(float *temp)
|
||||
{
|
||||
uint8_t raw_data[2] = {0};
|
||||
int16_t temp_raw;
|
||||
|
||||
if (HAL_OK == TMP117_Read(TMP117_TEMP_REG, raw_data)) {
|
||||
temp_raw = (raw_data[0] << 8) | raw_data[1];
|
||||
*temp = temp_raw * 0.0078125f;
|
||||
}
|
||||
else
|
||||
{
|
||||
*temp = 0;
|
||||
return HAL_ERROR;
|
||||
}
|
||||
if(*temp <= -60)
|
||||
{
|
||||
*temp = -60;
|
||||
}
|
||||
if(*temp >= 150)
|
||||
{
|
||||
*temp = 150;
|
||||
}
|
||||
return HAL_OK;
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
#ifndef __TMP117_H_
|
||||
#define __TMP117_H_
|
||||
|
||||
#include "comm_types.h"
|
||||
#include "main.h"
|
||||
|
||||
#define TMP117_ADDR 0x48 //A0接GND
|
||||
//#define TMP117_ADDR 0x49 //A0接V+
|
||||
//#define TMP117_ADDR 0x4A //A0接SDA
|
||||
//#define TMP117_ADDR 0x4B //A0接SCL
|
||||
|
||||
#define TMP117_TEMP_REG 0x00 //温度寄存器
|
||||
#define TMP117_CONFIG_REG 0x01 //配置寄存器
|
||||
#define TMP117_TLOW_REG 0x02 //温度高报警寄存器
|
||||
#define TMP117_THIGH_REG 0x03 //温度低报警寄存器
|
||||
|
||||
|
||||
|
||||
HAL_StatusTypeDef TMP117_Init(void);
|
||||
HAL_StatusTypeDef TMP117_Read(uint8_t reg, uint8_t *buffer);
|
||||
HAL_StatusTypeDef TMP117_Get_Temp(float *temp);
|
||||
|
||||
#endif //__TMP117_H_
|
||||
|
||||
|
||||
|
||||
|
|
@ -375,6 +375,7 @@
|
|||
<state>$PROJ_DIR$\..\App\Inc</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\HP203B</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\RainLight</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\Tmp117</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>CCStdIncCheck</name>
|
||||
|
@ -1487,6 +1488,7 @@
|
|||
<state>$PROJ_DIR$\..\App\Inc</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\HP203B</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\RainLight</state>
|
||||
<state>$PROJ_DIR$\..\Drivers\Tmp117</state>
|
||||
</option>
|
||||
<option>
|
||||
<name>CCStdIncCheck</name>
|
||||
|
@ -2493,6 +2495,15 @@
|
|||
<name>$PROJ_DIR$\..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>tmp117</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\Tmp117\tmp117.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\Tmp117\tmp117.h</name>
|
||||
</file>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<name>Middlewares</name>
|
||||
|
|
|
@ -3120,6 +3120,15 @@
|
|||
<name>$PROJ_DIR$\..\Drivers\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c</name>
|
||||
</file>
|
||||
</group>
|
||||
<group>
|
||||
<name>tmp117</name>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\Tmp117\tmp117.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\..\Drivers\Tmp117\tmp117.h</name>
|
||||
</file>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<name>Middlewares</name>
|
||||
|
|
Loading…
Reference in New Issue