功能:添加 Wi-Fi 连接管理组件
在 wifi-connect.c 中实现了新的 Wi-Fi 连接管理模块,负责配网、连接及状态上报。 添加了用于 Wi-Fi 配置和状态显示的 HTML 界面。 集成了 NVS 用于存储 Wi-Fi 凭证。 更新了 CMakeLists.txt 以包含新模块的依赖项。 修改了 main.c 以初始化 Wi-Fi 连接管理并等待连接成功。
This commit is contained in:
3
components/relay_ctrl/CMakeLists.txt
Normal file
3
components/relay_ctrl/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
idf_component_register(SRCS "relay_ctrl.c"
|
||||
INCLUDE_DIRS "include"
|
||||
REQUIRES esp_driver_gpio)
|
||||
63
components/relay_ctrl/include/relay_ctrl.h
Normal file
63
components/relay_ctrl/include/relay_ctrl.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "driver/gpio.h"
|
||||
#include "esp_err.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
RELAY_CTRL_ID_1 = 0,
|
||||
RELAY_CTRL_ID_2 = 1,
|
||||
RELAY_CTRL_ID_3 = 2,
|
||||
RELAY_CTRL_ID_4 = 3,
|
||||
RELAY_CTRL_ID_MAX,
|
||||
} relay_ctrl_id_t;
|
||||
|
||||
/**
|
||||
* @brief 初始化四路继电器控制模块。
|
||||
*
|
||||
* @param relay1_gpio 继电器1控制引脚
|
||||
* @param relay2_gpio 继电器2控制引脚
|
||||
* @param relay3_gpio 继电器3控制引脚
|
||||
* @param relay4_gpio 继电器4控制引脚
|
||||
* @param active_high 继电器有效电平,true=高电平吸合,false=低电平吸合
|
||||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
* @brief 设置指定继电器状态。
|
||||
*
|
||||
* @param relay_id 继电器编号
|
||||
* @param on true=吸合,false=断开
|
||||
*/
|
||||
esp_err_t relay_ctrl_set(relay_ctrl_id_t relay_id, bool on);
|
||||
|
||||
/**
|
||||
* @brief 翻转指定继电器状态。
|
||||
*/
|
||||
esp_err_t relay_ctrl_toggle(relay_ctrl_id_t relay_id);
|
||||
|
||||
/**
|
||||
* @brief 获取指定继电器状态。
|
||||
*
|
||||
* @param relay_id 继电器编号
|
||||
* @param on_out [out] 当前逻辑状态,true=吸合,false=断开
|
||||
*/
|
||||
esp_err_t relay_ctrl_get(relay_ctrl_id_t relay_id, bool *on_out);
|
||||
|
||||
/**
|
||||
* @brief 一次性设置四个继电器状态。
|
||||
*/
|
||||
esp_err_t relay_ctrl_set_all(bool relay1_on, bool relay2_on, bool relay3_on, bool relay4_on);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
128
components/relay_ctrl/relay_ctrl.c
Normal file
128
components/relay_ctrl/relay_ctrl.c
Normal file
@@ -0,0 +1,128 @@
|
||||
#include "relay_ctrl.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "esp_check.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
static const char *TAG = "relay_ctrl";
|
||||
|
||||
typedef struct {
|
||||
bool inited;
|
||||
bool active_high;
|
||||
gpio_num_t pins[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)
|
||||
{
|
||||
return (on == s_ctx.active_high) ? 1 : 0;
|
||||
}
|
||||
|
||||
static esp_err_t relay_validate_id(relay_ctrl_id_t relay_id)
|
||||
{
|
||||
ESP_RETURN_ON_FALSE(relay_id >= RELAY_CTRL_ID_1 && relay_id < RELAY_CTRL_ID_MAX,
|
||||
ESP_ERR_INVALID_ARG, TAG, "invalid 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_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]);
|
||||
}
|
||||
|
||||
const gpio_config_t io_cfg = {
|
||||
.pin_bit_mask = pin_bit_mask,
|
||||
.mode = GPIO_MODE_OUTPUT,
|
||||
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
||||
.pull_up_en = GPIO_PULLUP_DISABLE,
|
||||
.intr_type = GPIO_INTR_DISABLE,
|
||||
};
|
||||
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");
|
||||
}
|
||||
|
||||
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);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
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");
|
||||
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));
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
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]);
|
||||
}
|
||||
|
||||
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");
|
||||
ESP_RETURN_ON_ERROR(relay_ctrl_set(RELAY_CTRL_ID_4, relay4_on), TAG, "set relay4 failed");
|
||||
return ESP_OK;
|
||||
}
|
||||
Reference in New Issue
Block a user