1 OpenHarmony项目实战:智能体重秤-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony项目实战:智能体重秤

王程 来源:jf_75796907 作者:jf_75796907 2024-02-18 09:26 次阅读

一、简介

本demo基于OpenHarmony3.1Beta版本开发,该样例能够接入数字管家应用,通过数字管家应用监测体重秤上报数据,获得当前测量到的体重,身高,并在应用端形成一段时间内记录的体重值,以折线图的形式表现出来,根据计算的BMI值来提醒当前身体健康状态,推送健康小知识。

1.交互流程

wKgaomXQnWmAdUYcAAEUlgJ5yiQ402.pngwKgZomXQnNqALcaQAAEUlgJ5yiQ297.png


交互图

如上图所示,智能体重称整体方案原理图可以大致分成:智能体重称设备、数字管家应用、云平台三部分。智能体重称通过MQTT协议连接华为IOT物联网平台,从而实现命令的接收和属性上报。 关于智能设备接入华为云IoT平台的详细细节可以参考 连接IOT云平台指南;智能设备同数字管家应用之间的设备模型定义可以参考profile .

2.实物简介

wKgaomXQnWuAdrCRAADRGNjOFSk22.jpegwKgZomXQnOyAToaqAADRGNjOFSk708.png


如上图示,左边为全志xr806模组,右边为超声波测距模块,echo脚连接PA19,Triq脚连接PA20,Vcc脚连接5V电源,Gnd脚接地,

wKgZomXQnWyAJr_BAADlLNMwdYU56.jpegwKgZomXQnQaAdR-PAADlLNMwdYU353.png


如上图示,右边为称重模块,clk脚接PB15,dt脚接PB14,vcc脚接5V,gnd脚接地,称重传感器红色线接E+,黑色线接E-,白色线接A-,绿色线接A+

左边xr806模块左下角k1按键,长按k1按键不放,同时上电,4-5秒后松开按键,可以清除已保存得配网信息

xr806模块,在设备正常工作后,按k1按键,可以初始化当前得重量为0,高度为0

二、 快速上手

1.硬件准备

全志xr806模组

hcsr04超声波模块

hx711称重模块带支架托盘

预装HarmonyOS手机一台

2、环境准备

参照文档: XR806快速上手指导文档

3、编译前准备

设备侧代码下载
具体仓库地址:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/

下载方式:使用git 命令下载,指令如下(用户也可以根据需要将该仓库fork到自己的目录下后进行下载)

cd ~
git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git

代码拷贝

cp -rfa  ~/knowledge_demo_smart_home/dev/team_x  ~/openharmony/vendor/
cp -rfa  ~/knowledge_demo_smart_home/dev/third_party/iot_link  ~/openharmony/third_party/

SOC代码下载替换

当前官方soc代码由于DHCP暂未适配,所以暂时不支持AP模式,这时需要下载并替换之前SOC代码。如果官方soc代码已修复该问题,可忽略此步骤。

git clone https://gitee.com/moldy-potato-chips/xr806_-ap_mode.git
mv ~/openharmony/device/soc/allwinner ~/allwinner.org			// 不建议直接删除,
cp -raf xr806_-ap_mode ~/openharmony/device/soc/allwinner

整合并修改完成后的目录结构如下图

wKgaomXQnWyAeVB1AAA9-Ujk-9c718.pngwKgaomXQnSCAf9JCAAA9-Ujk-9c264.png


修改文件

修改编译依赖
打开 device/soc/allwinner/xradio/xr806/BUILD.gn,添加应用依赖(deps字段):

module_group(module_name) {
  modules = [
      "src",
      "project",
      "include",
  ]
  configs = [
    ":SdkLdCconfig",
  ]
  deps = [ "//vendor/team_x/smart_weight_scale/demo_smart_weight_scale:smart_weight_scale" ]
}

修改编译方式
将demo依赖的库编译方式(static_library)修改为(source_set):
具体依赖查看demo_smart_weight_scale目录下的BUILD.gn:

deps = [
       "../../common/iot_wifi_xradio:iot_wifi",
       "../../common/iot_cloud:iot_cloud",
       "//third_party/cJSON:cjson",
       "../../common/iot_boardbutton_xradio:iot_boardbutton",
       "../../common/iot_boardled_xradio:iot_boardled_xradio",
    ]

其中//third_party/cJSON目录下的BUILD.gn建议参照下面的修改:

source_set("cJSON") {
  sources = [
    "cJSON.c",
    "cJSON_Utils.c",
  ]
  ldflags = [ "-lm" ]
}

third_party/iot_link目录下的各级使用到的BUILD.gn也需要将编译方式修改为source_set,或者将所有需要编译的文件放在iot_link目录的BUILD.gn中,如下:

source_set("iot_link") {
    sources = [
        "link_log/link_log.c",
        "link_misc/link_random.c",
        "link_misc/link_ring_buffer.c",
        "link_misc/link_string.c",
        "network/dtls/dtls_al/dtls_al.c",
        "network/dtls/mbedtls/mbedtls_port/dtls_interface.c",
        "network/dtls/mbedtls/mbedtls_port/mbed_port.c",
        "network/dtls/mbedtls/mbedtls_port/timing_alt.c",
        "network/mqtt/mqtt_al/mqtt_al.c",
        "network/mqtt/paho_mqtt/port/paho_mqtt_port.c",
        "network/mqtt/paho_mqtt/port/paho_osdepends.c",
        "network/mqtt/paho_mqtt/paho/MQTTClient-C/src/MQTTClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTConnectClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTConnectServer.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTDeserializePublish.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTFormat.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTPacket.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTSerializePublish.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTSubscribeClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTSubscribeServer.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTUnsubscribeClient.c",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src/MQTTUnsubscribeServer.c",
        "oc_mqtt/oc_mqtt_al/oc_mqtt_al.c",
        "oc_mqtt/oc_mqtt_profile_v5/oc_mqtt_profile.c",
        "oc_mqtt/oc_mqtt_profile_v5/oc_mqtt_profile_package.c",
        "oc_mqtt/oc_mqtt_profile_v5/oc_mqtt_event.c",
        "oc_mqtt/oc_mqtt_tiny_v5/oc_mqtt_tiny.c",
        "oc_mqtt/oc_mqtt_tiny_v5/hmac.c",
        "queue/queue.c",
    ]
    
    cflags = [ "-Wno-unused-variable" ]
    cflags += [ "-Wno-unused-but-set-variable" ]
    cflags += [  "-Wno-sign-compare" ]
    cflags += [  "-Wno-unused-parameter" ]
    cflags += [  "-Wno-unused-function" ]

    ldflags = [ "-Wl,-rpath-link=//device/xradio/xr806/xr_skylark/lib" ]
    ldflags += [ "-lmbedtls" ]

    include_dirs = [
        "inc",
        "link_log",
        "link_misc",
        "queue",
        "oc_mqtt/oc_mqtt_tiny_v5",
        "oc_mqtt/oc_mqtt_profile_v5",
        "oc_mqtt/oc_mqtt_al",
        "network/dtls/mbedtls/mbedtls_port",
        "network/mqtt/paho_mqtt/port",
        "network/mqtt/paho_mqtt/paho/MQTTClient-C/src",
        "network/mqtt/paho_mqtt/paho/MQTTPacket/src",
        "//third_party/mbedtls/include/",
        "//third_party/mbedtls/include/",
        "//third_party/cJSON",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//device/xradio/xr806/xr_skylark/include/net/mbedtls-2.2.0/",
    ]

    defines = [
        "MQTTCLIENT_PLATFORM_HEADER=paho_osdepends.h",
        "WITH_DTLS",
        "MBEDTLS_AES_ROM_TABLES",
        "MBEDTLS_CONFIG_FILE="los_mbedtls_config_dtls.h"",
        "CONFIG_DTLS_MBEDTLS_CERT",
        "CONFIG_DTLS_MBEDTLS_PSK",
        "CFG_MBEDTLS_MODE=PSK_CERT",
        "CONFIG_OC_MQTT_TINY_ENABLE=1"
    ]
}

修改iot_link中的部分文件
1.third_party/iot_link/network/mqtt/paho_mqtt/port/paho_mqtt_port.c

测试发现,当fd为0的时候,在执行recv时会立马返回-1,因此做下面规避操作。

static int __socket_connect(Network *n, const char *host, int port)
{
	...
	int tmpfd = socket(AF_INET,SOCK_STREAM,0); // to skip fd = 0;
	fd = socket(AF_INET,SOCK_STREAM,0);
	if(fd == -1) {
		return ret;
	}
	close(tmpfd);       // to skip fd = 0;
	...
}

系统setsockopt函数未适配,因此需要做下面的修改:

static int __socket_read(void *ctx, unsigned char *buf, int len, int timeout)
{
	int fd;
    int ret = 0;
#if 0
	struct timeval timedelay = {timeout / 1000, (timeout % 1000) * 1000};
    if(NULL== uf)
    {
        return ret;
    }
    
    fd = (int)(intptr_t)ctx;  ///< socket could be zero

    if (timedelay.tv_sec < 0 || (timedelay.tv_sec == 0 && timedelay.tv_usec <= 0))
    {
        timedelay.tv_sec = 0;
        timedelay.tv_usec = 100;
    }
    
    if(0 != setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&timedelay,sizeof(struct timeval)))
    {
        return ret;  //could not support the rcv timeout
    }
    int bytes = 0;
    while (bytes < len) {
        int rc = recv(fd, &buf[bytes], (size_t)(len - bytes), 0);
        printf("[%s|%s|%d]fd = %d, rc = %dn", __FILE__,__func__,__LINE__, fd, rc);
        if (rc == -1) {
            if (errno != EAGAIN && errno != EWOULDBLOCK) {
                bytes = -1;
            }
            break;
        } else if (rc == 0) {
            bytes = 0;
            break;
        } else {
            bytes += rc;
        }
    }
    return bytes;
#else
	int bytes = 0;
    fd_set fdset;

    struct timeval timedelay = {timeout / 1000, (timeout % 1000) * 1000};
    if(NULL== buf)
    {
        return ret;
    }
    
    fd = (int)(intptr_t)ctx;  ///< socket could be zero

    if (timedelay.tv_sec < 0 || (timedelay.tv_sec == 0 && timedelay.tv_usec <= 0))
    {
        timedelay.tv_sec = 0;
        timedelay.tv_usec = 100;
    }
    timedelay.tv_sec = 2;
    FD_ZERO(&fdset);
    FD_SET(fd, &fdset);

    ret = select(fd + 1, &fdset, NULL, NULL, &timedelay);
    if (ret > 0) {
        while (bytes < len) {
            int rc = recv(fd, &buf[bytes], (size_t)(len - bytes), 0);
 //         printf("[%s|%s|%d]fd = %d, rc = %d, errno=%d(%s)n", __FILE__,__func__,__LINE__, fd, rc,errno, strerror(errno));
            if (rc == -1) {
                if (errno != EAGAIN && errno != EWOULDBLOCK) {
                    bytes = -1;
                }
                break;
            } else if (rc == 0) {
                bytes = 0;
                break;
            } else {
                bytes += rc;
            }
        }
    }

    return bytes;
#endif
}

2.third_party/iot_link/network/dtls/mbedtls/mbedtls_port/dtls_interface.c

在文件顶部添加打印函数定义以及添加mbedtls_calloc以及mbedtls_free的定义,否则编译会提示错误:

#define MBEDTLS_LOG LINK_LOG_DEBUG
#ifndef mbedtls_calloc
#define mbedtls_calloc  calloc
#endif
#ifndef mbedtls_free
#define mbedtls_free  free
#endif

系统部分mbedtls接口不一致,固需要注释部分接口代码:

mbedtls_ssl_context dtls_ssl_new(dtls_establish_info_s *info, char plat_type)
{
	...
	if (info->psk_or_cert == VERIFY_WITH_PSK)
    {
/*
        if ((ret = mbedtls_ssl_conf_psk(conf,
                                        info->v.p.psk,
                                        info->v.p.psk_len,
                                        info->v.p.psk_identity,
                                        strlen((const char *)info->v.p.psk_identity))) != 0)
        {
            MBEDTLS_LOG("mbedtls_ssl_conf_psk failed: -0x%x", -ret);
            goto exit_fail;
        }
*/
    }
    ...
}

int dtls_shakehand(mbedtls_ssl_context *ssl, const dtls_shakehand_info_s *info)
{
	...
	if (MBEDTLS_SSL_IS_CLIENT == info->client_or_server)
    {
        ret = mbedtls_net_connect(server_fd, info->u.c.host, info->u.c.port, info->udp_or_tcp);
        if( 0 != ret)
        {
            ret = MBEDTLS_ERR_NET_CONNECT_FAILED;
            goto exit_fail;
        }
    }
    else
    {
        //server_fd = (mbedtls_net_context*)atiny_net_bind(NULL, info->u.s.local_port, MBEDTLS_NET_PROTO_UDP);
        ///< --TODO ,not implement yet
    }
	...
}

void dtls_init(void)
{
    (void)mbedtls_platform_set_calloc_free(calloc, free);
    (void)mbedtls_platform_set_snprintf(snprintf);
//    (void)mbedtls_platform_set_printf(printf);
}

在iot_link/network/dtls/mbedtls/mbedtls_port/mbed_port.c文件中的dtls_imp_init()函数中,也需要注释掉未实现的接口,否则编译报错:

int dtls_imp_init(void)
{
    int ret =-1;

    // (void)mbedtls_platform_set_calloc_free(calloc, free); 
    // (void)mbedtls_platform_set_snprintf(snprintf);
    // (void)mbedtls_platform_set_printf(printf);
    ret = dtls_al_install(&s_mbedtls_io);

    return ret;
}

3.在文件iot_link/network/mqtt/paho_mqtt/port/paho_osdepends.c中添加对应timersub和timeradd的实现(系统中未实现该函数):

// add this for "timersub" && "timeradd"
#ifndef	timersub
#define timersub(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec - (t)->tv_sec, 
        ((a)->tv_usec = (s)->tv_usec - (t)->tv_usec) < 0 && 
        ((a)- >tv_usec += 1000000, (a)->tv_sec--) )
#endif
#ifndef	timeradd
#define timeradd(s,t,a) (void) ( (a)->tv_sec = (s)->tv_sec + (t)->tv_sec, 
        ((a)->tv_usec = (s)->tv_usec + (t)->tv_usec) >= 1000000 && 
        ((a)->tv_usec -= 1000000, (a)->tv_sec++) )
#endif

4.编译中会有部分头文件提示找不到,这个时候直接将其注释即可

(iot_link/network/mqtt/paho_mqtt/port/paho_osdepends.h):

#define INVALID_SOCKET SOCKET_ERROR
// #include < sys/socket.h >
#include < sys/param.h >
#include < sys/time.h >
// #include < netinet/in.h >
// #include < netinet/tcp.h >
// #include < arpa/inet.h >
// #include < netdb.h >
#include < stdio.h >
#include < unistd.h >
#include < errno.h >
#include < fcntl.h >
#include < string.h >
#include < stdlib.h >
#endif

#if defined(WIN32)
#include < Iphlpapi.h >
#else
// #include < sys/ioctl.h >
// #include < net/if.h >
#endif

5.因为弱引用导致无法链接相关符号,因此需要注释以下几个文件中的弱引用。

文件一 third_party/iot_link/network/dtls/dtls_al/dtls_al.c
#if 0
__attribute__((weak))  int dtls_imp_init(void)
{
    LINK_LOG_DEBUG("%s:###please implement dtls by yourself####",__FUNCTION__);
    return -1;
}
#endif
extern int dtls_imp_init(void);

文件二 third_party/iot_link/network/mqtt/mqtt_al/mqtt_al.c
#if 0
__attribute__((weak))  int mqtt_imp_init(void)
{
    LINK_LOG_DEBUG("%s:###please implement mqtt by yourself####",__FUNCTION__);
    return -1;
}
#endif
extern int mqtt_imp_init(void);

文件三 third_party/iot_link/oc_mqtt/oc_mqtt_al/oc_mqtt_al.c
#if 0
__attribute__ ((weak)) int oc_mqtt_imp_init(void)
{
    LINK_LOG_DEBUG("%s:###please implement oc mqtt by yourself####",__FUNCTION__);
    return 0;
}

__attribute__ ((weak)) int oc_mqtt_demo_main(void)
{
    LINK_LOG_WARN("Please implement the oc mqtt v5 demo yourself");
    return -1;
}
#endif
extern int oc_mqtt_demo_main(void);

修改GPIO查找方式

因为GPIO框架修改了设备驱动注册的管脚号,导致应用无法根据HCS的引脚操作对应的GPIO,此问题已经提issue,如果该问题已解决,可以忽略此步骤。

打开drivers/framework/support/platform/src/gpio/gpio_manager.c,将cntlr->start = start;注释即可。

static int32_t GpioManagerAdd(struct PlatformManager *manager, struct PlatformDevice *device)
{
    uint16_t start;
    struct GpioCntlr *cntlr = CONTAINER_OF(device, struct GpioCntlr, device);

    if ((start = GpioCntlrQueryStart(cntlr, &manager->devices)) >= GPIO_NUM_MAX) {
        PLAT_LOGE("GpioCntlrAdd: query range for start:%d fail:%d", cntlr->start, start);
        return HDF_ERR_INVALID_PARAM;
    }

//    cntlr->start = start;
    DListInsertTail(&device->node, &manager->devices);
    PLAT_LOGI("%s: start:%u count:%u", __func__, cntlr->start, cntlr->count);
    return HDF_SUCCESS;
}

将对应的驱动文件复制到drvier对应目录:

因为主仓代码中未将对应的驱动文件合并到driver/adpater/platform对应的目录下,固需要手动将文件拷贝到对应目录。若主仓已合入,可忽略此步骤。

// 拷贝gpio驱动
cp -af device/soc/allwinner/xradio/drivers/gpio/gpio_xradio.* driver/adpater/platform/gpio

// 修改driver/adpater/platform/gpio/BUILD.gn文件,加上gpio_xradio的编译

hdf_driver(module_name) {
  sources = []
  if (defined(LOSCFG_SOC_COMPANY_BESTECHNIC)) {
    sources += [ "gpio_bes.c" ]
  }

  if (defined(LOSCFG_SOC_COMPANY_ALLWINNER)) {
    sources += [ "gpio_xradio.c" ]
  }

  include_dirs = [ "." ]
}

为了节省ram资源,可以把无用的资源先关闭,如关闭内部codec,将 device/soc/allwinner/xradio/xr806/project/prj_config.h中的PRJCONF_INTERNAL_SOUNDCARD_EN设置为0,如下:

/* Xradio internal codec sound card enable/disable */
#define PRJCONF_INTERNAL_SOUNDCARD_EN   0

4、代码编译

#首先可以查看一下hb的版本,如果hb版本为0.4.4版本就不需要更新。

查看hb版本

hb --version

更新hb, 以下指令需要在openharmony SDK根目录执行

pip3 uninstall ohos_build
pip3 install build/li

编译命令:
hb set  // 如果是第一次编译,Input code path 命令行中键入"./" 指定OpenHarmony工程编译根目录后 回车,

如下图所示,使用键盘上下键选中wifi_skylark

wKgZomXQnW2AfJ7CAAA9-Ujk-9c553.pngwKgZomXQnUuAP_yPAAAhKpafk90437.png

hb build // 如果需要全量编译,可以添加-f 选项

生成的固件保存在out/xradio/smart_weight_scale目录下

5、固件烧录

参照文档: XR806快速上手指导文档

6、设备配网

在设备上电前需准备好安装了数字管家应用的HarmonyOS手机,详情见数字管家应用开发, 并在设置中开启手机的NFC功能;

写设备NFC标签,详细操作见设备NFC标签指导文档;

烧录完成后,上电。开发者在观察开发板上状态LED灯以8Hz的频率闪烁时,将手机上半部靠近开发板NFC标签处(无NFC标签的可用NFC贴纸替代);

碰一碰后手机将自动拉起数字管家应用并进入配网状态;

配网过程中需要 连接设备的AP热点,然后填写需要配置的wifi的密码;

最后点击配置,手机会将ssid以及对应的密码通过AP热点发送到设备。

wKgaomXQnW6Ad5CrAA9xFE6PAlY180.gifpoYBAGJCzzCAI8MiAA9xFE6PAlY065.gif


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IOT
    IOT
    +关注

    关注

    187

    文章

    4201

    浏览量

    196665
  • 智能体重秤
    +关注

    关注

    0

    文章

    7

    浏览量

    1603
  • 华为云
    +关注

    关注

    3

    文章

    2445

    浏览量

    17405
  • OpenHarmony
    +关注

    关注

    25

    文章

    3713

    浏览量

    16251
收藏 人收藏

    评论

    相关推荐

    凌蒙派OpenHarmony开源项目荣获本期Gitee官方推荐

    近日,我司凌蒙派OpenHarmony开源项目荣获本期Gitee官方推荐。本期Gitee官方推荐不仅是对凌蒙派OpenHarmony开源项目的高度认可,也是对我司在推动开源生态建设方面
    的头像 发表于 11-20 01:04 234次阅读
    凌蒙派<b class='flag-5'>OpenHarmony</b>开源<b class='flag-5'>项目</b>荣获本期Gitee官方推荐

    STM32项目实战:基于STM32U5的智能大棚温控系统(LVGL),附项目教程/源码

    智能大棚温控系统_STM32U5》项目完整文档、项目源码,点击下方链接免费领取。项目资料领取https://s.c1ns.cn/F5XyUSTM32
    的头像 发表于 11-13 17:08 534次阅读
    STM32<b class='flag-5'>项目</b><b class='flag-5'>实战</b>:基于STM32U5的<b class='flag-5'>智能</b>大棚温控系统(LVGL),附<b class='flag-5'>项目</b>教程/源码

    STM32项目实战:基于STM32U5的智能灯光控制系统(LVGL),附项目教程/源码

    智能灯光控制系统_STM32U5》项目完整文档、项目源码,点击免费领取。项目资料领取:https://s.c1ns.cn/F5XyUSTM32项目
    的头像 发表于 11-07 18:50 754次阅读
    STM32<b class='flag-5'>项目</b><b class='flag-5'>实战</b>:基于STM32U5的<b class='flag-5'>智能</b>灯光控制系统(LVGL),附<b class='flag-5'>项目</b>教程/源码

    STM32项目实战:基于STM32F4的智能灯光控制系统(LVGL),附项目教程/源码

    智能灯光控制系统_STM32F4》项目完整文档、项目源码,私信小雯老师免费领取。STM32项目实战之“
    的头像 发表于 10-17 16:16 752次阅读
    STM32<b class='flag-5'>项目</b><b class='flag-5'>实战</b>:基于STM32F4的<b class='flag-5'>智能</b>灯光控制系统(LVGL),附<b class='flag-5'>项目</b>教程/源码

    【全新课程资料】正点原子《ESP32基础及项目实战入门》培训课程资料上线!

    与组件添加、下载与调试、GPIO外设讲解、GPIO外部中断讲解、UART外设讲解、TIMG定时器组讲解和LEDC外设的讲解 实战项目:火灾报警器项目、超声波测距项目、抢答器
    发表于 09-24 17:59

    【全新课程资料】正点原子《ESP32物联网项目实战》培训课程资料上线!

    正点原子《ESP32物联网项目实战》全新培训课程上线啦!正点原子工程师手把手教你学!通过多个项目实战,掌握ESP32物联网项目的开发! 一、
    发表于 09-24 17:05

    基于迅为RK3588【RKNPU2项目实战1】:YOLOV5实时目标分类

    [/url] 【RKNPU2 人工智能开发】 【AI深度学习推理加速器】——RKNPU2 从入门到实践(基于RK3588和RK3568) 【RKNPU2项目实战1】:YOLOV5实时目标分类 【RKNPU2
    发表于 08-15 10:51

    OpenHarmony项目群技术指导委员会2024年中务虚研讨会圆满落幕

    7月19日至20日,OpenHarmony项目群技术指导委员会(后文简称“OpenHarmony TSC”)2024年中务虚研讨会于中国厦门顺利召开。 本次会议由OpenHarmony
    的头像 发表于 07-23 10:42 519次阅读
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>项目</b>群技术指导委员会2024年中务虚研讨会圆满落幕

    快准狠!体脂VS体重,你来选

    快准狠!体脂VS体重,你来选
    的头像 发表于 05-21 08:04 2.2w次阅读
    快准狠!体脂<b class='flag-5'>秤</b>VS<b class='flag-5'>体重</b><b class='flag-5'>秤</b>,你来选

    OpenHarmony南向开发案例:【智能体重

    通过数字管家应用监测体重上报数据,获得当前测量到的体重,身高,并在应用端形成一段时间内记录的体重值,以折线图的形式表现出来,根据计算的BMI值来提醒当前身体健康状态,推送健康小知识。
    的头像 发表于 04-17 11:12 609次阅读
    <b class='flag-5'>OpenHarmony</b>南向开发案例:【<b class='flag-5'>智能</b><b class='flag-5'>体重</b><b class='flag-5'>秤</b>】

    OpenHarmony内核编程实战

    编程入门[Hello,OpenHarmony]在正式开始之前,对于刚接触OpenHarmony的伙伴们,面对大篇幅的源码可能无从下手,不知道怎么去编码写程序,下面用一个简单的例子带伙伴们入门。▍任务
    的头像 发表于 03-27 08:31 804次阅读
    <b class='flag-5'>OpenHarmony</b>内核编程<b class='flag-5'>实战</b>

    鸿蒙OpenHarmony开发实战:【MiniCanvas】

    基于OpenHarmony的Cavas组件封装了一版极简操作的MiniCanvas,屏蔽了原有Canvas内部复杂的调用流程,支持一个API就可以实现相应的绘制能力,该库还在继续完善中,也欢迎PR。
    的头像 发表于 03-23 20:43 351次阅读

    【六】Purple Pi OH开发板带你7天入门OpenHarmony

    今天我们来从OpenHarmony简介、环境搭建、创建第一个OpenHarmony项目等方面开始OpenHarmony应用开发的第一步。一.Open
    的头像 发表于 03-14 08:31 541次阅读
    【六】Purple Pi OH开发板带你7天入门<b class='flag-5'>OpenHarmony</b>!

    鸿蒙实战项目开发:【短信服务】

    OpenHarmony 多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT) 技术知识点 如果你是一名An
    发表于 03-03 21:29

    OpenHarmony 项目实战:基于全志 XR806 实现的上下位机双 OpenHarmony 智能门锁样例

    一、简介 本 demo 是基于 Openharmony 3.1 Beta 本版开发,不仅可以接收数字管家应用下发的指令来控制门锁开启,而且还可以通过数字管家设置不同的开锁密码以及一次性密码,实现给
    的头像 发表于 02-19 17:25 1078次阅读
    <b class='flag-5'>OpenHarmony</b> <b class='flag-5'>项目</b><b class='flag-5'>实战</b>:基于全志 XR806 实现的上下位机双 <b class='flag-5'>OpenHarmony</b> <b class='flag-5'>智能</b>门锁样例