一个基于 ESP32-C3 的双 LED 控制固件与内置 Web UI。通过 SoftAP 提供网页控制界面,并通过 WebSocket 接收/下发控制命令。支持 OLED 显示实时状态。适合快速演示 LED 模式(on/off/blink/breathe)与远程调试。
- 双 LED 独立控制(GPIO12 + GPIO13),每路独立 PWM 通道
- LED 模式:on / off / blink / breathe
- 调整亮度(0-255)
- Blink:调整频率(Hz)并需点击 Apply 生效
- Breathe:调整周期(ms)并需点击 Apply 生效
- OLED 128×64 显示(I2C, SCL=IO5, SDA=IO4),两页滚动显示双灯状态
- 内置 Web UI(HTML 嵌入固件,通过 SoftAP 的 HTTP 提供),双卡片独立控制
- 使用 WebSocket 实现状态广播与命令控制
- 状态上报包含 uptime、led 索引、mode、hz、period_ms、brightness、wifi_clients、ws_clients、rssi 等字段
- 无客户端自动休眠:WiFi/WebSocket 无连接时自动进入弱呼吸等待模式
-
platformio.ini- PlatformIO 项目配置 -
data/index.html- Web UI 源文件(构建时自动嵌入固件) -
tools/embed_html.py- 构建脚本,将 HTML 编译为 C 头文件 -
src/- 源码main.cpp- 程序入口(模块初始化、主循环、OLED 更新)network.cpp/.h- SoftAP、HTTP server 与 WebSocket serverwebsocket_handler.cpp/.h- WebSocket 消息解析、命令分发、广播status_reporter.cpp/.h- 汇总双灯状态并广播led_controller.cpp/.h- 双通道 LED 模式逻辑和 PWM 驱动(LEDC)storage.cpp/.h- 状态持久化(SPIFFS JSON)oled_driver.cpp/.h- SSD1306 OLED 驱动(硬件 I2C)oled_font.h- 8×16 ASCII 字库embedded_html.h- 自动生成的 HTML 嵌入头文件(勿手动编辑)
| 组件 | 引脚 |
|---|---|
| LED0 | GPIO12 |
| LED1 | GPIO13 |
| OLED SCL | IO5 |
| OLED SDA | IO4 |
| OLED VCC | 3.3V(独立供电) |
| OLED GND | GND |
本项目使用 PlatformIO 构建(推荐在 VSCode + PlatformIO 插件中使用)。
在项目根目录:
# 构建
platformio run
# 上传
platformio run --target upload你也可以在 IDE 中直接使用 "Build" 与 "Upload" 按钮。
开机显示 AP IP 地址,随后进入循环滚动模式,每页停留 5 秒:
- Row 1:
1:ON Br:128(LED 编号、模式、亮度) - Row 2:
Hz:2 Per:1500(闪烁频率、呼吸周期) - Row 3:
WiFi:2 WS:1(WiFi 客户端数、WebSocket 连接数) - Row 4:
UP: 3600s(运行时长,实时更新)
刷写后,ESP32 在 SoftAP 模式下启动 WiFi 网络(SSID: ESP32C3_LED_AP,密码: 12345678)。连接后在浏览器打开 http://192.168.4.1。
每个 LED 有独立卡片,包含:
- Mode 选择按钮:On / Off / Blink / Breathe
- 亮度滑块(0-255),松手 200ms 后自动应用
- Blink 控件:频率 slider + number + Apply(仅 blink 模式可见)
- Breathe 控件:周期 slider + number + Apply(仅 breathe 模式可见)
Blink/Breathe 的滑块调整仅改变本地 UI,需点击 Apply 才会发送到设备;若未点击 Apply,5 秒后回退到设备当前值。
WebSocket server 默认监听 81 端口。所有命令支持 led 字段指定目标 LED(缺省为 0)。
设置模式:
{ "cmd": "set_mode", "led": 0, "mode": "blink", "hz": 3 }
{ "cmd": "set_mode", "led": 1, "mode": "breathe", "period_ms": 2000 }设置亮度:
{ "cmd": "set_brightness", "led": 0, "duty": 200 }请求状态:
{ "cmd": "get_status" }设备会为每个 LED 分别广播状态事件,通过 led 字段区分。示例:
{ "evt": "status", "led": 0, "uptime": 123, "mode": "blink", "hz": 3, "period_ms": 1500, "brightness": 128, "wifi_clients": 2, "ws_clients": 1, "rssi": -45, "dropped": 0 }- 使用串口监视器(115200 baud)查看日志输出
- 观察
WiFi: stations connected=X和WS client connected/disconnected日志判断网络状态 - OLED 不亮时检查 I2C 接线和地址(默认 0x3C)