临潼实验室测试
This commit is contained in:
parent
8da11095ba
commit
7cc4b38232
|
@ -5,12 +5,12 @@
|
|||
"type": "mrs-debugger",
|
||||
"request": "launch",
|
||||
"name": "IoT_SCV_CH584M1",
|
||||
"cwd": "c:\\Users\\123\\Desktop\\自闭阀项目\\CDZBF\\iot_-scv_-ch584-m",
|
||||
"cwd": "c:\\Users\\16586\\Desktop\\iot_-scv_-ch584-m(1)",
|
||||
"openOCDCfg": {
|
||||
"useLocalOpenOCD": true,
|
||||
"executable": "d:/MounRiverV2/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/openocd.exe",
|
||||
"executable": "c:/MounRiver/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/openocd.exe",
|
||||
"configOptions": [
|
||||
"-f \"d:/MounRiverV2/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/wch-riscv.cfg\" -c \"chip_id CH32L10x\""
|
||||
"-f \"c:/MounRiver/MounRiver_Studio2/resources/app/resources/win32/components/WCH/OpenOCD/OpenOCD/bin/wch-riscv.cfg\" -c \"chip_id CH32L10x\""
|
||||
],
|
||||
"gdbport": 3333,
|
||||
"telnetport": 4444,
|
||||
|
@ -22,7 +22,7 @@
|
|||
"enableNoZeroWaitingAreaFlash": false
|
||||
},
|
||||
"gdbCfg": {
|
||||
"executable": "d:/MounRiverV2/MounRiver_Studio2/resources/app/resources/win32/components/WCH/Toolchain/RISC-V Embedded GCC12/bin/riscv-wch-elf-gdb.exe",
|
||||
"executable": "c:/MounRiver/MounRiver_Studio2/resources/app/resources/win32/components/WCH/Toolchain/RISC-V Embedded GCC12/bin/riscv-wch-elf-gdb.exe",
|
||||
"commands": [
|
||||
"set mem inaccessible-by-default off",
|
||||
"set architecture riscv:rv32",
|
||||
|
@ -39,8 +39,8 @@
|
|||
"additionalCommands": []
|
||||
},
|
||||
"loadedFiles": {
|
||||
"executableFile": "c:\\Users\\123\\Desktop\\自闭阀项目\\CDZBF\\iot_-scv_-ch584-m\\obj\\IoT_SCV_CH584M1.elf",
|
||||
"symbolFile": "c:\\Users\\123\\Desktop\\自闭阀项目\\CDZBF\\iot_-scv_-ch584-m\\obj\\IoT_SCV_CH584M1.elf",
|
||||
"executableFile": "c:\\Users\\16586\\Desktop\\iot_-scv_-ch584-m(1)\\obj\\IoT_SCV_CH584M1.elf",
|
||||
"symbolFile": "c:\\Users\\16586\\Desktop\\iot_-scv_-ch584-m(1)\\obj\\IoT_SCV_CH584M1.elf",
|
||||
"executableFileOffset": 0,
|
||||
"symbolFileOffset": 0
|
||||
},
|
||||
|
|
|
@ -868,3 +868,43 @@ void BLE_ConnectEventCB(uint32_t timeUs)
|
|||
|
||||
/*********************************************************************
|
||||
*********************************************************************/
|
||||
|
||||
// 假设在此处有handleTimerCloseReq函数,添加定时关阀的处理函数
|
||||
static void handleTimerCloseReq(uint16_t time_min)
|
||||
{
|
||||
// 设置定时关阀
|
||||
BSP_VALVE_StartTimerClose(time_min);
|
||||
|
||||
// 回复设置成功
|
||||
uint8_t buf[3];
|
||||
buf[0] = 0x01; // 命令成功标志
|
||||
buf[1] = (time_min >> 8) & 0xFF; // 高字节
|
||||
buf[2] = time_min & 0xFF; // 低字节
|
||||
|
||||
// 假设以下函数用于向蓝牙客户端发送回复
|
||||
// sendTimerCloseRsp(buf, sizeof(buf));
|
||||
|
||||
logInfo("Set timer close: %d minutes", time_min);
|
||||
}
|
||||
|
||||
// 在处理BLE命令的地方添加处理定时关阀命令的代码
|
||||
// 假设有类似以下处理命令的函数,在其中添加对定时关阀命令的处理
|
||||
/*
|
||||
static void processBleCommand(uint8_t cmd, uint8_t *data, uint16_t len)
|
||||
{
|
||||
switch(cmd)
|
||||
{
|
||||
// ... 其他命令处理
|
||||
|
||||
case CMD_TIMER_CLOSE: // 定义一个定时关阀的命令码
|
||||
if (len >= 2)
|
||||
{
|
||||
uint16_t time_min = (data[0] << 8) | data[1];
|
||||
handleTimerCloseReq(time_min);
|
||||
}
|
||||
break;
|
||||
|
||||
// ... 其他命令处理
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -32,11 +32,18 @@ extern tmosTaskID vavle_task_id;
|
|||
#define VAVLE_LOOP_DECT_EVT (0x0001 << 8) // 循环检测
|
||||
|
||||
#define VAVLE_LOW_VBAT_LED_OFF_EVT (0x0001 << 10) // 低电压LED关闭事件
|
||||
|
||||
// 定时关阀相关事件
|
||||
#define VAVLE_TIMER_CLOSE_EVT (0x0001 << 11) // 定时关阀事件
|
||||
#define VAVLE_TIMER_CLOSE_START_EVT (0x0001 << 12) // 定时关阀开始事件
|
||||
|
||||
#define VALVE_LOW_VBAT_ALARM_PERIOD_MS (1600 * 60 * 10)
|
||||
#define VALVE_DECT_PERIOD_MS (1600 * 60 * 10)
|
||||
|
||||
#define VALVE_DECT_PERIOD_MS (1600 * 60 * 10)
|
||||
|
||||
|
||||
// 定时关阀默认时间(单位:分钟),可以根据需求调整
|
||||
#define VALVE_TIMER_CLOSE_DEFAULT_MIN 30
|
||||
// 定时关阀最大时间(单位:分钟)
|
||||
#define VALVE_TIMER_CLOSE_MAX_MIN 360
|
||||
|
||||
#define CHARGE_TIME_MS (1500)
|
||||
|
||||
|
@ -57,6 +64,7 @@ typedef enum
|
|||
kCmdCloseVavle,
|
||||
kCmdOpenVavle,
|
||||
kCmdData,
|
||||
kCmdTimerCloseVavle, // 新增定时关阀命令
|
||||
} TeFrameCmd;
|
||||
|
||||
typedef struct __attribute__((packed))
|
||||
|
@ -105,6 +113,11 @@ typedef struct __attribute__((packed))
|
|||
uint8_t bat; // 1B 电池电压 30=3V,18=1.8V
|
||||
uint8_t humi; // 1B 阀门湿度 %RH
|
||||
int8_t rssi;
|
||||
|
||||
// 定时关阀状态变量
|
||||
uint8_t timer_close_enabled; // 定时关阀是否启用
|
||||
uint16_t timer_close_min; // 定时关阀时间(分钟)
|
||||
uint32_t timer_close_start_time; // 定时关阀开始时间
|
||||
} TsValveData;
|
||||
extern TsValveData gValveData;
|
||||
|
||||
|
@ -121,4 +134,9 @@ void BSP_VALVE_Generate_ValveResponse(TsRawFrameData *pRawData, TeFrameCmd cmd,
|
|||
|
||||
void BSP_VALVE_Generate_UploadData(TsRawFrameData *pRawData);
|
||||
|
||||
// 定时关阀相关函数
|
||||
void BSP_VALVE_StartTimerClose(uint16_t close_min);
|
||||
void BSP_VALVE_StopTimerClose(void);
|
||||
uint16_t BSP_VALVE_GetTimerCloseRemainMin(void);
|
||||
|
||||
#endif // ! __BSP_VALVE_H__
|
||||
|
|
|
@ -12,6 +12,31 @@ uint8_t flag;
|
|||
uint8_t keydown_flag = 0;
|
||||
uint8_t keydown_time = 0;
|
||||
uint8_t volatile fault_state = 0;
|
||||
|
||||
// 安全阈值参数统一定义
|
||||
#define SAFETY_AUTO_OPEN_THRESHOLD 3 // 自动开阀阈值(连续检测次数)
|
||||
#define SAFETY_MICRO_LEAK_THRESHOLD 5 // 微泄漏检测阈值(连续检测次数)
|
||||
#define SAFETY_MICRO_LEAK_PRESS_DIFF 15 // 微泄漏压力差阈值(Pa),对应流量约0.3L/min
|
||||
#define SAFETY_OVER_TEMP_THRESHOLD 65 // 超温阈值(℃)
|
||||
#define SAFETY_GAS_REQUEST_PRESS_DIFF 50 // 用气请求压力差阈值(Pa)
|
||||
|
||||
// 安全保护状态结构体
|
||||
typedef struct {
|
||||
// 自动开阀相关
|
||||
uint8_t auto_open_count; // 自动开阀检测计数
|
||||
uint8_t auto_open_flag; // 自动开阀标志
|
||||
|
||||
// 微泄漏相关
|
||||
uint8_t micro_leak_count; // 微泄漏检测计数
|
||||
uint8_t micro_leak_flag; // 微泄漏标志
|
||||
|
||||
// 超温相关
|
||||
uint8_t over_temp_flag; // 超温标志
|
||||
} TsValveSafetyStatus;
|
||||
|
||||
// 安全状态全局变量
|
||||
TsValveSafetyStatus valve_safety = {0};
|
||||
|
||||
extern uint8_t motor_flag;
|
||||
extern Shell shell;
|
||||
|
||||
|
@ -775,6 +800,94 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
|
|||
logDebug("Over current status !");
|
||||
}
|
||||
}
|
||||
|
||||
// 超温关阀功能:检测至少两个传感器的温度超过阈值
|
||||
if(!valve_safety.over_temp_flag && gValveData.switch_status == kOpened)
|
||||
{
|
||||
// 计算超过阈值的传感器数量
|
||||
uint8_t over_temp_count = 0;
|
||||
|
||||
// 检查三个传感器的温度是否超过阈值
|
||||
if(T[0] > SAFETY_OVER_TEMP_THRESHOLD) over_temp_count++;
|
||||
if(T[1] > SAFETY_OVER_TEMP_THRESHOLD) over_temp_count++;
|
||||
if(T[2] > SAFETY_OVER_TEMP_THRESHOLD) over_temp_count++;
|
||||
|
||||
// 如果至少有两个传感器超过阈值,触发关阀
|
||||
if(over_temp_count >= 2)
|
||||
{
|
||||
logDebug("Over temperature detected! T1=%d, T2=%d, T3=%d", T[0], T[1], T[2]);
|
||||
valve_safety.over_temp_flag = 1;
|
||||
motor_flag = 2; // 触发关阀
|
||||
}
|
||||
}
|
||||
|
||||
// 点火开阀功能:检测燃气灶打开但阀门关闭的情况
|
||||
// 当阀门关闭时,检测用气需求
|
||||
if(gValveData.switch_status == kClosed)
|
||||
{
|
||||
// 检测用气特征:出口压力比大气压低一定值,表示下游有用气需求
|
||||
// P[1]为出口压力,P[2]为大气压
|
||||
if(P[2] > P[1] && (P[2] - P[1] >= SAFETY_GAS_REQUEST_PRESS_DIFF))
|
||||
{
|
||||
valve_safety.auto_open_count++;
|
||||
logDebug("Auto open detect: %d", valve_safety.auto_open_count);
|
||||
|
||||
// 连续多次检测到用气需求,触发开阀
|
||||
if(valve_safety.auto_open_count >= SAFETY_AUTO_OPEN_THRESHOLD && !valve_safety.auto_open_flag)
|
||||
{
|
||||
logDebug("Auto opening valve due to gas usage detected!");
|
||||
valve_safety.auto_open_flag = 1;
|
||||
// 设置motor_flag为1,触发开阀
|
||||
motor_flag = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 重置计数器
|
||||
valve_safety.auto_open_count = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 阀门开启状态,重置检测计数和标志
|
||||
valve_safety.auto_open_count = 0;
|
||||
valve_safety.auto_open_flag = 0;
|
||||
}
|
||||
|
||||
// 微泄漏关阀功能:检测微小气流并自动关闭阀门
|
||||
// 当阀门打开时,检测微泄漏情况
|
||||
if(gValveData.switch_status == kOpened)
|
||||
{
|
||||
// 检测微泄漏特征:入口和出口压差非常小,但存在持续的小气流
|
||||
// P[0]为入口压力,P[1]为出口压力
|
||||
// 压差范围:大于0确保有流量,但小于阈值表示流量低于0.3L/min
|
||||
if(P[0] > P[1] && (P[0] - P[1] > 0) && (P[0] - P[1] < SAFETY_MICRO_LEAK_PRESS_DIFF))
|
||||
{
|
||||
valve_safety.micro_leak_count++;
|
||||
logDebug("Micro leak detect: %d, pressure diff: %d", valve_safety.micro_leak_count, P[0] - P[1]);
|
||||
|
||||
// 连续多次检测到微泄漏,触发关阀
|
||||
if(valve_safety.micro_leak_count >= SAFETY_MICRO_LEAK_THRESHOLD && !valve_safety.micro_leak_flag)
|
||||
{
|
||||
logDebug("Auto closing valve due to micro leak detected!");
|
||||
valve_safety.micro_leak_flag = 1;
|
||||
// 设置motor_flag为2,触发关阀
|
||||
motor_flag = 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 不满足微泄漏条件,重置计数器
|
||||
valve_safety.micro_leak_count = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 阀门关闭状态,重置检测计数和标志
|
||||
valve_safety.micro_leak_count = 0;
|
||||
valve_safety.micro_leak_flag = 0;
|
||||
}
|
||||
|
||||
//关灶关火 ^P很小,延时后关闭
|
||||
//^p与大气压
|
||||
}
|
||||
|
@ -797,6 +910,18 @@ uint16_t Check_ProcessEvent(uint8_t task_id, uint16_t events)
|
|||
LED_VALVE_CLOSE;
|
||||
VALVE_CLOSE();
|
||||
fault_state = 4;
|
||||
// 微泄漏关阀后重置标志
|
||||
if(valve_safety.micro_leak_flag)
|
||||
{
|
||||
valve_safety.micro_leak_flag = 0;
|
||||
logDebug("Micro leak protection activated");
|
||||
}
|
||||
// 超温关阀后重置标志
|
||||
if(valve_safety.over_temp_flag)
|
||||
{
|
||||
valve_safety.over_temp_flag = 0;
|
||||
logDebug("Over temperature protection activated");
|
||||
}
|
||||
logDebug("motor/LED close!!!");
|
||||
tmos_start_task(check_task_id, MOTOR_STOP_EVT, MS1_TO_SYSTEM_TIME(CHARGE_TIME_MS));
|
||||
}
|
||||
|
|
|
@ -338,9 +338,9 @@ void KEY_ProcessLoop(void)
|
|||
logDebug("motor_flag_start = %d",motor_flag);
|
||||
tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(KEY_IDLE_TIMEOUT_MS));
|
||||
}
|
||||
else if (press_count >= 2)
|
||||
else if (press_count == 2)
|
||||
{
|
||||
tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(KEY_IDLE_TIMEOUT_MS));
|
||||
// tmos_start_task(key_task_id, KEY_IDLE_TIMEOUT_EVT, MS1_TO_SYSTEM_TIME(KEY_IDLE_TIMEOUT_MS));
|
||||
if(gValveData.switch_status == kClosed)
|
||||
{
|
||||
motor_flag = 1;
|
||||
|
@ -360,7 +360,7 @@ void KEY_ProcessLoop(void)
|
|||
// motor_flag = 2;
|
||||
// logDebug("motor close");
|
||||
// }
|
||||
// press_count = 0;
|
||||
press_count = 0;
|
||||
}
|
||||
|
||||
tmos_set_event(key_task_id, KEY_SCAN_EVT);
|
||||
|
|
|
@ -196,6 +196,17 @@ static void VAVLE_Task_ProcessTmosMsg(uint8_t *p_rev_msg) // 处理TMOS消息函
|
|||
logDebug("kCmdOpenVavle");
|
||||
tmos_set_event(vavle_task_id, VAVLE_OPEN_START_EVT);
|
||||
break;
|
||||
case kCmdTimerCloseVavle: // 定时关阀命令
|
||||
logDebug("kCmdTimerCloseVavle");
|
||||
if (HostFrameData->len >= 2) {
|
||||
// 定时参数在data中,前2字节表示定时时间(分钟)
|
||||
uint16_t close_min = (HostFrameData->data[0] << 8) | HostFrameData->data[1];
|
||||
BSP_VALVE_StartTimerClose(close_min);
|
||||
} else {
|
||||
// 使用默认时间
|
||||
BSP_VALVE_StartTimerClose(VALVE_TIMER_CLOSE_DEFAULT_MIN);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
logError("Invalid command");
|
||||
break;
|
||||
|
@ -348,6 +359,27 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
|
|||
{
|
||||
tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT);
|
||||
}
|
||||
|
||||
// 检查定时关阀是否到时间
|
||||
if (gValveData.timer_close_enabled && gValveData.switch_status == kOpened)
|
||||
{
|
||||
uint32_t current_time = BSP_Get_Tick();
|
||||
uint32_t elapsed_ms = current_time - gValveData.timer_close_start_time;
|
||||
uint32_t timer_ms = (uint32_t)gValveData.timer_close_min * 60 * 1000;
|
||||
|
||||
if (elapsed_ms >= timer_ms)
|
||||
{
|
||||
// 时间到,触发关阀事件
|
||||
tmos_set_event(vavle_task_id, VAVLE_TIMER_CLOSE_EVT);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 剩余时间(分钟)
|
||||
uint16_t remain_min = (timer_ms - elapsed_ms) / (60 * 1000);
|
||||
logDebug("Timer close remaining: %d minutes", remain_min);
|
||||
}
|
||||
}
|
||||
|
||||
tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS));
|
||||
|
||||
return (events ^ VAVLE_LOOP_DECT_EVT);
|
||||
|
@ -382,6 +414,50 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events) // 阀
|
|||
return (events ^ VAVLE_LOW_VBAT_LED_OFF_EVT);
|
||||
}
|
||||
|
||||
// 定时关阀事件处理
|
||||
if (events & VAVLE_TIMER_CLOSE_EVT)
|
||||
{
|
||||
logDebug("VAVLE_TIMER_CLOSE_EVT");
|
||||
|
||||
// 关闭定时器
|
||||
BSP_VALVE_StopTimerClose();
|
||||
|
||||
// 如果阀门当前是打开状态,则触发关闭
|
||||
if (gValveData.switch_status == kOpened)
|
||||
{
|
||||
// 触发关阀事件
|
||||
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
|
||||
}
|
||||
|
||||
return (events ^ VAVLE_TIMER_CLOSE_EVT);
|
||||
}
|
||||
|
||||
// 定时关阀开始事件处理
|
||||
if (events & VAVLE_TIMER_CLOSE_START_EVT)
|
||||
{
|
||||
logDebug("VAVLE_TIMER_CLOSE_START_EVT");
|
||||
|
||||
// 记录开始时间
|
||||
gValveData.timer_close_start_time = BSP_Get_Tick();
|
||||
gValveData.timer_close_enabled = 1;
|
||||
|
||||
logDebug("Timer close started: %d minutes", gValveData.timer_close_min);
|
||||
|
||||
// 闪烁LED提示用户定时已设置(可选)
|
||||
LED_VALVE_CLOSE;
|
||||
DelayMs(200);
|
||||
if (gValveData.switch_status == kOpened)
|
||||
{
|
||||
LED_VALVE_OPEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
LED_VALVE_CLOSE;
|
||||
}
|
||||
|
||||
return (events ^ VAVLE_TIMER_CLOSE_START_EVT);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -398,9 +474,65 @@ void BSP_VAVLE_Init(void) // 阀门初始化函数
|
|||
gValveData.type = kTyq; // 设置阀门类型
|
||||
gValveData.bat = BSP_ReadVbat(); // 读取电池电压
|
||||
|
||||
// 初始化定时关阀状态变量
|
||||
gValveData.timer_close_enabled = 0;
|
||||
gValveData.timer_close_min = 0;
|
||||
gValveData.timer_close_start_time = 0;
|
||||
|
||||
BSP_MOTOR_Init(); // 初始化电机
|
||||
|
||||
tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(1000)); //VALVE_DECT_PERIOD_MS
|
||||
|
||||
logInfo("BSP_Valve_Init");
|
||||
}
|
||||
|
||||
void BSP_VALVE_StartTimerClose(uint16_t close_min)
|
||||
{
|
||||
if (close_min == 0)
|
||||
{
|
||||
// 关闭定时器
|
||||
BSP_VALVE_StopTimerClose();
|
||||
return;
|
||||
}
|
||||
|
||||
// 限制最大定时时间
|
||||
if (close_min > VALVE_TIMER_CLOSE_MAX_MIN)
|
||||
{
|
||||
close_min = VALVE_TIMER_CLOSE_MAX_MIN;
|
||||
}
|
||||
|
||||
// 设置定时参数
|
||||
gValveData.timer_close_min = close_min;
|
||||
|
||||
// 触发定时开始事件
|
||||
tmos_set_event(vavle_task_id, VAVLE_TIMER_CLOSE_START_EVT);
|
||||
|
||||
logDebug("BSP_VALVE_StartTimerClose: %d minutes", close_min);
|
||||
}
|
||||
|
||||
void BSP_VALVE_StopTimerClose(void)
|
||||
{
|
||||
gValveData.timer_close_enabled = 0;
|
||||
gValveData.timer_close_min = 0;
|
||||
|
||||
logDebug("BSP_VALVE_StopTimerClose");
|
||||
}
|
||||
|
||||
uint16_t BSP_VALVE_GetTimerCloseRemainMin(void)
|
||||
{
|
||||
if (!gValveData.timer_close_enabled)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t current_time = BSP_Get_Tick();
|
||||
uint32_t elapsed_ms = current_time - gValveData.timer_close_start_time;
|
||||
uint32_t timer_ms = (uint32_t)gValveData.timer_close_min * 60 * 1000;
|
||||
|
||||
if (elapsed_ms >= timer_ms)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (timer_ms - elapsed_ms) / (60 * 1000);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue