feat: 增加 Wi-Fi 配网按键防误触保护机制,优化长按检测逻辑

This commit is contained in:
Wang Beihong
2026-03-05 15:31:30 +08:00
parent c2c49cc672
commit ebde114be6
5 changed files with 65 additions and 1 deletions

View File

@@ -20,6 +20,7 @@ static esp_lcd_panel_handle_t lcd_panel = NULL;
static lv_display_t *lvgl_disp = NULL;
static lv_obj_t *s_center_label = NULL;
#if EXAMPLE_LCD_ENABLE_COLOR_TEST
static esp_err_t app_lcd_color_test(void)
{
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三色测试图已发送");
return ESP_OK;
}
#endif
/**
* @brief 初始化LCD硬件和SPI接口

View File

@@ -24,6 +24,22 @@ config WIFI_CONNECT_LONG_PRESS_MS
range 500 10000
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
int "Wi-Fi connect timeout (sec)"
range 5 180

View File

@@ -82,6 +82,8 @@ void app_main(void)
- `WIFI_CONNECT_BUTTON_ACTIVE_LEVEL`:按键有效电平
- `WIFI_CONNECT_DEBOUNCE_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_IDLE_TIMEOUT_SEC`:配网页面空闲超时
- `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) 成功后热点消失是否正常
- 正常。组件设计为连接成功后自动关闭配网热点

View File

@@ -33,6 +33,14 @@
#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 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;
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 last_level = stable_level;
TickType_t changed_at = xTaskGetTickCount();
TickType_t low_since = 0;
TickType_t released_since = 0;
TickType_t startup_at = changed_at;
bool triggered = false;
bool armed = false;
wifi_connect_log_state_i("按键防误触保护", "已启用上电保护窗口与松手解锁机制");
while (true) {
vTaskDelay(interval);
@@ -1004,17 +1019,31 @@ static void wifi_connect_button_task(void *arg)
stable_level = level;
if (stable_level == CONFIG_WIFI_CONNECT_BUTTON_ACTIVE_LEVEL) {
low_since = now;
released_since = 0;
triggered = false;
} else {
low_since = 0;
released_since = now;
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;
if (held >= pdMS_TO_TICKS(CONFIG_WIFI_CONNECT_LONG_PRESS_MS)) {
triggered = true;
armed = false;
wifi_connect_log_state_i("检测到按键长按", "开始进入配网模式");
wifi_connect_start();
}