#ifndef RELAY_H #define RELAY_H #include "main.h" /* 4路继电器控制引脚定义: PB7, PB8, PC0, PC2 */ #define Relay1_Pin GPIO_PIN_7 #define Relay2_Pin GPIO_PIN_8 #define Relay3_Pin GPIO_PIN_0 #define Relay4_Pin GPIO_PIN_2 #define Relay1_Port GPIOB #define Relay2_Port GPIOB #define Relay3_Port GPIOC #define Relay4_Port GPIOC /* 继电器控制宏, 高电平吸合, 低电平释放 */ #define Relay1_ON HAL_GPIO_WritePin(Relay1_Port, Relay1_Pin, GPIO_PIN_SET) #define Relay1_OFF HAL_GPIO_WritePin(Relay1_Port, Relay1_Pin, GPIO_PIN_RESET) #define Relay2_ON HAL_GPIO_WritePin(Relay2_Port, Relay2_Pin, GPIO_PIN_SET) #define Relay2_OFF HAL_GPIO_WritePin(Relay2_Port, Relay2_Pin, GPIO_PIN_RESET) #define Relay3_ON HAL_GPIO_WritePin(Relay3_Port, Relay3_Pin, GPIO_PIN_SET) #define Relay3_OFF HAL_GPIO_WritePin(Relay3_Port, Relay3_Pin, GPIO_PIN_RESET) #define Relay4_ON HAL_GPIO_WritePin(Relay4_Port, Relay4_Pin, GPIO_PIN_SET) #define Relay4_OFF HAL_GPIO_WritePin(Relay4_Port, Relay4_Pin, GPIO_PIN_RESET) /* 4路继电器反馈输入引脚定义: PB6, PB9, PC1, PC3 */ #define Relay1_FB_Pin GPIO_PIN_6 #define Relay2_FB_Pin GPIO_PIN_9 #define Relay3_FB_Pin GPIO_PIN_1 #define Relay4_FB_Pin GPIO_PIN_3 #define Relay1_FB_Port GPIOB #define Relay2_FB_Port GPIOB #define Relay3_FB_Port GPIOC #define Relay4_FB_Port GPIOC /* 反馈电平定义: 继电器吸合后反馈输出高电平, 释放后输出低电平 */ #define FB_ACTIVE GPIO_PIN_SET #define FB_INACTIVE GPIO_PIN_RESET /* 手动模式检测引脚: PA8, 高电平=手动模式, 低电平=正常模式 */ #define MANUAL_MODE_Pin GPIO_PIN_8 #define MANUAL_MODE_Port GPIOA #define MANUAL_MODE_ACTIVE GPIO_PIN_SET /* 反馈检测总开关: 0=禁用反馈检测, 任何情况都返回正常 */ #define RELAY_FB_ENABLE 1 /* 继电器反馈状态枚举 */ typedef enum { RELAY_OK = 0, /* 反馈正常 */ RELAY_FAIL_OPEN, /* 反馈未正常吸合 */ RELAY_FAIL_STUCK, /* 反馈未正常释放 */ RELAY_UNKNOWN /* 未知状态 */ } RelayStatus; /* 继电器初始化 */ void relayInit(void); /* 网络连接成功后, 从 EEPROM 恢复继电器上一次状态 */ void relayRestoreState(void); /* 执行MQTT下发的继电器控制命令 */ void relayAction(uint8_t *data); #define relay_action relayAction /* 上报继电器状态到平台 */ void relayStatueUpdata(void); /* 读取 PA8 手动模式输入: 1=手动模式, 0=正常模式 */ int relayIsManualMode(void); /* 读取指定继电器反馈引脚原始电平 */ GPIO_PinState relayReadFb(uint8_t ch); /* 设置指定继电器开关状态(只写 GPIO + Relay_State,不碰 EEPROM/网络) */ void relaySet(uint8_t ch, uint8_t on); /* 请求一次状态上报(置 relay_report_pending,由主循环延时统一上报) */ void relayRequestReport(void); /* 命令执行后状态上报标志, 主循环检测到后延时上报 */ extern volatile uint8_t relay_report_pending; extern volatile uint32_t relay_report_tick; /* 继电器命令响应阶段控制: 0: 空闲 1: 已动作, 等待反馈稳定 2: 反馈已读, 已发送 response 和 status, 结束 */ extern volatile uint8_t relay_cmd_stage; extern volatile uint32_t relay_cmd_tick; extern volatile uint8_t relay_cmd_ch; extern volatile GPIO_PinState relay_cmd_fb_before; extern char relay_cmd_id[20]; /* 运行继电器命令响应状态机,由主循环每轮调用 */ void relayCmdProcess(void); #endif