智慧大棚 SmartShed
一套完整的智慧农业物联网控制系统。
从传感器数据采集到手机端实时控制,全链路自主实现。
双板模块化设计
环境感知板采集温湿度与光照,土壤执行板控制风扇和水泵。两块 Hi3861 开发板独立运行、协同工作。
自实现 MQTT 客户端
HarmonyOS 端不依赖第三方库,从 TCP Socket 开始手动构建 MQTT 协议报文。
双模式切换
手动模式自由调节每个设备档位,智能模式根据传感器数据自动执行策略。
开放原子大赛
获"基于 OpenHarmony 的智慧大棚"赛题奖项认可。
系统如何工作
三层架构:硬件采集 → 云端中转 → 手机控制
嵌入式端
Hi3861 × 2
传感器采集 + OLED 显示
PWM/GPIO 执行控制
EMQX Broker
MQTT 3.1.1
公网消息中转
Topic 路由分发
HarmonyOS App
Mate 70 Pro+ / iPad
实时数据显示
手动 / 智能双模式
嵌入式端:两块开发板各司其职
基于 OpenHarmony LiteOS-M + CMSIS-RTOS 多线程,纯 C 语言开发
环境感知板 (env_rgb_board)
负责"看"和"显示"
- AHT20 — I2C 读取温度与湿度
- 光照传感器 — ADC 采样 (0~4095)
- RGB LED 补光灯 — PWM 控制 (0~100%)
- 状态指示灯 — GPIO 11(绿) / GPIO 12(黄)
SSD1306 OLED 屏幕 (128×64) 实时刷新温湿度、光照数据
土壤执行板 (soil_actuator_board)
负责"感知土壤"和"执行动作"
- 土壤湿度传感器 — ADC 采样水分含量
- 直流风扇 — PWM 四档 (停/低/中/高)
- 潜水水泵 — GPIO 四档 (关/小/中/大)
多线程任务调度
CMSIS-RTOS 管理 4 个并行线程,互斥锁保护共享资源:
每秒 ADC/I2C 采样
渲染数据至屏幕
JSON → EMQX Broker
指令 → PWM/GPIO
应用端:HarmonyOS NEXT 全功能控制终端
100% ArkTS · HDS 高级视觉特效 · 自实现 MQTT 客户端
UI 设计:不只是功能,还要好看
集成 HarmonyOS Design System (HDS) 官方高级视觉组件库:
沉浸式光场效果顶部导航,背景融合过渡自然
按钮按压时的弹性形变 + 光场扩散反馈
分步延迟进入的弹簧曲线动画,层次感拉满
自定义模式 (ManualPage)
你想怎么控就怎么控
- 滑块拖拽调节:风扇 (0-3档) / 水泵 (0-3档) / 补光灯 (0-100%)
- 进入页面时自动同步当前档位到开发板
- 支持触觉反馈振动开关
智能模式 (AutoPage)
让系统自己决策
- 配置温度/湿度/光照/土壤湿度的上下限阈值
- 定时轮询传感器数据,超出范围自动触发控制
- 后台常驻管理线程,退出页面安全销毁防内存泄漏
技术亮点:从零实现 MQTT 客户端
HarmonyOS 端没有使用任何第三方 MQTT 库,完全基于 TCP Socket 手动构建协议报文:
- 手动拼接 Fixed Header + Variable Header + Payload
- 完整实现 CONNECT / PUBLISH / SUBSCRIBE / PINGREQ 等报文
- 60s 间隔 KeepAlive 心跳保活
- 断线自动重连 + 指数退避策略
- 单 TCP 连接多 Topic 订阅与路由分发
- @StorageLink 状态管理与 ArkUI 响应式解耦
遇到的坑 & 怎么解决的
MQTT 异步回调返回新数据后,ArkUI 的 @ObjectLink 只监听对象首层属性变化。 结果就是:传感器数字不更新、滑块被死锁无法拖动。
this.zone1 = { ...this.zone1 }
用浅拷贝解构赋值强制创建新对象引用,击穿状态机触发 UI 刷新。一行代码修复致命 Bug。
数据如何流动
两条单向通道:传感器数据向上走,控制指令向下发
上行:数据采集 → 手机显示
① 传感器采样
ADC 读光照/土壤湿度,I2C 读 AHT20 温湿度
② OLED 本地显示
SSD1306 屏幕实时刷新数据(即使没连手机也能看)
③ JSON 封装 & 发布
精简 Payload 如 {"intensity": 450},Paho MQTT 发布到 EMQX
④ App 解析 & 刷新 UI
MQTT 回调 → 浅拷贝解构 → 触发 ArkUI 状态机更新数字显示
下行:用户操作 → 硬件执行
① 用户操作或自动策略
手动拖滑块 / 智能模式阈值判断触发指令
② MQTT 报文构建 & 发送
自实现客户端手动拼装 PUBLISH 报文,经 EMQX 下发
③ Hi3861 接收 & 执行
MQTT 回调解析 → PWM 调节风扇/补光灯,GPIO 控制水泵
可靠性设计
5 秒超时未收到数据即判定开发板离线
UI 自动切换灰色禁用状态 + 提示重连
恢复后自动重新订阅 Topic
GlobalLogBus 事件总线记录所有操作
MQTT 通信状态 / 用户操作 / 错误信息
方便调试与问题排查
通信协议:MQTT Topic 设计
按双板分离命名空间,QoS 0 轻量传输
上行:传感器数据上报
下行:控制指令下发
性能优化
- 精简 JSON Payload — 去除冗余嵌套,降低公网传输延时与丢包率
- 单分区平铺架构 — 收敛高频并发为单节点通信,减轻 Broker 瞬时握手负担