公司动态
基于OpenHarmony与XR806的智能体重秤开发实战
1. 项目背景与核心功能解析去年夏天我在为健身房设计智能健康监测系统时发现市面上的商用体重秤存在数据孤岛问题——测量结果无法自动同步到健康管理系统。这正是OpenHarmonyXR806组合大显身手的场景。这个智能体重秤方案完美解决了三个痛点实时数据上云通过MQTT协议直连华为IoT平台每次测量自动同步体重、身高数据健康趋势分析数字管家APP自动生成体重变化曲线图告别手工记录智能健康提醒基于BMI计算结果推送个性化健康建议硬件架构上XR806开发板作为主控搭配HX711称重模块和HC-SR04超声波模块。称重模块的24位ADC确保±50g测量精度超声波模块则通过TOF原理实现身高测量整套方案BOM成本控制在50元以内。2. 硬件搭建与关键接口配置2.1 元器件选型对比在原型开发阶段我对比了三种常见方案模块类型型号精度接口方式单价称重传感器HX711应变片±50g模拟SPI¥12超声波测距HC-SR04±3mmGPIO触发¥8无线模组XR806-Wi-Fi¥25选择HX711而非更便宜的HX710主要考虑其内置PGA可编程增益放大器能直接连接桥式传感器。实测发现使用5V供电时需在E/E-引脚并联10kΩ电阻以提高稳定性。2.2 硬件连接要点XR806的GPIO配置需要特别注意电平匹配// device/soc/allwinner/xradio/xr806/ohosdemo/BUILD.gn deps [ //vendor/team_x/smart_weight_scale:gpio_config, ] // vendor/team_x/smart_weight_scale/gpio_config.gni gpio_config { HX711_CLK: PB15, HX711_DAT: PB14, HC_SR04_TRIG: PA20, HC_SR04_ECHO: PA19 }焊接时建议先固定XR806核心板再连接传感器称重模块与主板间用排针连接方便校准超声波模块的VCC要加0.1μF去耦电容3. 开发环境搭建避坑指南3.1 编译环境配置官方文档容易遗漏的关键步骤# 必须执行的依赖安装 sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi pip3 install --upgrade pyelftools0.27 # 修改~/.bashrc增加工具链路径 export PATH$PATH:~/openharmony/prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi-10-2020-q4-major/bin遇到undefined reference to __aeabi_assert错误时需修改device/soc/allwinner/xradio/xr806/liteos_m/config.gniliteos_m_kernel_cflags [ -fno-short-enums, -marcharmv7-m, # 添加此参数 ]3.2 代码移植关键修改MQTT连接超时问题需要修改third_party/iot_link/network/mqtt/paho_mqtt/port/paho_mqtt_port.c// 修改select超时为2秒 timedelay.tv_sec 2; FD_ZERO(fdset); FD_SET(fd, fdset); ret select(fd 1, fdset, NULL, NULL, timedelay);4. 核心业务逻辑实现4.1 体重测量算法优化原始HX711库存在采样抖动问题改进后的滤波算法#define SAMPLE_TIMES 5 float get_stable_weight() { float samples[SAMPLE_TIMES]; for(int i0; iSAMPLE_TIMES; i){ samples[i] hx711_get_units(); usleep(10000); } // 中值平均滤波 bubble_sort(samples); float sum 0; for(int i1; iSAMPLE_TIMES-1; i){ sum samples[i]; } return sum/(SAMPLE_TIMES-2); }4.2 云端数据协议设计华为IoT平台的数据格式要求{ services: [{ service_id: WeightData, properties: { weight: 68.5, height: 175, time: 20240530T142857Z }, event_time: 20240530T142857Z }] }在device/soc/allwinner/xradio/xr806/adapter/hals/communication/iot_link/iot_cloud.c中实现上报逻辑int report_weight_data(float weight, float height) { cJSON *root cJSON_CreateObject(); cJSON_AddStringToObject(root, event_time, get_utc_time()); cJSON *services cJSON_CreateArray(); cJSON *service cJSON_CreateObject(); cJSON_AddStringToObject(service, service_id, WeightData); cJSON *props cJSON_CreateObject(); cJSON_AddNumberToObject(props, weight, weight); cJSON_AddNumberToObject(props, height, height); cJSON_AddStringToObject(props, time, get_utc_time()); cJSON_AddItemToObject(service, properties, props); cJSON_AddItemToArray(services, service); cJSON_AddItemToObject(root, services, services); char *payload cJSON_PrintUnformatted(root); int ret oc_mqtt_profile_propertyreport(WeightScale, payload); cJSON_Delete(root); free(payload); return ret; }5. 实测问题与解决方案5.1 Wi-Fi断连问题排查现象设备运行一段时间后MQTT断开连接 排查步骤使用ATPINGwww.baidu.com测试网络连通性检查free命令输出的内存使用情况最终发现是DHCP租期到期未续约解决方法 修改device/soc/allwinner/xradio/xr806/project/prj_config.h#define PRJCONF_NET_ENABLE 1 #define PRJCONF_NET_DHCP_LEASE_TIME 86400 // 改为24小时5.2 称重校准流程工厂校准步骤空载时长按K1键3秒进入校准模式放置500g标准砝码通过串口输入calibrate 500保存参数到flashvoid save_calibration(float scale, int offset) { hal_flash_write(0x1F000, (uint8_t *)scale, sizeof(float)); hal_flash_write(0x1F100, (uint8_t *)offset, sizeof(int)); }6. 功耗优化实践通过实测发现的主要耗电点模块工作电流优化措施XR806 Wi-Fi120mA改用PSM模式间隔10秒唤醒HX71115mA测量后立即进入休眠HC-SR0430mA仅在有用户站立时触发测量修改device/soc/allwinner/xradio/xr806/project/prj_config.h#define PRJCONF_POWER_SAVE_ENABLE 1 #define PRJCONF_PSM_SLEEP_DURATION 10 // 10秒实测优化后待机电流从80mA降至3.8mA2000mAh电池可续航3周。7. 产品化改进建议在健身房部署20台设备后总结的改进点防潮处理在PCB上喷涂三防漆防止汗液腐蚀防滑设计在称重平台增加硅胶防滑垫快速校准增加手机APP扫码校准功能多用户识别集成NFC读卡器识别会员身份核心代码已开源在Giteegit clone https://gitee.com/openharmony-sig/knowledge_demo_smart_home.git