feat: 增加 Wi-Fi 配网按键防误触保护机制,优化长按检测逻辑
This commit is contained in:
@@ -48,6 +48,14 @@
|
|||||||
- 打开 `http://192.168.4.1`
|
- 打开 `http://192.168.4.1`
|
||||||
- 选择路由器并输入密码提交
|
- 选择路由器并输入密码提交
|
||||||
|
|
||||||
|
## 调试建议
|
||||||
|
|
||||||
|
- 若出现“按键未按下却进入配网”,通常是按键引脚与 LCD/外设复用导致电平抖动。
|
||||||
|
- 可在 `WiFi Connect` 配置中调大:
|
||||||
|
- `WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS`(建议 8000~10000)
|
||||||
|
- `WIFI_CONNECT_BUTTON_RELEASE_ARM_MS`(建议 300~500)
|
||||||
|
- 若硬件允许,优先给配网按键使用独立 GPIO,避免与屏幕复位脚复用。
|
||||||
|
|
||||||
## 当前状态
|
## 当前状态
|
||||||
|
|
||||||
项目已完成第一版配网闭环:
|
项目已完成第一版配网闭环:
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ static esp_lcd_panel_handle_t lcd_panel = NULL;
|
|||||||
static lv_display_t *lvgl_disp = NULL;
|
static lv_display_t *lvgl_disp = NULL;
|
||||||
static lv_obj_t *s_center_label = NULL;
|
static lv_obj_t *s_center_label = NULL;
|
||||||
|
|
||||||
|
#if EXAMPLE_LCD_ENABLE_COLOR_TEST
|
||||||
static esp_err_t app_lcd_color_test(void)
|
static esp_err_t app_lcd_color_test(void)
|
||||||
{
|
{
|
||||||
const size_t pixels = EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES;
|
const size_t pixels = EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES;
|
||||||
@@ -47,6 +48,7 @@ static esp_err_t app_lcd_color_test(void)
|
|||||||
ESP_LOGI(TAG, "LCD三色测试图已发送");
|
ESP_LOGI(TAG, "LCD三色测试图已发送");
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 初始化LCD硬件和SPI接口
|
* @brief 初始化LCD硬件和SPI接口
|
||||||
|
|||||||
@@ -24,6 +24,22 @@ config WIFI_CONNECT_LONG_PRESS_MS
|
|||||||
range 500 10000
|
range 500 10000
|
||||||
default 2000
|
default 2000
|
||||||
|
|
||||||
|
config WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS
|
||||||
|
int "Button startup guard time (ms)"
|
||||||
|
range 0 30000
|
||||||
|
default 5000
|
||||||
|
help
|
||||||
|
Ignore button long-press detection during startup guard window.
|
||||||
|
Useful when button pin is shared with other peripherals.
|
||||||
|
|
||||||
|
config WIFI_CONNECT_BUTTON_RELEASE_ARM_MS
|
||||||
|
int "Button release arm time (ms)"
|
||||||
|
range 20 2000
|
||||||
|
default 200
|
||||||
|
help
|
||||||
|
Require button to stay in released level for this duration
|
||||||
|
before long-press detection is armed.
|
||||||
|
|
||||||
config WIFI_CONNECT_CONNECT_TIMEOUT_SEC
|
config WIFI_CONNECT_CONNECT_TIMEOUT_SEC
|
||||||
int "Wi-Fi connect timeout (sec)"
|
int "Wi-Fi connect timeout (sec)"
|
||||||
range 5 180
|
range 5 180
|
||||||
|
|||||||
@@ -82,6 +82,8 @@ void app_main(void)
|
|||||||
- `WIFI_CONNECT_BUTTON_ACTIVE_LEVEL`:按键有效电平
|
- `WIFI_CONNECT_BUTTON_ACTIVE_LEVEL`:按键有效电平
|
||||||
- `WIFI_CONNECT_DEBOUNCE_MS`:按键去抖时间
|
- `WIFI_CONNECT_DEBOUNCE_MS`:按键去抖时间
|
||||||
- `WIFI_CONNECT_LONG_PRESS_MS`:长按触发时长
|
- `WIFI_CONNECT_LONG_PRESS_MS`:长按触发时长
|
||||||
|
- `WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS`:上电保护窗口(该时间内忽略长按检测)
|
||||||
|
- `WIFI_CONNECT_BUTTON_RELEASE_ARM_MS`:松手解锁时间(先稳定松手再允许长按触发)
|
||||||
- `WIFI_CONNECT_CONNECT_TIMEOUT_SEC`:连接路由器超时
|
- `WIFI_CONNECT_CONNECT_TIMEOUT_SEC`:连接路由器超时
|
||||||
- `WIFI_CONNECT_IDLE_TIMEOUT_SEC`:配网页面空闲超时
|
- `WIFI_CONNECT_IDLE_TIMEOUT_SEC`:配网页面空闲超时
|
||||||
- `WIFI_CONNECT_MAX_SCAN_RESULTS`:扫描网络最大数量
|
- `WIFI_CONNECT_MAX_SCAN_RESULTS`:扫描网络最大数量
|
||||||
@@ -120,6 +122,13 @@ void app_main(void)
|
|||||||
- 检查路由器是否禁用了新设备接入
|
- 检查路由器是否禁用了新设备接入
|
||||||
- 若曾保存过旧配置,可先在页面点击“清除已保存”后再重试
|
- 若曾保存过旧配置,可先在页面点击“清除已保存”后再重试
|
||||||
|
|
||||||
|
### 4) 按键未按下却误触发配网
|
||||||
|
|
||||||
|
- 常见原因是按键引脚与 LCD/外设复用,初始化期间电平抖动被误判为长按
|
||||||
|
- 可增大 `WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS`(如 8000~10000)
|
||||||
|
- 可增大 `WIFI_CONNECT_BUTTON_RELEASE_ARM_MS`(如 300~500)
|
||||||
|
- 若硬件允许,优先给配网按键使用独立 GPIO
|
||||||
|
|
||||||
### 3) 成功后热点消失是否正常
|
### 3) 成功后热点消失是否正常
|
||||||
|
|
||||||
- 正常。组件设计为连接成功后自动关闭配网热点
|
- 正常。组件设计为连接成功后自动关闭配网热点
|
||||||
|
|||||||
@@ -33,6 +33,14 @@
|
|||||||
|
|
||||||
#define WIFI_CONNECT_HTTP_BUF_SIZE 256
|
#define WIFI_CONNECT_HTTP_BUF_SIZE 256
|
||||||
|
|
||||||
|
#ifndef CONFIG_WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS
|
||||||
|
#define CONFIG_WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS 5000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_WIFI_CONNECT_BUTTON_RELEASE_ARM_MS
|
||||||
|
#define CONFIG_WIFI_CONNECT_BUTTON_RELEASE_ARM_MS 200
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char *TAG = "wifi_connect";
|
static const char *TAG = "wifi_connect";
|
||||||
|
|
||||||
static void wifi_connect_log_state_i(const char *state, const char *detail)
|
static void wifi_connect_log_state_i(const char *state, const char *detail)
|
||||||
@@ -984,11 +992,18 @@ static void wifi_connect_button_task(void *arg)
|
|||||||
(void)arg;
|
(void)arg;
|
||||||
|
|
||||||
const TickType_t interval = pdMS_TO_TICKS(CONFIG_WIFI_CONNECT_DEBOUNCE_MS);
|
const TickType_t interval = pdMS_TO_TICKS(CONFIG_WIFI_CONNECT_DEBOUNCE_MS);
|
||||||
|
const TickType_t startup_guard_ticks = pdMS_TO_TICKS(CONFIG_WIFI_CONNECT_BUTTON_STARTUP_GUARD_MS);
|
||||||
|
const TickType_t release_arm_ticks = pdMS_TO_TICKS(CONFIG_WIFI_CONNECT_BUTTON_RELEASE_ARM_MS);
|
||||||
int stable_level = gpio_get_level(CONFIG_WIFI_CONNECT_BUTTON_GPIO);
|
int stable_level = gpio_get_level(CONFIG_WIFI_CONNECT_BUTTON_GPIO);
|
||||||
int last_level = stable_level;
|
int last_level = stable_level;
|
||||||
TickType_t changed_at = xTaskGetTickCount();
|
TickType_t changed_at = xTaskGetTickCount();
|
||||||
TickType_t low_since = 0;
|
TickType_t low_since = 0;
|
||||||
|
TickType_t released_since = 0;
|
||||||
|
TickType_t startup_at = changed_at;
|
||||||
bool triggered = false;
|
bool triggered = false;
|
||||||
|
bool armed = false;
|
||||||
|
|
||||||
|
wifi_connect_log_state_i("按键防误触保护", "已启用上电保护窗口与松手解锁机制");
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
vTaskDelay(interval);
|
vTaskDelay(interval);
|
||||||
@@ -1004,17 +1019,31 @@ static void wifi_connect_button_task(void *arg)
|
|||||||
stable_level = level;
|
stable_level = level;
|
||||||
if (stable_level == CONFIG_WIFI_CONNECT_BUTTON_ACTIVE_LEVEL) {
|
if (stable_level == CONFIG_WIFI_CONNECT_BUTTON_ACTIVE_LEVEL) {
|
||||||
low_since = now;
|
low_since = now;
|
||||||
|
released_since = 0;
|
||||||
triggered = false;
|
triggered = false;
|
||||||
} else {
|
} else {
|
||||||
low_since = 0;
|
low_since = 0;
|
||||||
|
released_since = now;
|
||||||
triggered = false;
|
triggered = false;
|
||||||
|
armed = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stable_level == CONFIG_WIFI_CONNECT_BUTTON_ACTIVE_LEVEL && low_since != 0 && !triggered) {
|
if (!armed && stable_level != CONFIG_WIFI_CONNECT_BUTTON_ACTIVE_LEVEL && released_since != 0) {
|
||||||
|
if ((now - released_since) >= release_arm_ticks) {
|
||||||
|
armed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((now - startup_at) < startup_guard_ticks) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (armed && stable_level == CONFIG_WIFI_CONNECT_BUTTON_ACTIVE_LEVEL && low_since != 0 && !triggered) {
|
||||||
TickType_t held = now - low_since;
|
TickType_t held = now - low_since;
|
||||||
if (held >= pdMS_TO_TICKS(CONFIG_WIFI_CONNECT_LONG_PRESS_MS)) {
|
if (held >= pdMS_TO_TICKS(CONFIG_WIFI_CONNECT_LONG_PRESS_MS)) {
|
||||||
triggered = true;
|
triggered = true;
|
||||||
|
armed = false;
|
||||||
wifi_connect_log_state_i("检测到按键长按", "开始进入配网模式");
|
wifi_connect_log_state_i("检测到按键长按", "开始进入配网模式");
|
||||||
wifi_connect_start();
|
wifi_connect_start();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user