鸿蒙Hi3861智能花盆监测系统开发实战:多设备数据同步与远程监控 原创

进修的泡芙
发布于 2025-6-20 13:09
浏览
0收藏

鸿蒙Hi3861智能花盆监测系统开发实战:多设备数据同步与远程监控

一、项目概述与架构设计

本智能花盆监测系统基于鸿蒙Hi3861开发板和分布式技术实现,主要功能包括:
土壤湿度/温度/光照强度实时监测

多设备数据同步展示

异常状态跨设备告警

远程自动灌溉控制

技术架构图

┌─────────────┐ ┌─────────────┐ ┌─────────────┐
Hi3861开发板 │ │ 手机设备 │ │ 平板设备 │

┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │

│ 传感器 │─┼───▶│ │ 监控APP │ │ │ │ 数据看板 │ │

└────────┘ │ │ └────────┘ │ │ └────────┘ │

└───────┬─────┘ └───────┬─────┘ └───────┬─────┘
│ │

    └─────────┬────────┴─────────┬────────┘

      ┌───────▼───────┐   ┌───────▼───────┐

分布式数据服务 │ │ 云端存储服务 │

      └───────────────┘   └───────────────┘

二、Hi3861开发板核心代码
传感器数据采集

// sensor_reader.c
include <stdio.h>

include <unistd.h>

include “ohos_init.h”

include “cmsis_os2.h”

include “iot_gpio.h”

include “iot_adc.h”

include “hi_io.h”

define MOISTURE_PIN 2 // 土壤湿度传感器GPIO2

define TEMPERATURE_PIN 3 // 温度传感器GPIO3

define LIGHT_PIN 4 // 光照传感器GPIO4

float read_moisture() {
// 配置ADC通道
hi_io_set_func(MOISTURE_PIN, HI_IO_FUNC_GPIO_2_ADC);
// 读取模拟值 (0-1.8V对应0-100%湿度)
unsigned short moisture = IoTAdcRead(2, 10); // 10位精度
return (float)moisture / 1024 * 100;
float read_temperature() {

hi_io_set_func(TEMPERATURE_PIN, HI_IO_FUNC_GPIO_3_ADC);
unsigned short temp = IoTAdcRead(3, 10);
// 转换为摄氏度 (假设传感器输出0-1.8V对应-40~125°C)
return (float)temp / 1024 * 165 - 40;

int read_light() {

hi_io_set_func(LIGHT_PIN, HI_IO_FUNC_GPIO_4_ADC);
unsigned short light = IoTAdcRead(4, 10);
return (int)((float)light / 1024 * 100); // 0-100%光照强度

数据上报与设备控制

// data_reporter.c
include <stdio.h>

include <string.h>

include “ohos_init.h”

include “cmsis_os2.h”

include “iot_gpio.h”

include “wifi_connect.h”

include “mqtt_client.h”

define WATER_PUMP_PIN 5 // 水泵控制GPIO5

void control_water_pump(int duration) {
IoTGpioSetDir(WATER_PUMP_PIN, IOT_GPIO_DIR_OUT);
IoTGpioSetOutputVal(WATER_PUMP_PIN, 1); // 打开水泵
osDelay(duration * 1000); // 持续浇水时间
IoTGpioSetOutputVal(WATER_PUMP_PIN, 0); // 关闭水泵
void report_sensor_data() {

float moisture = read_moisture();
float temp = read_temperature();
int light = read_light();

char payload[128];
snprintf(payload, sizeof(payload), 
    "{\"moisture\":%.1f,\"temp\":%.1f,\"light\":%d,\"device\":\"%s\"}",
    moisture, temp, light, get_device_id());

// 通过MQTT上报数据
mqtt_publish("plantmonitor/data", payload);

// 接收控制命令

void handle_command(const char topic, const char payload) {
if (strcmp(topic, “plantmonitor/control”) == 0) {
if (strstr(payload, ““water”:true”)) {
control_water_pump(10); // 默认浇水10秒
}

三、鸿蒙设备端应用代码
数据同步服务

// PlantSyncService.ets
import distributedData from ‘@ohos.data.distributedData’;
import mqtt from ‘@ohos.mqtt’;

export class PlantSyncService {
private kvStore: distributedData.KVStore;
private mqttClient: mqtt.Client;

async init() {
// 初始化分布式数据
const kvManager = await distributedData.createKVManager({
bundleName: ‘com.example.plantmonitor’
});
this.kvStore = await kvManager.getKVStore(‘plant_data_store’, {
createIfMissing: true,
autoSync: true
});

// 连接MQTT服务器
this.mqttClient = await mqtt.createClient({
  uri: 'mqtt://your-server.com',
  clientId: deviceInfo.deviceId
});

// 订阅传感器数据
await this.mqttClient.subscribe('plantmonitor/data');
this.mqttClient.on('message', (topic, payload) => {
  this.handleSensorData(JSON.parse(payload));
});

private async handleSensorData(data: SensorData) {

// 存储到分布式数据库
await this.kvStore.put(sensor_${data.device}, JSON.stringify({
  ...data,
  timestamp: new Date().getTime()
}));

// 检查异常状态
this.checkAnomalies(data);

private checkAnomalies(data: SensorData) {

if (data.moisture < 20) {
  this.sendAlert(低湿度告警: {data.device}, 当前湿度 {data.moisture}%);

if (data.temp > 35) {

  this.sendAlert(高温告警: {data.device}, 当前温度 {data.temp}°C);

}

async sendControlCommand(deviceId: string, command: ControlCommand) {
await this.mqttClient.publish(
plantmonitor/control/${deviceId},
JSON.stringify(command)
);
}

花盆状态展示组件

// PlantStatusCard.ets
@Component
struct PlantStatusCard {
@Prop plantData: PlantData;
@State lastWatered: string = ‘’;

build() {
Column() {
// 植物图片
Image(this.getPlantImage())
.width(100)
.height(100)

  // 基础信息
  Text(this.plantData.name)
    .fontSize(18)
    .margin({ top: 10 })
  
  // 传感器数据
  Row() {
    Column() {
      Image('moisture.png')
        .width(30)
        .height(30)
      Text(${this.plantData.moisture}%)

Column() {

      Image('temp.png')
        .width(30)
        .height(30)
      Text(${this.plantData.temp}°C)

Column() {

      Image('light.png')
        .width(30)
        .height(30)
      Text(${this.plantData.light}%)

}

  .margin({ top: 15 })
  
  // 浇水按钮
  Button('浇水', { type: ButtonType.Capsule })
    .width(80)
    .margin({ top: 20 })
    .onClick(() => this.waterPlant())

.padding(15)

.borderRadius(12)
.backgroundColor('#F5F5F5')

private getPlantImage(): string {

if (this.plantData.moisture < 20) return 'plant_dry.png';
if (this.plantData.temp > 35) return 'plant_hot.png';
return 'plant_normal.png';

private waterPlant() {

const syncService = new PlantSyncService();
syncService.sendControlCommand(this.plantData.deviceId, {
  water: true,
  duration: 10
});
this.lastWatered = '刚刚';

}

四、关键技术创新点
多设备数据同步策略

// 数据聚合算法
private aggregatePlantData(devices: string[]): PlantData {
const allData = await Promise.all(
devices.map(id => this.kvStore.get(sensor_${id}))
);

return {
moisture: average(allData.map(d => d.moisture)),
temp: average(allData.map(d => d.temp)),
light: Math.max(…allData.map(d => d.light)), // 取最大光照
lastUpdated: new Date(Math.max(…allData.map(d => d.timestamp)))
};
// 设备优先级排序

private sortDevicesByPriority(devices: PlantDevice[]): PlantDevice[] {
return devices.sort((a, b) => {
// 1. 异常状态优先
if (a.hasAlert !== b.hasAlert) return a.hasAlert ? -1 : 1;

// 2. 低湿度优先
if (a.moisture !== b.moisture) return a.moisture - b.moisture;

// 3. 最近更新优先
return b.lastUpdated - a.lastUpdated;

});

自适应灌溉算法

// 智能灌溉控制
void auto_water_control() {
float moisture = read_moisture();
float temp = read_temperature();
int light = read_light();

// 计算灌溉需求分数 (0-100)
int water_score = 100 - moisture; // 基础分数

if (temp > 30) water_score += 10;  // 高温增加需求
if (light > 70) water_score += 15; // 强光增加需求

// 决定灌溉时长 (0-30秒)
int duration = 0;
if (water_score > 60) {
    duration = (water_score - 60) * 0.75; // 线性映射

if (duration > 0) {

    control_water_pump(duration);
    char log[64];
    snprintf(log, sizeof(log), "自动灌溉: %d秒", duration);
    report_log(log);

}

低功耗优化方案

// Hi3861低功耗模式
void enter_low_power_mode() {
// 1. 关闭非必要外设
hi_io_disable_unused_pins();

// 2. 降低CPU频率
hi_sys_set_cpu_freq(CPU_FREQ_LOW);

// 3. 配置间歇工作模式
while (1) {
    // 唤醒后工作30秒
    report_sensor_data();
    osDelay(30000);
    
    // 进入深度睡眠5分钟
    hi_pm_deepsleep(300000);

}

五、项目部署与测试
Hi3861开发环境配置

在build.gn中添加依赖:

deps = [
“//kernel/liteos_m:los”,
“//device/hisilicon/hispark_pegasus/sdk_liteos:wifiiot_sdk”,
“//base/iot_hardware/peripheral/interfaces/kits:wifiiot_lite”,

鸿蒙应用权限配置

在module.json5中添加:

“requestPermissions”: [
“name”: “ohos.permission.DISTRIBUTED_DATASYNC”

},
“name”: “ohos.permission.INTERNET”

},
“name”: “ohos.permission.GET_NETWORK_INFO”

]

测试方案

// 传感器数据测试
describe(‘SensorData’, () => {
it(‘should detect low moisture alert’, async () => {
const syncService = new PlantSyncService();
await syncService.handleSensorData({
device: ‘test_device’,
moisture: 15,
temp: 25,
light: 50
});

expect(alertSystem.getAlerts()).toContain('低湿度告警');

});
});

// Hi3861功能测试
void test_water_pump() {
TEST_ASSERT_EQUAL(0, IoTGpioGetOutputVal(WATER_PUMP_PIN));
control_water_pump(1);
TEST_ASSERT_EQUAL(1, IoTGpioGetOutputVal(WATER_PUMP_PIN));
osDelay(1100);
TEST_ASSERT_EQUAL(0, IoTGpioGetOutputVal(WATER_PUMP_PIN));

六、总结与扩展

本方案实现了:
基于Hi3861的精准环境监测

多设备实时数据同步

智能灌溉决策系统

跨平台远程监控能力

扩展方向:
添加植物生长AI建议系统

集成摄像头监控植物生长状态

开发多花盆协同管理系统

对接智能家居平台实现场景联动

鸿蒙的分布式能力与Hi3861的物联网特性完美结合,为智能园艺系统开发提供了强大支持。开发者可基于此项目框架,进一步探索更丰富的智慧农业应用场景。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
    相关推荐