本文正在参加星光计划3.0–夏日挑战赛
一.前言
自从去年12月底无意中得知小熊派发布了一款折叠屏开发板,就一直心心念念的想要弄一块玩玩,当然花钱买是不能买的,就等着哪天意外能得到,这次意外终于来了,开发板顺利到手,因为一直在智能家居物联网行业,肯定先做一个物联网的智能家居小案例出来啦.
先爆美照:

二.开发环境搭建和代码获取
因为我也算"老鸿蒙"了,自己亲手和不亲手搭建的环境有一百多份了,搭建环境这肯定难不到我了,然后就是代码拉取了,跑到小熊派官方仓库去:https://gitee.com/bearpi/bearpi-hm_micro_small
先fork到自己仓库来,然后克隆下载一气呵成,美滋滋.
三.驱动编写
驱动这块就是用的官方的E53案例的驱动,使用的是IA1智慧农业,唯一不同的是我这边风扇不是直接GPIO驱动的,而是采用PWM驱动,具体请看代码:
这里采用PWM通道3来达到控制风扇的目的,至于为什么是通道3,那个pwm的hcs文件里面写了呀(由原理图可知,风扇就在PA6):

还有一点需要注意的:这里的E53_PWMSetDuty()接口传入的并不是常见的百分比,而是一个实际的数字,如果我们需要按百分比调节马达的转速,需要自己去进行转化.
四.界面编写
界面这里用DevcoStudio3Beta4编写,首先要去官网下载工具,然后再创建工程,注意创建工程的时候选择(Lite)Empty Ablility,如下图:

然后是相关参数的填写,注意设备类型选SmartVision智慧屏:

然后就进入工程界面了,等待一会等系统配置好工程之后,打开右边的模拟器,添加一个新设备或者修改设备的分辨率为800*480,如下图:

做好这些事情之后就可以安心的编写界面了,值得一提的是,API6还有好多东西不支持,比如button组建,竟然没有,比如图片的缩放属性:object-fit就没有 用图片的时候就相当难受了,只能忍一忍吧,还能怎么办,期待早点做好.


值得一提的是,咱们OpenHarmony的北向编程是有专门的教程网址的,大家可别迷路了:
https://docs.openharmony.cn/pages/v3.1/zh-cn/application-dev/application-dev-guide.md/

下面是我的拙作及相关代码:
模拟器界面:

实际界面会有点不同:

相关hml代码:
css代码:
然后是js代码:
五.JSI接口添加
在liteOS-a内核上,想要用UI控制硬件,就必须制作JSI接口,这个在小熊派官方文档里面也有介绍,制作JSI接口之前必须保证命令行方式绑定服务和驱动都OK,这里给出小熊派的官方文档吧:
https://gitee.com/bearpi/bearpi-hm_micro_small/blob/master/applications/BearPi/BearPi-HM_Micro/docs/device-dev/通过JS应用控制LED灯.md
然后是北向编程的文档地址:
https://gitee.com/bearpi/bearpi-hm_micro_app/blob/master/docs/led控制案例.md
有的这些地址,你也能通过漂亮的UI界面来控制硬件了.
下面的我的代码示例:
JSIValue AppModule::FanLevel(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
{
HILOG_INFO(HILOG_MODULE_ACE, "==> FanLevel\n");
struct HdfIoService *serv = HdfIoServiceBind(E53_IA1_SERVICE);
if (serv == NULL)
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to get service %s\n", E53_IA1_SERVICE);
return JSI::CreateUndefined();
}
if ((args == nullptr) || (argsNum == 0) || (JSI::ValueIsUndefined(args[0]))) {
return JSI::CreateUndefined();
}
JSIValue success = JSI::GetNamedProperty(args[0], CB_SUCCESS);
JSIValue fail = JSI::GetNamedProperty(args[0], CB_FAIL);
JSIValue complete = JSI::GetNamedProperty(args[0], CB_COMPLETE);
int cmd = E53_IA1_FanLevel;
int level= (int)JSI::GetNumberProperty(args[0], "level");
char data =level+'0';
HILOG_ERROR(HILOG_MODULE_ACE, "cmd is: %d\n", cmd);
HILOG_ERROR(HILOG_MODULE_ACE,"level is: %d\n", level);
HILOG_ERROR(HILOG_MODULE_ACE,"data is: %c\n", data);
char *replyData;
if (E53IA1Control(serv, cmd, &data, &replyData))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to send event\n");
JSI::CallFunction(fail, thisVal, nullptr, 0);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete);
return JSI::CreateUndefined();
}
JSIValue result = JSI::CreateObject();
JSI::SetStringProperty(result, "fan level", replyData);
JSIValue argv[ARGC_ONE] = {result};
JSI::CallFunction(success, thisVal, argv, ARGC_ONE);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete, result);
HdfIoServiceRecycle(serv);
return JSI::CreateUndefined();
}
JSIValue AppModule::SetLed(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum)
{
HILOG_INFO(HILOG_MODULE_ACE, "==> SetLed\n");
struct HdfIoService *serv = HdfIoServiceBind(E53_IA1_SERVICE);
if (serv == NULL)
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to get service %s\n", E53_IA1_SERVICE);
return JSI::CreateUndefined();
}
if ((args == nullptr) || (argsNum == 0) || (JSI::ValueIsUndefined(args[0]))) {
return JSI::CreateUndefined();
}
JSIValue success = JSI::GetNamedProperty(args[0], CB_SUCCESS);
JSIValue fail = JSI::GetNamedProperty(args[0], CB_FAIL);
JSIValue complete = JSI::GetNamedProperty(args[0], CB_COMPLETE);
int cmd = E53_IA1_SetLight;
int onOff= (int)JSI::GetNumberProperty(args[0], "onOff");
const char *data = onOff ? "ON" : "OFF";
HILOG_ERROR(HILOG_MODULE_ACE, "cmd is: %d\n", cmd);
HILOG_ERROR(HILOG_MODULE_ACE,"data is: %s\n", data);
char *replyData;
if (E53IA1Control(serv, cmd, data, &replyData))
{
HILOG_ERROR(HILOG_MODULE_ACE,"fail to send event\n");
JSI::CallFunction(fail, thisVal, nullptr, 0);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete);
return JSI::CreateUndefined();
}
JSIValue result = JSI::CreateObject();
JSI::SetStringProperty(result, "set led", replyData);
JSIValue argv[ARGC_ONE] = {result};
JSI::CallFunction(success, thisVal, argv, ARGC_ONE);
JSI::CallFunction(complete, thisVal, nullptr, 0);
JSI::ReleaseValueList(success, fail, complete, result);
HdfIoServiceRecycle(serv);
return JSI::CreateUndefined();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
六.安装Hap包
安装Hap包首先需要编译然后导出hap包,在编译出的hap包上右键选择在文件管理器打开:


然后需要准备一张SD卡和读卡器,按照小熊派官方的教程很轻松就能做到.
文档地址:https://gitee.com/bearpi/bearpi-hm_micro_small/blob/master/applications/BearPi/BearPi-HM_Micro/docs/device-dev/如何在开发板上安装HAP应用.md
实际过程如图所示:

七.作品展示
到这一步就算完成作品了,请看视频效果:
https://ost.51cto.com/show/15314
楼主试过小马达带风扇的效果如何吗?
这个小马达不好带风扇,中间的轴是圆的,感觉是选型没选好