完成继电器三个通道的设置,还有1通道引脚占用错误要修改

This commit is contained in:
Wang Beihong
2026-04-20 23:48:54 +08:00
parent f426d52175
commit fc906db35f
4 changed files with 60 additions and 117 deletions

View File

@@ -1,7 +1,5 @@
#include "relay_ctrl.h"
#include <stdint.h>
#include "esp_check.h"
#include "esp_log.h"
@@ -9,16 +7,15 @@ static const char *TAG = "relay_ctrl";
typedef struct {
bool inited;
bool active_high;
gpio_num_t pins[RELAY_CTRL_ID_MAX];
relay_config_t config[RELAY_CTRL_ID_MAX];
bool states[RELAY_CTRL_ID_MAX];
} relay_ctx_t;
static relay_ctx_t s_ctx;
static inline int relay_level_from_state(bool on)
static inline int relay_level_from_state(int id, bool on)
{
return (on == s_ctx.active_high) ? 1 : 0;
return (on == s_ctx.config[id].active_high) ? 1 : 0;
}
static esp_err_t relay_validate_id(relay_ctrl_id_t relay_id)
@@ -28,30 +25,16 @@ static esp_err_t relay_validate_id(relay_ctrl_id_t relay_id)
return ESP_OK;
}
esp_err_t relay_ctrl_init(gpio_num_t relay1_gpio,
gpio_num_t relay2_gpio,
gpio_num_t relay3_gpio,
gpio_num_t relay4_gpio,
bool active_high)
esp_err_t relay_ctrl_init(const relay_config_t config[RELAY_CTRL_ID_MAX])
{
ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(relay1_gpio), ESP_ERR_INVALID_ARG, TAG, "relay1 gpio invalid");
ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(relay2_gpio), ESP_ERR_INVALID_ARG, TAG, "relay2 gpio invalid");
ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(relay3_gpio), ESP_ERR_INVALID_ARG, TAG, "relay3 gpio invalid");
ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(relay4_gpio), ESP_ERR_INVALID_ARG, TAG, "relay4 gpio invalid");
const gpio_num_t relay_gpios[RELAY_CTRL_ID_MAX] = {
relay1_gpio,
relay2_gpio,
relay3_gpio,
relay4_gpio,
};
s_ctx.active_high = active_high;
uint64_t pin_bit_mask = 0;
for (int i = 0; i < RELAY_CTRL_ID_MAX; ++i) {
s_ctx.pins[i] = relay_gpios[i];
pin_bit_mask |= (1ULL << relay_gpios[i]);
ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(config[i].pin),
ESP_ERR_INVALID_ARG, TAG, "relay gpio invalid");
s_ctx.config[i] = config[i];
pin_bit_mask |= (1ULL << config[i].pin);
}
const gpio_config_t io_cfg = {
@@ -63,22 +46,15 @@ esp_err_t relay_ctrl_init(gpio_num_t relay1_gpio,
};
ESP_RETURN_ON_ERROR(gpio_config(&io_cfg), TAG, "relay gpio config failed");
// 默认上电全部断开
// 根据每个继电器的配置设置初始电平(默认关闭)
for (int i = 0; i < RELAY_CTRL_ID_MAX; ++i) {
s_ctx.states[i] = false;
ESP_RETURN_ON_ERROR(gpio_set_level(relay_gpios[i], relay_level_from_state(false)),
TAG,
"relay set init level failed");
ESP_RETURN_ON_ERROR(gpio_set_level(s_ctx.config[i].pin, relay_level_from_state(i, false)),
TAG, "relay set init level failed");
}
s_ctx.inited = true;
ESP_LOGI(TAG,
"继电器初始化完成: relay1=GPIO%d relay2=GPIO%d relay3=GPIO%d relay4=GPIO%d active_high=%d",
relay1_gpio,
relay2_gpio,
relay3_gpio,
relay4_gpio,
active_high);
ESP_LOGI(TAG, "继电器初始化完成(独立电平配置已应用)");
return ESP_OK;
}
@@ -87,15 +63,14 @@ esp_err_t relay_ctrl_set(relay_ctrl_id_t relay_id, bool on)
ESP_RETURN_ON_FALSE(s_ctx.inited, ESP_ERR_INVALID_STATE, TAG, "relay not initialized");
ESP_RETURN_ON_ERROR(relay_validate_id(relay_id), TAG, "invalid relay id");
ESP_RETURN_ON_ERROR(gpio_set_level(s_ctx.pins[relay_id], relay_level_from_state(on)),
TAG,
"relay set level failed");
ESP_RETURN_ON_ERROR(gpio_set_level(s_ctx.config[relay_id].pin, relay_level_from_state(relay_id, on)),
TAG, "relay set level failed");
s_ctx.states[relay_id] = on;
ESP_LOGI(TAG, "继电器%d -> %s (GPIO%d level=%d)",
relay_id + 1,
on ? "ON" : "OFF",
s_ctx.pins[relay_id],
relay_level_from_state(on));
relay_id + 1, on ? "ON" : "OFF",
s_ctx.config[relay_id].pin,
relay_level_from_state(relay_id, on));
return ESP_OK;
}
@@ -103,7 +78,6 @@ esp_err_t relay_ctrl_toggle(relay_ctrl_id_t relay_id)
{
ESP_RETURN_ON_FALSE(s_ctx.inited, ESP_ERR_INVALID_STATE, TAG, "relay not initialized");
ESP_RETURN_ON_ERROR(relay_validate_id(relay_id), TAG, "invalid relay id");
return relay_ctrl_set(relay_id, !s_ctx.states[relay_id]);
}
@@ -112,14 +86,12 @@ esp_err_t relay_ctrl_get(relay_ctrl_id_t relay_id, bool *on_out)
ESP_RETURN_ON_FALSE(s_ctx.inited, ESP_ERR_INVALID_STATE, TAG, "relay not initialized");
ESP_RETURN_ON_FALSE(on_out != NULL, ESP_ERR_INVALID_ARG, TAG, "on_out is null");
ESP_RETURN_ON_ERROR(relay_validate_id(relay_id), TAG, "invalid relay id");
*on_out = s_ctx.states[relay_id];
return ESP_OK;
}
esp_err_t relay_ctrl_set_all(bool relay1_on, bool relay2_on, bool relay3_on, bool relay4_on)
{
ESP_RETURN_ON_FALSE(s_ctx.inited, ESP_ERR_INVALID_STATE, TAG, "relay not initialized");
ESP_RETURN_ON_ERROR(relay_ctrl_set(RELAY_CTRL_ID_1, relay1_on), TAG, "set relay1 failed");
ESP_RETURN_ON_ERROR(relay_ctrl_set(RELAY_CTRL_ID_2, relay2_on), TAG, "set relay2 failed");
ESP_RETURN_ON_ERROR(relay_ctrl_set(RELAY_CTRL_ID_3, relay3_on), TAG, "set relay3 failed");