rs485-lpc/USAGE.md

98 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 使用说明 —— RS485 → Pharos LPC 灯光控制系统
日期:2026-10-09(2026-10-10 更新:LPC 自治架构——照度采集与闭环全部移到 LPC Lua,Ubuntu 只做监控/记录)
## 1. 控制协议
通过 RS485 总线发送 ASCII 文本帧(**4800 8N1**(2026-10-10 起由 9600 改为 4800,与照度传感器共总线),`\n` 结尾)即可控制灯光:
| 命令 | 格式 | 功能 | 示例 |
|------|------|------|------|
| 手动亮度 | `BRT=NNN` | 总亮度 0~100%(3 位补零) | `BRT=080` |
| 灯光效果 | `FX=NN` | 01 常亮 / 02 呼吸 / 03 闪烁 / 04 缓变 | `FX=02` |
| 场景 | `SC=NN` | 01 全亮 / 02 半亮 / 03 微亮 / 04 全灭 | `SC=01` |
| 照度闭环 | `LUX=NNNNNN` | 上报实测照度(Lux),自动调光到目标 | `LUX=000350` |
| 目标照度 | `LXT=NNNNNN` | 设定闭环目标(默认 500 Lux) | `LXT=000500` |
| 照度指示 | `LX2=NNNNNN` | 灯亮度直接映射照度(对数映射) | `LX2=001000` |
**FX 与 SC 互斥**:发 FX 会清除 SC 的亮度覆盖并启动对应 Timeline;
发 SC 会停掉所有 Timeline 并设定静态亮度。后到的命令生效。
FX 效果会一直循环播放,直到收到下一条 FX/SC 命令(由 FXLoop 触发器在播完时自动重启)。
**亮度叠加关系**:`最终亮度 = Timeline/场景基础亮度 × BRT/LUX/LX2 设定的总调光系数`。
例如 FX=01(常亮 255)+ BRT=050 → 实际输出约 50%。
## 2. 发送方式
### ESP32 / 单片机
串口 9600 8N1,直接 `printf("FX=02\n")` 即可。
### Ubuntu 主机(192.168.58.7)
```bash
python3 ~/rs485-lpc_test_rs485.py -s 'FX=02'
```
### Windows 本机
```powershell
powershell -File Run-Remote.ps1 -Cmd "python3 ~/rs485-lpc_test_rs485.py -s 'SC=01'"
```
## 2.5 网页控制台(2026-10-10 新增)
浏览器访问 **http://192.168.58.7:8090/**(手机/电脑均可,与 LPC 同网段):
- 实时显示:4 条 Timeline 状态/进度、DMX 通道 1~32 输出柱状图、总亮度(1.5s 刷新)
- 控制:FX 效果(常亮/呼吸/闪烁/缓变)、SC 场景(全亮/半亮/微亮/全灭)、总亮度滑杆(均经 LPC HTTP 触发器下发,不走串口)
- **照度联动开关**:切换 LPC 全局变量 `lux_link_on`(HTTP 触发器 #16 开 / #17 关),并实时显示 LPC 采集的照度 Lux 值
- **48 小时历史曲线**(60s 刷新):输出%(实线)+ BRT%(虚线,左轴)与照度 lux(右轴,对数刻度);
数据由服务每 30s 从 LPC HTTP API 采样一次,持久化在 `~/rs485-lpc/history.jsonl`,重启不丢
服务为 Ubuntu 侧 `~/rs485-lpc/lpc_web.py`(端口 8090;8080 被 esp32-voice 的 light-web 占用,勿动)。
重启须分两条命令执行(pkill 与启动不能同一条,否则 pkill 会误杀自身会话导致服务起不来):
```powershell
Run-Remote.ps1 -Cmd "pkill -f 'lpc_web.py'"
Run-Remote.ps1 -Cmd "setsid bash -c 'nohup python3 ~/rs485-lpc/lpc_web.py > ~/rs485-lpc/lpc_web.log 2>&1 < /dev/null &'"
```
## 3. 状态查询(免认证 HTTP API)
```bash
curl.exe http://192.168.58.109/api/timeline # 各 Timeline 运行状态
curl.exe "http://192.168.58.109/api/output?universe=dmx:1" # 32 通道实时输出
curl.exe http://192.168.58.109/api/group # 总调光系数
curl.exe "http://192.168.58.109/api/lua?variables=lux_value,lux_target,lux_link_on,lux_cur_level" # 闭环全局变量
```
远程触发(网页控制台即用此方式):
```bash
curl.exe -X POST "http://192.168.58.109/api/trigger?num=11&var=2" # 触发器 #11 FXSelect,var=2 → 呼吸
curl.exe -X POST "http://192.168.58.109/api/trigger?num=16" # 开照度联动(#17 关)
curl.exe -X POST "http://192.168.58.109/api/timeline" -H "Content-Type: application/json" -d @tl.json # tl.json: {"action":"start","num":1}
```
输出值前缀含义:`"255"`=正常输出,`"!255"`=Override,`"=0"`=外部直通源。
## 4. 照度自动调光(LPC 自治,2026-10-10 起)
照度采集与闭环全部在 LPC 内运行,**不依赖 Ubuntu/网络**:
- 触发器 **#14 LuxPoll**(Real Time,每秒)→ Output Serial 发 Modbus 轮询帧 `02 03 00 02 00 02 65 F8`(hex,RS485 口 4800)
- 触发器 **#15 LuxIn**(Serial Input,hex 匹配 `020304<4c><2c>`)→ Lua 自适应闭环(在线辨识灵敏度 k=Δlux/Δlevel,步长=err/k 一步到位、上限 20%、误差变号减半、限幅 5%~100%;`lux_value=lux` 全局暴露)
- 联动开关:全局变量 `lux_link_on`(默认 true),由触发器 #16(串口 `LLON` 或 HTTP)/ #17(`LLOFF`)切换
- **网页可调参数**(控制台"照度联动"卡,立即生效):目标照度 `lux_target`(#9 / `LXT=`)、轮询周期 `lux_poll_s` 1~60s(#19 / `PER=N`,=闭环调节间隔,照度采集仍每秒)、渐变时间 `lux_fade` 0.1~10s(#18 / `FAD=N`,单位 0.1s)、死区 `lux_deadband` 1~1000 Lux(#20 / `DBD=N`,**默认 1**);步长上限 20% / 限幅 5%~100% 为脚本常量,灵敏度 k 在线自动辨识无需手调
- Ubuntu 侧 `lux_sync.py` / `poll_lux.py` **已停用**(避免双主机抢总线);网页控制台照度改读 `/api/lua?variables=lux_value`
## 5. 常见问题
| 现象 | 排查 |
|------|------|
| 发命令无反应 | 检查波特率 **4800**、帧尾 `\n`、命令前缀大小写;用 `/api/log` 看触发记录 |
| 上传项目后灯不亮 | Upload 会清空 Override,重新发一次 `SC=` 或 `FX=` |
| 通道显示 `=0` | eDMX Pass-Through 被打开,外部源黑场压过本地;改回 None |
| 亮度偏暗 | BRT/LUX 总调光系数不是 100%,发 `BRT=100` 或查 `/api/group` |
| 修改了 Designer 项目 | 务必 Save Project → Upload All → 归档 pd2 到项目目录 |