项目介绍
usb的lcd模块显示内网ip
项目详情
USB 小屏状态显示
这套程序会把当前机器的内网 IP、CPU、内存和磁盘使用率显示到 MSU2_MINI_MG USB 小屏上。
当前效果
- 上方显示内网 IP
下方显示:
- CPU 使用率
- 内存使用率
- 磁盘使用率
- 四周保留 1 像素空白
- 默认每 20 秒刷新一次
- USB 小屏后插也能自动识别
- 握手成功后保持串口长连接,断线后自动重新连接
- 两次画面刷新之间使用厂商 ADC 只读命令维持设备会话
文件说明
- display_ip.py:主程序
- build_binary.sh:生成单文件二进制
- install.sh:安装并立即启动 systemd 服务
- restart.sh:停止当前服务并重新启动
- make_release.sh:生成可迁移的 ZIP 安装包
- dist/usb-lcd-dashboard:构建后的可执行文件
运行方式
直接运行源码
sudo python3 display_ip.py持续刷新
sudo python3 display_ip.py --watch 20详细日志
sudo python3 display_ip.py -v --watch 20只测试屏幕
sudo python3 display_ip.py --test自动识别
程序不会依赖固定 USB 口。
它会自动扫描:
VID:PID = 1A86:FE0C- 备用
/dev/ttyACM*
所以 USB 插在不同接口上,设备号变化后也能找到。
热插拔行为
在 --watch 模式下:
- 没插 USB 小屏时,不报错
- 程序继续等待
- 你后面再插入,小屏会在下一轮自动显示
- 设备拔出或通信中断后关闭旧连接,下一轮重新扫描和握手
这适合开机后过一段时间才插小屏的场景。
打包成二进制
生成
./build_binary.sh输出文件:
dist/usb-lcd-dashboard打包说明
这个二进制已经把 Python 代码和 Python 侧依赖打进去了,使用时不需要再安装:
- Pillow
- psutil
- numpy
但它仍然依赖系统基础动态库,所以不是完全静态二进制。
兼容性说明
当前这份二进制适合在相近的 Linux 环境上运行。
如果你要覆盖到更老的系统,比如 CentOS 7,建议在目标系统或同级别老环境里重新构建,而不是直接拿当前构建物跨大版本使用。
安装自启动
直接从源码目录安装
./install.sh它会:
- 把程序安装到
/usr/local/bin/usb-lcd-dashboard - 安装只匹配
1A86:FE0C的 udev 规则,阻止 ModemManager 把 LCD 当成调制解调器探测 - 创建并启用
usb-lcd-dashboard.service - 每 20 秒刷新一次数据
- 安装完成后立即启动,之后每次开机自动启动
服务行为
默认启动命令是:
/usr/local/bin/usb-lcd-dashboard --watch 20也就是每 20 秒刷新一次。
画面刷新间隔内,程序每秒读取一次设备 ADC 通道 9 作为轻量心跳。这与厂商程序的连接维护方式一致,可避免固件因串口长期无命令而停止响应;心跳无确认时会关闭旧连接并重新握手。
生成可迁移 ZIP
发布脚本不会重新编译,而是校验并打包现有的 dist/usb-lcd-dashboard。这样可以避免在较新的 Linux 上重建后,意外提高 glibc 要求,导致 Ubuntu 20.04 无法运行。
在当前机器执行:
./make_release.sh输出文件:
release/usb-lcd-dashboard-linux-x86_64.zipZIP 内只有三个运行所需文件:
usb-lcd-dashboardinstall.shrestart.sh
打包时会自动检查:
- 二进制是 x86-64 ELF 文件
- 二进制 glibc 要求不高于 Ubuntu 20.04 的 2.31
- ZIP 文件结构完整
如果源码有改动,必须先在 Ubuntu 20.04 或更老的兼容构建环境中重新生成 dist/usb-lcd-dashboard,再运行 make_release.sh。
转移到新的 Ubuntu
可以用 U 盘、局域网共享或 scp。例如从构建机器发送到新机器:
scp release/usb-lcd-dashboard-linux-x86_64.zip user@新机器IP:~/然后在新机器执行:
sudo apt install -y unzip
unzip usb-lcd-dashboard-linux-x86_64.zip -d usb-lcd-dashboard
cd usb-lcd-dashboard
./install.shinstall.sh 会自动请求 sudo 权限,无需单独安装 Python 或 Python 包。
重新启动
解压目录中执行:
./restart.sh脚本会让 systemd 停止当前进程并重新启动服务。
查看状态
systemctl status usb-lcd-dashboard查看日志
journalctl -u usb-lcd-dashboard -f卸载
sudo systemctl disable --now usb-lcd-dashboard.service
sudo rm -f /etc/systemd/system/usb-lcd-dashboard.service
sudo rm -f /etc/udev/rules.d/99-usb-lcd-dashboard.rules
sudo udevadm control --reload-rules
sudo systemctl daemon-reload
sudo rm -f /usr/local/bin/usb-lcd-dashboard常见问题
1. 没有显示
先看服务状态:
systemctl status usb-lcd-dashboard再看日志:
journalctl -u usb-lcd-dashboard -n 50 --no-pager日志出现 LCD 已连接 说明串口握手和方向命令已经确认;出现 已发送到 说明地址命令确认后,完整图像帧已经写入串口。仅有 systemd 的 active (running) 不能说明 LCD 通信成功。
2. 手动运行报权限错误
说明当前用户没有串口权限,直接用 root 运行即可:
sudo ./dist/usb-lcd-dashboard或者把用户加入 dialout 组后重新登录。
3. USB 设备没插时提示报错
现在的实现里,--watch 模式不会把“没插设备”当异常。
如果你看到错误,一般是:
- 指定了错误的
--port - 串口被别的程序占用
- 设备异常重枚举
4. CentOS 7 不能直接跑
根因是系统动态库版本差异,不是 Python 代码本身。
建议在 CentOS 7 上重新构建,或者走更老环境构建后再分发。
构建环境备注
当前仓库里已经有:
- 本地构建产物
- systemd 安装脚本
- PyInstaller 打包脚本
- 可迁移 ZIP 打包脚本
如果源码有改动并且需要重新生成兼容二进制,按下面顺序:
- 在 Ubuntu 20.04 或 glibc 不高于 2.31 的 x86-64 环境中构建
- 确认
python3、PyInstaller 和项目依赖可用 - 执行
./build_binary.sh - 执行
./make_release.sh,通过兼容性校验后生成发布 ZIP