#ifndef RELAY_H #define RELAY_H #include "main.h" /* 4路继电器控制引脚定义: PC2, PA1, PB12, PB1 (V1.7.0 新板) */ #define Relay1_Pin GPIO_PIN_2 #define Relay2_Pin GPIO_PIN_1 #define Relay3_Pin GPIO_PIN_12 #define Relay4_Pin GPIO_PIN_1 #define Relay1_Port GPIOC #define Relay2_Port GPIOA #define Relay3_Port GPIOB #define Relay4_Port GPIOB /* 继电器控制宏, 高电平吸合, 低电平释放 */ #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路继电器反馈输入引脚定义: PC0, PC3, PC5, PB0 (V1.7.0 新板) */ #define Relay1_FB_Pin GPIO_PIN_0 #define Relay2_FB_Pin GPIO_PIN_3 #define Relay3_FB_Pin GPIO_PIN_5 #define Relay4_FB_Pin GPIO_PIN_0 #define Relay1_FB_Port GPIOC #define Relay2_FB_Port GPIOC #define Relay3_FB_Port GPIOC #define Relay4_FB_Port GPIOB /* 反馈电平定义: 继电器吸合后反馈输出高电平, 释放后输出低电平 */ #define FB_ACTIVE GPIO_PIN_SET #define FB_INACTIVE GPIO_PIN_RESET /* 反馈检测总开关: 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); /* 读取指定继电器反馈引脚原始电平 */ 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