project/garden-overview.md
智能花园养护机 · 项目总览(Orange Pi Zero 2W)
这是「项目卷宗」的总览篇:一份档案看全智能花园养护机——它是什么、五层架构怎么分、硬件与目录地图、时间线与现状。细节按链接跳到另外三份卷宗,方法论与完整复盘在博客长文里。
#一、元信息
| 字段 | 值 |
|---|---|
| 项目 | 植物养护机(智能花园) |
| 主控 | Orange Pi Zero 2W(Allwinner H618,Armbian / Ubuntu ARM64) |
| 软件栈 | C 驱动(garden-cli)+ Flask 面板 + HA 仪表盘 + 微信小程序 + 华为云 IoTDA + 离线语音(Vosk) |
| 验证状态 | ✅ 功能全部联调通过并稳定运行(2026-10-08) |
| 当前焦点 | SD 卡间歇性只读(EROFS)隐患——已全盘备份(60GB img),计划换卡 |
| 档案更新 | 2026-10-08(与《香橙派开发指南》同源整理) |
#二、一分钟看懂
- 这是什么:植物养护机。主控香橙派 Zero 2W + 自研底板,底层自研 C 命令行驱动,上层 Python 网页面板、Home Assistant 仪表盘、微信小程序、华为云 IoTDA、离线语音控制全套接齐。
- 能干什么:皮带滑台升降(闭环步进 429mm 行程,软限位不碰开关)、两路 24V 灯带调光、两路三色指示灯、水泵、超声波水位(空 40cm / 满 12cm)、电源监测 INA219x3、摄像头快照(装在滑台上)、29 条离线语音指令。
- 设计基调:硬件操作只走一个入口(garden-cli),一次调用干一件事,跨进程状态用文件交换——「哑工具 + 聪明胶水」的组合让上层怎么换都不伤底层。
#三、系统架构:五层与三条铁律
text[硬件] ZDT X42S 闭环步进(UART /dev/ttyS5 115200) / PCA9685(I2C) / INA219x3(I2C)
AHT20 / BH1750 / ADS1115(I2C) / RCWL-1670 水位(GPIO) / 硬件PWM灯带 / 限位+按键(GPIO)
|
[garden-driver] C 程序 ~/garden-driver/garden-cli <- 一切硬件操作的唯一入口
| subprocess
[garden-server] Flask :8080 ~/garden-server/server.py <- HTTP API + 网页面板
| HTTP
[garden-mqtt-bridge] ~/garden-mqtt-bridge/bridge.py <- HA 实体发现 + 命令转发
[garden-voice] ~/garden-voice/garden-voice.py <- 本地离线语音控制(Vosk)
|
[Home Assistant] docker :8123 仪表盘(分区视图) [华为云 IoTDA] [微信小程序]
三条铁律(违反必出事,全部是血泪实测):
- 硬件操作只经 garden-cli,禁止在 server / voice / bridge 层直接碰 I2C / GPIO / UART;
- 华为云对接不得改动现有 HA 链路(详见 garden-mqtt-bridge/HANDOVER-HUAWEI-IOT.md);
- 语音命令的 API 调用必须放后台线程——同步调用会卡死识别主循环(坑 27)。
#四、硬件清单
| 器件 | 用途 | 总线 / 接口 |
|---|---|---|
| ZDT X42S 闭环步进 + 驱动器 | 皮带滑台升降 | UART /dev/ttyS5 115200 8N1 |
| PCA9685 | 两路三色按键指示灯 | I2C |
| INA219 x3 | 三路电源电压 / 电流监测 | I2C(0x40 / 0x44 / 0x45) |
| AHT20 / BH1750 / ADS1115 | 温湿度 / 光照 / ADC | I2C(/dev/i2c-2) |
| RCWL-1670 | 超声波水位 | GPIO(TRIG=259 / ECHO=260) |
| 硬件 PWM(pwmchip sysfs) | 两路 24V 灯带调光 | GPIO 268 / 267 |
| 限位开关 x2 + 按键 x2 | 行程保护 / 本地操作 / 急停 | GPIO(271 上 / 272 下,低电平触发) |
| 水泵 | 浇花 | GPIO 270 |
#五、目录地图
本地工作副本在 D:\ai\TREA\orangepi\,板上 ~/garden-*。核心目录:
| 目录 | 内容 |
|---|---|
| garden-driver/ | C 源码(src/*.c、include/*.h)+ Makefile,双二进制 garden 演示 / garden-cli |
| garden-server/ | 生产面板后端 server.py + panel.html(注意:garden-mqtt-bridge/ 下还有一个遗留 server.py,不是生产版) |
| garden-mqtt-bridge/ | HA 桥 + 华为云对接 + 语音调优脚本 |
| garden-voice/ | 离线语音守护进程 + systemd 服务 |
| garden-miniprogram/ | 微信小程序(index / gallery / settings 三页) |
| figures/ | 博客配图 SVG(10 张,手写 SVG + check_bounds.py 越界检查) |
| sd_backup/ | SD 卡备份与修复(60GB img、uboot 诊断、串口日志) |
| board_*.sh(根目录 140+ 个) | 各类板端联调 / 部署 / 取证脚本,scp 到板子 /tmp 即可跑 |
#六、时间线与现状
| 时间 | 里程碑 |
|---|---|
| 09-16 | 系统烧录、首次点亮全流程(已成博客文章) |
| 09-20~24 | 台架联调期:17 个坑集中爆发并修复(已成博客文章) |
| 09-25 | 电机链路全面打通:全自动标定 + 软限位 + 自动重标定 |
| 09-28 | HAL 分层重构需求文档初版(V1.0) |
| 10-02~03 | 急停三步 +「继续」全链路;华为云 IoTDA;微信小程序三页 |
| 10-05~06 | 离线语音上线(Vosk,29 词);水泵幽灵自开修复 |
| 10-07~08 | SD 全盘备份;SD 卡只读故障排查(串口 uboot 诊断、分区修复) |
| 10-08 | HAL 需求书更新到 V1.1(本卷宗同步建档) |
已完成:回零标定(429mm)、急停三步、继续键全链路、水位标定 40→12cm、七彩 10s/圈、呼吸压暗、电源 6s 采样、HA 仪表盘 v5、离线语音 29 词、水泵幽灵自开修复、工具脚本持久化。
待办:
- [紧急] 备份并更换 SD 卡(间歇性只读 EROFS,全盘 img 已备好);
- 「继续」功能最终确认(curl 返回 NO_TARGET=已部署;404=按交接 v2 4.1 节重发 server.py);
- 语音硬件升级:USB 声卡 + 外接麦克风(几十元,插上改一个环境变量即可);
- HAL 分层重构(需求书 V1.1 已定稿,待执行 / 验收)。
运维速查:6 个 systemd 服务应全部 active——garden-server / garden-mqtt-bridge / garden-voice / garden-local / mjpg-streamer / garden-tools。garden-local(物理按键接管 + 限位急停)每 10 分钟自动轮换重启是设计行为,不是故障。
#七、卷宗导航
本卷宗共 4 篇,互相引用,建议按序阅读:
- 项目总览(本篇)——是什么、架构、现状;
- HAL 分层重构执行需求书(V1.1 档案)——给 AI 执行者的完整契约:签名表、移植红线、坑位清单、验收标准;
- garden-cli 命令速查与急救卡——日常运维与出问题时的 6 步急救;
- 踩坑索引(34 坑主题分组)——全部坑位的一句话教训 + 跳转。
博客侧的完整叙事:
- 一次嵌入式联调踩的 17 个坑——坑 1~17 的「现象-排查-根因-修法」完整复盘;
- 开箱到 SSH:香橙派 Zero 2W 首次点亮全流程——项目的起点;
- 我是怎么给 AI 写执行需求书的——HAL 需求书背后的方法论。
#八、更新日志
📝共 1 条记录
| 日期 | 类型 | 更新内容 |
|---|---|---|
| 2026-10-08 | 新增 | 首次建档:五层架构 + 三条铁律、硬件清单、目录地图、时间线与待办、卷宗导航(与《香橙派开发指南 20261008》同源整理) |