shuichan_new/STM32F103_App1/HardWare/RELAY/relay.h

94 lines
3.0 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.

#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