一、简介
智能金属探测器是基于 OpenAtom OpenHarmony(以下简称“OpenHarmony”)操作系统,利用电磁感应原理来探测四周的金属物体。该样例采纳多设施协同的形式,兼容 OpenHarmony 设施开发与利用开发,整个样例体现了 OpenHarmony 的 NAPI、eTS UI、UI 治理状态 @state 和音频播放等技术个性。
本我的项目由 Geek_Lite_Board 开发板和润和 RK3568 开发板形成,Geek_Lite_Board 开发板主控芯片为 STM32F427IIH6,作为设施端检测磁场强度的变动,应用的是 OpenHarmony 3.0 LTS 版本。润和 RK3568 开发板是由润和软件研发,采纳瑞芯微 RK3568 芯片,作为利用端显示金属探测信息,应用的是 OpenHarmony 3.1 Release 版本。
二、运行成果
当四周有金属凑近时,设施端蜂鸣器会收回警报并把检测信息通过 Wi-Fi 模组发送给利用端。在利用端收到检测信息之后,会通过屏幕显示检测状态并语音播报检测后果。
三、性能实现
Geek_Lite_Board 开发板通过 AK8963 电子罗盘芯片获取地球磁场强度。通常地球的磁场强度是 0.4-0.6 高斯,当金属凑近电子罗盘芯片时,依据电磁感应原理,金属在磁场中的感应会引起磁场信号的变动。Geek_Lite_Board 开发板通过 Wi-Fi 与润和 RK3568 开发板实时通信,把检测到的信息实时上传。润和 RK3568 开发板作为利用端,采纳方舟开发框架(ArkUI)基于 eTS 扩大的申明式开发范式编写页面,通过 NAPI 接口接管设施端 Geek_Lite_Board 开发板的检测信息,应用 OpenHarmony 媒体子系统中的音频播放性能实现语音播报金属检测状态。
磁场数据获取
AK8963 一款具备高灵敏度霍尔传感器技术的三轴电子罗盘集成芯片,外部蕴含磁力传感器,能够在 x 轴、y 轴、z 轴检测地球磁场强度。
● 通过 Mpu_Read_Bytes() 函数读芯片数据寄存器的值。
uint8_t Mpu_Read_Bytes(uint8_t const regAddr, uint8_t *pData, uint8_t len)
● 获取 AK8963 的磁场原始数据。
Mpu_Data.mag_x = (MPU_BUFF[16] << 8) | MPU_BUFF[15]; // x 轴磁场数据
Mpu_Data.mag_y = (MPU_BUFF[18] << 8) | MPU_BUFF[17]; // y 轴磁场数据
Mpu_Data.mag_z = (MPU_BUFF[20] << 8) | MPU_BUFF[19]; // z 轴磁场数据
● 对 AK8963 原始磁场数据进行转化,失去磁场强度,单位高斯。
Gauss_Mag_z = Mpu_Calc.mag_z * 0.15f * 0.01f;
检测金属信息
首先采集 100 组 z 轴磁场强度基准数据,而后对这些数据做均匀解决,由此失去 z 轴磁场强度的零点数据。
const uint16_t calibrateCount = 1000; // 测量最大次数为 1000
const uint16_t calibrateFrequency = 5; // 每测量 5 次取一次有效值
const uint16_t calibrateAverageCount = 100; // 取 100 次有效值
if(i < calibrateCount){
i++;
if(i%calibrateFrequency == calibrateFrequency){Mag_z_buff[j++] = Gauss_Mag_z;
if(j >= calibrateAverageCount){
i = calibrateCount;
Mag_z_Flag = true;
for(k=0;k<calibrateAverageCount;k++){origin_mag_z += Mag_z_buff[k];
}
origin_mag_z = origin_mag_z / calibrateAverageCount;
// 校准实现,蓝灯亮,发送给利用端 "CalibrateOK"
BLUE_LED_ON();
memset(buff,0x00,sizeof(buff));
sprintf(buff,"angle:%s","CalibrateOK");
ESP8266_send_data(buff,strlen(buff));
}
}
}
以 origin_mag_z 作为零点,把获取到的磁场数据与它进行比照,以此来判断是否检测到金属。
NAPI 获取数据
NAPI(Native API)是 OpenHarmony 规范零碎的一种 JS API 实现机制,适宜封装 IO、CPU 密集型、OS 底层等能力并对外裸露 JS 接口,通过 NAPI 能够实现 JS 与 C/C++ 代码相互拜访。润和 RK3568 利用端通过 NAPI 来承受设施端收回的检测信息。
● 底层 NAPI 模块封装
封装模块名为 tcpserverapi,下载至 tcpservermodule 文件夹。
下载实现后放到 3.1Release 源码根目录,并配置编译脚本;第一次编译实现须要烧写整个镜像,前面批改模块源码,只需将库 send 到板子外面。命令如下:
// 先挂载,再 send
hdc_std shell mount -oremount,rw /
hdc_std file send libtcpserverapi.z.so system/lib/module/libtcpserverapi.z.so
● 利用端导入 NAPI 模块
import tcpserverapi from '@ohos.tcpserverapi'
● 利用端 NAPI 接口调用
// 调用 initServer 接口 初始化 TCP 服务器
tcpserverapi.initServer()
// 调用 recvMsg 获取并解析 Geek_Lite_Board 开发板发送过去的角度
tcpserverapi.recvMsg().then((result) => {var resultAngle = result.angle;})
UI 状态显示与治理
如上图所示为检测中页面,整体布局分为文字题目和检测状态示意图。
文字题目由 Flex 布局容器 text 组件实现,用于出现一段信息,如下为 text 接口相干属性。
● 检测状态示意图包含页面背景图,检测状态图,检测后果阐明文字,具体性能由 Flex 弹性布局组件实现。接口原型如下所示:
Flex(options?: { direction?: FlexDirection, wrap?: FlexWrap, justifyContent?: FlexAlign, alignItems?: ItemAlign, alignContent?: FlexAlign})
● 通过调用 recvMsg 接口接送金属探测器的音讯,并批改首页展现状态,要害实现代码形容如下:
aboutToAppear() {var intervalID = setInterval(() => {tcpserverapi.recvMsg().then((result) => {}}
}
其中“var intervalID = setInterval(() =>”应用了定时器,定时调用“recvMsg”办法,通过 NAPI 获取金属检测后果。
if (resultMetal.match("metal:")) {this.metal = resultMetal.slice(6);
console.info('=======' + this.metal)
if (this.metal === 'Detected') {
this.detectionState = '发现金属';
this.detection = $r("app.media.img_detected");
this.isDisplay = false;
}
else if (this.metal === 'UnDetected' || this.metal ==='CalibrateOK') {
this.detectionState = '检测中';
this.detection = $r("app.media.img_detecting");
this.isDisplay = true;
}
}
当通过 NAPI 形式获取到检测信息为“metal:Detected”时,设置 detectionState 为发现金属状态,屏幕显示检测到金属页面;当通过 NAPI 形式获取到的检测信息为“metal:UnDetected”时,此时并未检测到任何金属信息,设置 detectionState 为检测中状态,屏幕显示检测中状态页面。
语音播报检测状态
检测到金属后,RK3568 会播报已探测到金属的语音信息,达到告诉用户的目标,通过 OpenHarmony 媒体子系统的音频播放性能实现。
OpenHarmony 媒体子系统为开发者提供一套简略且易于了解的接口,使得开发者可能不便接入零碎并应用零碎的媒体资源。媒体子系统蕴含了音频播放、视频播放、音频录制和视频录制等罕用性能。
音频播放的次要工作是将音频数据转码为可听见的音频模拟信号并通过输出设备进行播放,同时对播放工作进行治理。本样例次要通过导入 media 模块、创立音频播放实例、实现音频播放接口和实现暂停播放接口等流程实现。
● 导入 media 模块
import media from '@ohos.multimedia.media';
● 创立音频播放实例
// OH media 对象
private player = media.createAudioPlayer();
● 实现音频播放接口
应用 play() 调用开始播放音频资源,需在实现音频数据加载后,即 src 属性设置实现后能力调用。play():void
四、总结
本文简述了如何应用 OpenHarmony 进行多设施的开发,演示了 NAPI、eTS UI、UI 治理状态 @state 和音频播放等技术个性的利用,通过这些多元化的性能,咱们最终实现了金属探测器样例。丰盛多样的 OpenHarmony 开发样例离不开宽广合作伙伴和开发者的奉献,如果你也想把本人开发的样例分享进去,欢送把样例提交到 OpenHarmony 常识体系 SIG 仓来,一起实现开发样例共建。
五、参考链接
RK3568 开发板上丝滑体验 OpenHarmony 规范零碎
https://gitee.com/openharmony…
在 Windows 编译 OpenHarmony 工程
https://gitee.com/Cruise2019/…
OpenHarmony NAPI 学习文档
https://gitee.com/javen678/he…
OpenHarmony 基于 eTS 扩大的申明式开发范式
https://gitee.com/openharmony…
音频播放开发领导
https://gitee.com/openharmony…
从零开发金属探测器利用
https://gitee.com/openharmony…
GEEKROS 官网
https://www.geekros.com/