huyongji1.1-system/Driver/Driver.c

314 lines
7.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}