基于OpenHarmony的智能金属探测器
一、简介
智能金属探测器是基于 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-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start
在Windows编译OpenHarmony工程
https://gitee.com/Cruise2019/team_x/blob/master/homework/ohos_build_win/readme.md
OpenHarmony NAPI 学习文档
OpenHarmony基于eTS扩展的声明式开发范式
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md
音频播放开发指导
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/audio-playback.md
从零开发金属探测器应用
GEEKROS官网

基于OpenHarmony的智能金属探测器的更多相关文章
- 基于OpenHarmony的智能喝水提醒器
一.硬件说明 Neptune OpenHarmony物联网IOT模组Wi-Fi&蓝牙双模开发板.超声波模块.蜂鸣器模块.杜邦线若干 开发板相关资料:https://gitee.com/hiho ...
- 基于ESP32的智能家居管理系统的设计与实现
基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...
- 基于Linux的智能家居的设计(3)
2 硬件设计 本课题的硬件设计包含主控制器.传输数据设计.数据採集设计.控制驱动设计.显示设计.门禁设计. 2.1 主控制器 依据方案三选择S3C6410主控芯片,S3C6410是由Samsung ...
- 基于Linux的智能家居的设计(4)
3 开发环境的搭建 本次课题使用的开发环境比較特殊.没有一个现成的集成开发环境,需要自己一步一步的搭建开发环境,开发环境的搭建的过程十分复杂,并且假设没有这个开发环境本次课题就无法进行. 因此.在进 ...
- 基于Linux的智能家居的设计(2)
1 系统整体设计方案 智能家居系统的是一个实时查询家庭的温湿度.照明控制.自己主动控制的设定.集家庭娱乐.智能安防为一体,大量数据快处理.可靠的系统,因此在硬件和软件上都有非常大的要求,因此在这里进 ...
- 毕业论文系列之基于WiFi的智能农业大棚管控系统设计代码
#include <dht11.h>//dht11库 #include <MsTimer2.h> //定时器库的 头文件 #include < ...
- 毕业设计——基于ZigBee的智能窗户控制系统的设计与实现
题目:基于物联网的智能窗户控制系统的设计与实现 应用场景:突降大雨,家里没有关窗而进水:家中燃气泄漏,不能及时通风,威胁人身安全,存在火灾的隐患:家中窗户没关,让坏人有机可乘.长时间呆在人多.封闭的空 ...
- 基于ROBO-MAS多智能体自主协同 高频投影定位系统
- 基于AI边缘智能网关的工业质检应用
成品质量检验是工业生产最后必不可少的环节,随着我国工业化的蓬勃发展,工业产品日益迈向高端化.精密化,对于工业产品的质量检验要求和投入成本也在不断提高,产品质检涉及到比以往更多维度.更多零部件.更高精度 ...
- 基于5G/4G智能网关的大货车安全监测方案
大货车是我们身边最常见的货运车辆,从各种原材料到货物成品,都需要大大小小的货车承担过程中的运输工作.而由于货车通常载重多.体积大.行车盲区多,因此也产生较多的交通安全风险. 针对大货车的交通安全保障, ...
随机推荐
- 08-Redis系列之-Redis布隆过滤器,MySQL主从,Django读写分离
Redis实现布隆过滤器 前言 布隆过滤器使用场景 比如有如下几个需求: 原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中? 解决办法一:将10亿个号码存 ...
- Java //100以内的质数的输出(从2开始,到这个数-1结束为止,都不能被这个数本身整除)+优化
1 //100以内的质数的输出(从2开始,到这个数-1结束为止,都不能被这个数本身整除) 2 boolean isFlag = true; //标识i是否被j除尽,修改其值 3 4 for(int i ...
- ASP.NET Core 移除已注册的过滤器
背景 ABP vNext 默认对异常响应进行了处理,现在某个项目需要自定义异常响应结果. 问题 在 ABP vNext 的 MVC 模块当中,可以看到是通过 AddService(typeof(Abp ...
- 修改主频 & 时钟树
在system_stm32f10x.c中可以更改这个 最先调用void SystemInit (void)启动HSI+各种恢复缺省配置 然后 调用 SetSysClock();执行设置时钟7 ...
- get 加 header 下载文件 函数,虽然最后没用。
export const apiDown = (url, data = {}) => { let data2 = secretFilter(data) axiosDown({ url, para ...
- SpringBoot+内置Tomcat配置,参数调优,最大并发量,最大连接数
最近在研究这块的信息,记录下一些大神的文章: SpringBoot 最大连接数及最大并发数是多少???https://blog.csdn.net/weixin_44421461/article/det ...
- 修改阿里云DNS 解决蓝奏云无法访问问题
某些地区的宽带连接不上蓝奏云服务器,需要手动改一下DNS配置,改为阿里云的即可 PS:阿里云DNS服务器地址为223.5.5.5 和 223.6.6.6 下面以win10系统为例,具体步骤如下 1.进 ...
- 安装swagger过程及遇到问题
参考:欢迎点击原文:https://www.cnblogs.com/liconglong/p/11477401.html(主要) https://blog.csdn.net/liangjiabao55 ...
- Git进阶命令-revert
有关Git,之前有写过两篇文章: Git五个常见问题及解决方法 Git进阶命令-reset 一.revert命令使用场景 有一天项目经理跟你说,你开发上线的代码有问题,需要马上撤回. 撤回?你第一反应 ...
- FFmpeg 基本操作摘要(一) (转流、解码、编码)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...