OpenAtom 大赛 · IoT · 端云协同

智慧大棚 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 采样

OLED 线程

渲染数据至屏幕

MQTT 发布

JSON → EMQX Broker

控制回调

指令 → PWM/GPIO

应用端:HarmonyOS NEXT 全功能控制终端

100% ArkTS · HDS 高级视觉特效 · 自实现 MQTT 客户端

UI 设计:不只是功能,还要好看

集成 HarmonyOS Design System (HDS) 官方高级视觉组件库:

HdsNav 导航栏

沉浸式光场效果顶部导航,背景融合过渡自然

PressShadow 引力动效

按钮按压时的弹性形变 + 光场扩散反馈

SpringMotion 入场动画

分步延迟进入的弹簧曲线动画,层次感拉满

自定义模式 (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 响应式解耦

遇到的坑 & 怎么解决的

问题:@ObjectLink 深层嵌套对象观察失效

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 轻量传输

上行:传感器数据上报

环境板 Rayawa/light_intensity_1 环境板 Rayawa/temp_and_hum_1 土壤板 Rayawa/soil_moisture_1

下行:控制指令下发

风扇 Rayawa/fan_1 补光灯 Rayawa/led_1 水泵 Rayawa/water_pump_1

性能优化

  • 精简 JSON Payload — 去除冗余嵌套,降低公网传输延时与丢包率
  • 单分区平铺架构 — 收敛高频并发为单节点通信,减轻 Broker 瞬时握手负担

技术栈

嵌入式 (Hi3861)

Hi3861 OpenHarmony LiteOS-M CMSIS-RTOS C GPIO PWM I2C ADC AHT20 SSD1306

通信层

MQTT 3.1.1 EMQX TCP Socket LwIP Wi-Fi STA JSON

应用端 (HarmonyOS)

HarmonyOS NEXT ArkTS ArkUI HDS @StorageLink Stage 模型