#include "Driver.h" uint8_t device_status[13] = {0}; // 初始化所有状态为0 static uint8_t led1_status = 0; // LED1 状态标志位,0 表示灭,1 表示亮 uint8_t biaozhi=0; //水泵的水量 uint32_t pump_flow = 0; // 5分钟内的累计流量 uint8_t pump_running = 0; // 水泵运行状态 uint32_t last_upload_time = 0; // 上次上传时间 uint32_t flow_to_upload = 0; // 需要上传的流量值 uint8_t flow_need_upload = 0; // 新增:流量上传标志位 //状态上传 Device_Fault_t device_fault = {0}; // 初始化故障状态 void LED1_Control(uint8_t state) { // 设置 LED 状态 HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, state ? GPIO_PIN_SET : GPIO_PIN_RESET); // 更新标志位 led1_status = state; // 更新标志位为当前状态 // 可选:打印当前状态 // printf("LED1: %s\n", state ? "ON" : "OFF"); } //水泵运行控制 // 已知水泵流量是每小时1200升,那么: // 每分钟流量 = 1200升/60分钟 = 20升/分钟 // 水泵控制函数 // 添加全局变量 // 添加全局变量来保存累计流量 //static uint32_t total_flow = 0; // 添加这个变量来保存总流量 void Control_WaterPump(uint8_t state) { if(state) // 水泵启动 { HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_SET); // 添加调试信息 // printf("水泵启动 - GPIOG_PIN1设置为高电平\r\n"); } else // 水泵停止 { HAL_GPIO_WritePin(GPIOG, GPIO_PIN_1, GPIO_PIN_RESET); // 添加调试信息 // printf("水泵停止 - GPIOG_PIN1设置为低电平\r\n"); } } //风机1控制 void Control_Fan1(uint8_t state) { if(state) HAL_GPIO_WritePin(GPIOG, GPIO_PIN_2, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOG, GPIO_PIN_2, GPIO_PIN_RESET); } //风机2控制 void Control_Fan2(uint8_t state) { if(state) HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_RESET); } // 控制臭氧开关 void Ozone_Control(uint8_t state) { if(state) { HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_SET); // 开启臭氧 // printf("臭氧已开启\n"); } else { HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6, GPIO_PIN_RESET); // 关闭臭氧 // printf("臭氧已关闭\n"); } } void Control_Heater(uint8_t state) { HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, state ? GPIO_PIN_SET : GPIO_PIN_RESET); // printf("加热膜: %s\n", state ? "开启" : "关闭"); } // 在 Driver.c 中添加除磷控制函数 // 极板1控制(PE2) void Control_Plate1(uint8_t state) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, state ? GPIO_PIN_SET : GPIO_PIN_RESET); device_status[9] = state; // 更新极板1状态 } // 极板2控制(PE3) void Control_Plate2(uint8_t state) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, state ? GPIO_PIN_SET : GPIO_PIN_RESET); device_status[10] = state; // 更新极板2状态 } void Control_Phosphorus(uint8_t state) { if(state) { // 同时开启两个极板 Control_Plate1(1); Control_Plate2(1); } else { // 同时关闭两个极板 Control_Plate1(0); Control_Plate2(0); } } // 读取除磷状态(任一极板运行即返回1) uint8_t Read_Phosphorus_Status(void) { return (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_2) || HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3)); } // 添加获取状态的函数 uint8_t Read_LED1_Status(void) { return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_13); } uint8_t Read_WaterPump_Status(void) { return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_1); } uint8_t Read_Fan1_Status(void) { return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_2); } uint8_t Read_Fan2_Status(void) { return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_3); } // Read_FloatBall函数保持不变 uint8_t Read_FloatBall(void) { return (uint8_t)HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5); } // 获取臭氧状态 uint8_t Ozone_GetState(void) { return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_6); } uint8_t Read_Heater_Status(void) { return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_9); } uint8_t Read_MainPower(void) { return HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_2); // 返回 0 或 1 } // uint8_t Read_Dredge_Status(void) { return HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_4); } // 添加全局变量来保存累计流量 // 总开关控制函数 void Control_All_Devices(CmdState_t cmd) { if (cmd == CMD_ON) // 开机 { // 清除强制关闭标志,允许设备运行 force_pump_off = 0; force_fan_off = 0; // 不强制切换模式,保持当前模式 // 如果需要切换模式,应该通过其他命令来实现 } else if (cmd == CMD_OFF) // 关机 { // 保存当前模式 WorkMode current_mode_backup = current_mode; // 关闭所有外设 Control_WaterPump(0); Control_Fan1(0); Control_Fan2(0); Control_Heater(0); Ozone_Control(0); // 设置强制关闭标志 force_pump_off = 1; force_fan_off = 1; // 保持当前模式不变 current_mode = current_mode_backup; } } void Update_All_Status(void) { device_status[0] = led1_status; // LED1状态 device_status[1] = Read_WaterPump_Status(); // 水泵状态 device_status[2] = Read_Fan1_Status(); // 风机1状态 device_status[3] = Read_Fan2_Status(); // 风机2状态 device_status[4] = Ozone_GetState(); // 臭氧状态 device_status[5] = Read_FloatBall(); // 浮球状态 device_status[7] = Read_Heater_Status(); // 浮球状态 device_status[8] = Read_MainPower(); // 市电状态 device_status[9] = Read_Phosphorus_Status(); //除磷状态 device_status[10] =Read_Dredge_Status(); //除磷状态 // device_status[11] = flow_to_upload; } // 水泵故障检测函数 // 正确的检测函数 void Check_Pump_Fault(void) { static uint32_t check_timer = 0; uint8_t actual_status = Read_WaterPump_Status(); // 读取实际状态 // 比较控制命令和实际状态 if(1 != actual_status) // 如果实际状态与期望状态(1)不一致 { check_timer++; if(check_timer >= 10) // 10秒后仍不一致则判定为故障 { device_fault.pump_fault = 1; // 1代表故障 // printf("水泵故障!\r\n"); } } else // 状态一致,表示正常运行 { check_timer = 0; // 重置计时器 device_fault.pump_fault = 0; // 0代表正常 // printf("水泵正常运行\r\n"); } } // 风机1故障检测 void Check_Fan1_Fault(void) { static uint32_t check_timer = 0; static uint8_t last_status = 0; uint8_t current_status = Read_Fan1_Status(); // 读取风机1当前状态 if(current_status != last_status) { check_timer++; if(check_timer >= 10) // 10秒后仍异常则判定为故障 { device_fault.fan1_fault = 1; // printf("风机1故障!\r\n"); } } else { check_timer = 0; device_fault.fan1_fault = 0; } last_status = current_status; } // 风机2故障检测 void Check_Fan2_Fault(void) { static uint32_t check_timer = 0; static uint8_t last_status = 0; uint8_t current_status = Read_Fan2_Status(); // 读取风机2当前状态 if(current_status != last_status) { check_timer++; if(check_timer >= 10) // 10秒后仍异常则判定为故障 { device_fault.fan2_fault = 1; // printf("风机2故障!\r\n"); } } else { check_timer = 0; device_fault.fan2_fault = 0; } last_status = current_status; }