From ebde114be641ae4f73dd1ddd728251a9e7630dc5 Mon Sep 17 00:00:00 2001 From: Wang Beihong Date: Thu, 5 Mar 2026 15:31:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20Wi-Fi=20=E9=85=8D?= =?UTF-8?q?=E7=BD=91=E6=8C=89=E9=94=AE=E9=98=B2=E8=AF=AF=E8=A7=A6=E4=BF=9D?= =?UTF-8?q?=E6=8A=A4=E6=9C=BA=E5=88=B6=EF=BC=8C=E4=BC=98=E5=8C=96=E9=95=BF?= =?UTF-8?q?=E6=8C=89=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++ .../lvgl_st7735s_use/lvgl_st7735s_use.c | 2 ++ components/wifi-connect/Kconfig.projbuild | 16 ++++++++++ components/wifi-connect/README.md | 9 ++++++ components/wifi-connect/wifi-connect.c | 31 ++++++++++++++++++- 5 files changed, 65 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eb4be13..97309ee 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,14 @@ - 打开 `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,避免与屏幕复位脚复用。 + ## 当前状态 项目已完成第一版配网闭环: diff --git a/components/lvgl_st7735s_use/lvgl_st7735s_use.c b/components/lvgl_st7735s_use/lvgl_st7735s_use.c index efdacb8..a6393c1 100644 --- a/components/lvgl_st7735s_use/lvgl_st7735s_use.c +++ b/components/lvgl_st7735s_use/lvgl_st7735s_use.c @@ -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接口 diff --git a/components/wifi-connect/Kconfig.projbuild b/components/wifi-connect/Kconfig.projbuild index 48475a7..da00d93 100644 --- a/components/wifi-connect/Kconfig.projbuild +++ b/components/wifi-connect/Kconfig.projbuild @@ -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 diff --git a/components/wifi-connect/README.md b/components/wifi-connect/README.md index e58d9ad..55f14d2 100644 --- a/components/wifi-connect/README.md +++ b/components/wifi-connect/README.md @@ -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) 成功后热点消失是否正常 - 正常。组件设计为连接成功后自动关闭配网热点 diff --git a/components/wifi-connect/wifi-connect.c b/components/wifi-connect/wifi-connect.c index 7858a9a..a6aeb35 100644 --- a/components/wifi-connect/wifi-connect.c +++ b/components/wifi-connect/wifi-connect.c @@ -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(); }