feat: 增加 Wi-Fi 配网按键防误触保护机制,优化长按检测逻辑
This commit is contained in:
@@ -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接口
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) 成功后热点消失是否正常
|
||||
|
||||
- 正常。组件设计为连接成功后自动关闭配网热点
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user