前言

在上一篇 Blinker 开发入门指南 中,我们了解了 Blinker 的基础用法。但在实际项目中,WiFi 名称和密码写死在代码里非常不方便——每换一个网络就要重新烧录。

本文介绍一个 ESP32 Web 配网方案,通过手机连接 ESP32 热点,在网页上配置 WiFi 和 Blinker 授权码,配置保存后开机自动重连。

功能特性

  • 开机自动连接已保存的 WiFi
  • 连接失败时自动进入配网模式(AP 热点 + Web 服务器)
  • Web 页面支持 WiFi 扫描选择、密码输入、Blinker 授权码填写
  • 历史配置记录(最多3条),点击快速填充
  • GPIO0 长按3秒清除配置并重启
  • LED 指示灯状态:常亮=已连接,闪烁=配网中,熄灭=断开

项目结构

ESP32_Blinker_NET/
├── src/
│   ├── main.cpp          # 主程序:Blinker 初始化 + WiFi 管理
│   └── WIFIConnect.cpp   # WiFi 配网模块实现
├── include/
│   └── WIFIConnect.h     # WiFi 配网模块头文件
├── lib/
│   └── blinker-library-master/  # 本地 Blinker 库
└── platformio.ini        # PlatformIO 配置

工作流程

flowchart TD
    A[开机] --> B{有已保存配置?}
    B -->|是| C[尝试连接WiFi]
    B -->|否| D[进入配网模式]
    C -->|成功| E[初始化Blinker]
    C -->|失败 20秒超时| D
    D --> F[ESP32_Config热点]
    F --> G[手机连接热点]
    G --> H[访问192.168.4.1]
    H --> I[Web页面配置]
    I --> J[保存配置]
    J --> K[ESP32重启]
    K --> C
    E --> L[正常运行]
    L --> M{WiFi断开?}
    M -->|是| N[自动重连]
    M -->|否| L
    N -->|重连失败3分钟| O[重启ESP32]

核心代码解析

主程序 main.cpp

主程序非常简洁,核心逻辑就三步:

 1#define BLINKER_PRINT Serial
 2#define BLINKER_WIFI
 3
 4#include <Blinker.h>
 5#include "WIFIConnect.h"
 6
 7WIFIConnect wifiManager("ESP32_Config");
 8
 9void setup() {
10    Serial.begin(115200);
11    wifiManager.begin();
12
13    if (wifiManager.isConnected()) {
14        Blinker.begin(
15            wifiManager.getAuth().c_str(),
16            wifiManager.getSSID().c_str(),
17            ""
18        );
19        Blinker.attachData(dataRead);
20    }
21}
22
23void loop() {
24    wifiManager.loop();
25    if (wifiManager.isConnected()) {
26        Blinker.run();
27    }
28}

关键点:

  • wifiManager.begin() 内部处理了所有 WiFi 连接逻辑
  • Blinker.begin() 的密码参数传空字符串,因为 WiFi 已经通过 WiFi.begin() 连接
  • loop() 中先处理 WiFi 状态,再运行 Blinker

WIFIConnect 类

这是配网的核心模块,封装了 AP 热点、Web 服务器、DNS 重定向、EEPROM 存储等功能。

初始化流程:

 1void WIFIConnect::begin() {
 2    pinMode(_ledPin, OUTPUT);
 3    pinMode(_resetPin, INPUT_PULLUP);
 4
 5    if (restoreConfig()) {
 6        // 有保存的配置 → 尝试连接
 7        WiFi.begin(savedSSID, savedPassword);
 8        // 等待20秒...
 9        if (WiFi.status() == WL_CONNECTED) {
10            // 连接成功
11        } else {
12            setupMode();  // 进入配网模式
13        }
14    } else {
15        setupMode();  // 无配置,直接配网
16    }
17}

配网模式启动:

1void WIFIConnect::setupMode() {
2    WiFi.mode(WIFI_AP);
3    WiFi.softAP(_apName);  // 创建热点 "ESP32_Config"
4    dnsServer.start(53, "*", IPAddress(192, 168, 4, 1));  // DNS重定向
5    server.on("/", HTTP_GET, handleRootCallback);
6    server.on("/save", HTTP_POST, handleSaveCallback);
7    server.begin();
8    scanWiFi();  // 扫描可用WiFi
9}

配置保存:

 1void WIFIConnect::handleSave() {
 2    String ssid = server.arg("ssid");
 3    String password = server.arg("password");
 4    String auth = server.arg("auth");
 5
 6    preferences.putString("ssid", ssid);
 7    preferences.putString("password", password);
 8    preferences.putString("auth", auth);
 9    saveWiFiHistory(ssid, password, auth);
10
11    delay(1000);
12    ESP.restart();  // 保存后重启
13}

Web 配网页面

配网页面包含:

  • WiFi 网络下拉选择(自动扫描)
  • WiFi 密码输入(支持显示/隐藏切换)
  • Blinker 授权码输入
  • 历史配置列表(点击快速填充)
  • 保存并连接按钮

页面使用渐变背景和圆角卡片设计,手机端体验友好。

WiFi 掉线检测

 1void WIFIConnect::loop() {
 2    // 每5秒检查WiFi状态
 3    if (millis() - lastWifiCheck > 5000) {
 4        if (WiFi.status() != WL_CONNECTED && !_isSettingMode) {
 5            WiFi.begin(savedSSID, savedPassword);  // 尝试重连
 6        }
 7        lastWifiCheck = millis();
 8    }
 9
10    // 长按GPIO0超过3秒 → 清除配置重启
11    if (digitalRead(_resetPin) == LOW) {
12        if (millis() - _buttonPressStartTime > 3000) {
13            reset();
14        }
15    }
16}

硬件连接

引脚 功能 说明
GPIO2 LED 指示灯 连接=常亮,配网=闪烁,断开=熄灭
GPIO0 重置按键 长按3秒清除配置并重启

使用步骤

  1. 烧录固件到 ESP32
  2. 手机连接热点 ESP32_Config
  3. 浏览器访问 192.168.4.1
  4. 选择 WiFi、输入密码和 Blinker 授权码
  5. 点击保存,ESP32 自动重启并连接

总结

这个 Web 配网方案解决了 Blinker 项目中 WiFi 配置固化的问题,通过 Web 页面和历史记录功能,让用户无需重新烧录即可切换网络。配合 Blinker 的心跳包和回调机制,可以快速搭建物联网应用。

本项目完整代码见 E:\Embedded\库\Blinker开发规范\ESP32_Blinker_NET