基于 ESP-01S 的 Bambu Lab 3D 打印机状态监控与继电器自动控制系统。通过 MQTT over TLS (端口 8883) 直连局域网打印机,实时获取打印状态,并根据状态、温度或手动指令自动控制外接继电器。
-
打印机状态监控:局域网直连(无需云端),实时状态中文化显示,可配置刷新间隔(1~3600 秒,默认 300 秒)
-
继电器自动控制(4 种模式):
模式 说明 根据打印状态 「打印中」时开启,打印结束后按设定延时关闭(0~360 分钟) 根据喷嘴温度 ≥ 开启温度时开,≤ 关闭温度时关 根据热床温度 同上 手动控制 网页按钮或 API 切换(手动切换会自动切到手动模式,避免被自动逻辑覆盖) -
Web 仪表盘:单页面集成状态与配置,深色主题,响应式布局,3 秒局部刷新,表单脏标记检测
-
配置与维护:
- 未配置 WiFi (或WiFi连接失败时)自动进入 AP 模式(SSID:
ESP01S-Dashboard,密码12345678,http://192.168.4.1) - 配置持久化到 Flash(Preferences 库)
- 「测试连接」功能验证打印机参数
- 网页一键重启 / 恢复出厂 / OTA 固件升级
- 硬件恢复出厂:开机 10 秒内按 RST 4 次
- 未配置 WiFi (或WiFi连接失败时)自动进入 AP 模式(SSID:
中文化仅在显示层,内部状态机仍用英文常量。对照见打印机状态对照表。
| 组件 | 说明 |
|---|---|
| ESP-01S | ESP8266 ESP-01S 模块 |
| ESP01S Relay 模块 | GPIO0 控制,低电平有效(LOW=ON) |
| 3.3V 供电 | 继电器吸合时电流较大,建议独立电源 |
引脚:RELAY_PIN = GPIO0(继电器),LED_BUILTIN(状态指示:AP/连接中闪烁,已连接常灭)。
ESP8266 Arduino Core 自带:ESP8266WiFi、ESP8266WebServer、WiFiClientSecure(含 BearSSL)、Preferences、Updater(OTA)
需额外安装:ArduinoJson(JSON 序列化)
Core 建议 ≥ 3.0.0。
user_interface.h为 ESP8266 SDK 自带。
- 复制
config.example.h为config.h(已被 .gitignore 忽略) - 填入 WiFi、打印机 IP/序列号/访问代码等值(兜底默认值,后续均可通过网页修改)
- 编译上传到 ESP-01S
#define DEBUG_SERIAL // 生产环境注释掉以移除调试输出减小固件体积
#define BAMBU_PRINTER_IP "192.168.1.100" // 打印机 IP 地址
#define BAMBU_PRINTER_SERIAL "0000000000000000" // 打印机序列号
#define BAMBU_PRINTER_ACCESS_CODE "00000000" // 打印机访问代码
#define BAMBU_PRINTER_PORT 8883 // 打印机 MQTT 端口
#define WIFI_SSID "your_wifi_ssid" // WiFi SSsid
#define WIFI_PASSWORD "your_wifi_password" // WiFi 密码首次启动:上电 → AP 模式(LED 闪烁)→ 连 SSID ESP01S-Dashboard → 访问 http://192.168.4.1 填 WiFi → 重启后连 WiFi(LED 灭)→ 路由器查 IP → 访问仪表盘
日常使用:网页自动 3 秒刷新状态;继电器卡片配置模式/阈值/延时;展开「WiFi/打印机配置」改参数或测试连接;手动按钮切换继电器(自动切手动模式)
OTA 升级:Arduino IDE 项目 → 导出已编译二进制文件 → 仪表盘展开「WiFi/打印机配置」→「固件升级」卡片选 .bin 上传 → 自动重启
OTA 约束:新固件大小需要小于 OTA 可用空间(见仪表盘系统信息),否则只能通过串口烧录。 OTA 端点暂无认证拦截,请仅在可信局域网使用。
恢复出厂:网页点「恢复出厂」,或开机 10 秒内按 RST 4 次
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / |
主仪表盘页面 |
| GET | /wifi |
首次配置 WiFi 页面 |
| POST | /save |
保存打印机/继电器配置(返回 JSON) |
| POST | /savewifi |
保存 WiFi 配置(AJAX 返回 JSON;表单提交则重启) |
| GET | /relay?state=0|1 |
切换继电器(自动切手动模式) |
| GET | /api/trigger-refresh |
触发后台拉取打印机状态(返回 {"ok":true}) |
| POST | /connect-printer |
用传入参数测试连接(不保存),返回 JSON |
| POST | /update |
OTA 升级(multipart 上传 .bin,成功后重启) |
| GET | /reboot |
重启设备 |
| GET | /factoryreset |
恢复出厂并重启 |
仪表盘「系统信息」卡片显示内存与 Flash 占用百分比及明细:
- 内存:
(总堆 - 空闲堆) / 总堆,绿<70%· 橙70-90%· 红>90% - Flash:
固件大小 / (固件空间 + OTA空间),同上配色
根据打印状态(状态机):检测到「打印中」→ 立即开;离开「打印中」→ 记录结束时间 → 延时 0 分钟则立即关,否则等待 delayOffMinutes 后关
温度模式(滞回控制):温度 ≥ relayOnTemp 且继电器关 → 开;温度 ≤ relayOffTemp 且继电器开 → 关
英文常量 (gcode_state) |
中文显示 | 说明 |
|---|---|---|
IDLE |
空闲 | 就绪,未在打印 |
RUNNING |
打印中 | 正在打印(继电器触发条件) |
PAUSE |
暂停中 | 过渡态 |
PAUSED |
已暂停 | 稳定态 |
RESUME |
恢复中 | 过渡态 |
FINISH / FINISHED |
已完成 | 打印完成 |
FAILED |
打印失败 | 失败或手动取消 |
PREPARE / PREPARING |
准备中 | 调平等准备 |
SLICING |
切片中 | 正在切片 |
REBOOTING |
重启中 | 打印机重启 |
BOOTING |
启动中 | 打印机启动 |
UNKNOWN / -- |
未知 | 状态未知 |
翻译函数大小写不敏感;打印机仅下发英文
gcode_state,未识别值原样显示。见 web_pages.h 的translatePrinterStatus()。
| 现象 | 原因 / 解决 |
|---|---|
PRINTER OFF |
打印机 IP 错误或离线 |
PRINTER MQTT |
TLS 成功但 MQTT 握手失败,检查访问代码 |
PRINTER AUTH |
访问代码错误 |
PRINTER MEM |
堆内存不足,缩短刷新间隔或重启 |
PRINTER TIMEOUT |
10 秒未收到状态,可能序列号错误 |
| 进入 AP 但已配置过 | WiFi 丢失超时,等待或检查路由器;5 分钟后自动重连 |
| 网页按钮失效 | 分片传输导致 <script> 损坏,用当前固件 |
esp01s-web-dashboard/
├── esp01s-web-dashboard.ino # 主程序:WiFi/MQTT/Web/继电器
├── web_pages.h # HTML/CSS/JS 页面生成
├── types.h # 数据结构
├── config.example.h # 配置模板
└── .gitignore
MIT License © 2025 weilong
Bambu Lab 是 Bambu Lab 的商标,本项目与其无关联。