【OpenHarmony Canary】 手机操控的智能灯 原创 精华

鸿联
发布于 2021-9-6 21:00
浏览
10收藏

很多物联网设备没有人机界面,这些设备可以通过手机,手表,平板,电脑等来进行显示和操控,能够提升操作的便捷性和设备的智能化水平。手头有鸿蒙开发版,我的荣耀手机也刚升级了鸿蒙系统,刚好可以做一个手机控制的智能灯实验。

一.环境准备

  1. Windows10
  2. 设备开发: DevEco Device Tool 2.2 Beta2
  3. 应用开发: DevEco Studio 2.2 Beta1
  4. 源码:OpenHarmony 2.0 Canary 下载
  5. Windows开发环境准备官网
  6. OpenHarmony 2.0 Canary源码开发Hi3861,首先在device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk中打开I2C和PWM开关,在base\iot_hardware\peripheral\interfaces\kits增加和完善Adc,I2C,Gpio的功能和接口。

二.材料准备

  1. 小熊派 BEARPI-HM Nano Hi3861 主板
  2. 小熊派 E53_SC1扩展板
  3. 装配好如图
     【OpenHarmony  Canary】    手机操控的智能灯-鸿蒙开发者社区

三.简介

E53_SC1扩展板的BH1750传感器采集光照强度,通过I2C传给Hi3861,Hi3861作为TCP服务器,将光强和灯状态信息定时打包发给手机TCP客户端,手机接收后在屏幕显示,手机端开灯\关灯操作命令,通过TCP发送给服务端HI3861,解码后控制Gpio 7点亮或关闭LED灯。

四.设备端Hi3861代码

  1. IO口初始化
static void E53_SC1_INT_IO_Init(void)
{  
    IoTGpioInit(7);
    IoTGpioSetFunc(7,IOT_GPIO_FUNC_GPIO_7_GPIO);
    IoTGpioSetDir(7, IOT_GPIO_DIR_OUT);//设置GPIO_7为输出模式

    IoTGpioInit(0);
    IoTGpioSetFunc(0, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);   // GPIO_0复用为I2C1_SDA
    IoTGpioInit(1);
    IoTGpioSetFunc(1, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);   // GPIO_1复用为I2C1_SCL
    IoTI2cInit(IOT_I2C_IDX_1, 400000); /* baudrate: 400kbps */

    IoTGpioInit(11);
    IoTGpioSetFunc(11,IOT_GPIO_FUNC_GPIO_11_GPIO);
    IoTGpioSetDir(11, IOT_GPIO_DIR_IN);              //设置GPIO_11为输入模式,按键F1本地开灯
    IoTGpioSetPull(11, IOT_GPIO_PULL_UP);
    IoTGpioRegisterIsrFunc(11, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, F1_Pressed, NULL);

    IoTGpioInit(12);
    IoTGpioSetFunc(12,IOT_GPIO_FUNC_GPIO_12_GPIO);
    IoTGpioSetDir(12, IOT_GPIO_DIR_IN);             //设置GPIO_12为输入模式,按键F2本地关灯
    IoTGpioSetPull(12, IOT_GPIO_PULL_UP);
    IoTGpioRegisterIsrFunc(12, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, F2_Pressed, NULL);
}
  1. BH1750驱动采用小熊派官方驱动
  2. 数据打包上报
static void deal_report_msg(report_t *report)
{
    char *msg;
    uint8_t ret;
    profile_service_t    service;
    profile_kv_t         lux;
    profile_kv_t         light;
    //配置要发送的数据
    service.event_time = NULL;
    service.service_id = "Smart_Light";
    service.service_property = &lux;
    service.nxt = NULL;
    lux.key = "Lux";
    lux.value = &report->lux;
    lux.type = PROFILE_VALUE_INT;
    lux.nxt =  &light;
    light.key = "Light";
    light.value = light_status ? "ON" : "OFF";
    light.type = PROFILE_VALUE_STRING;
    light.nxt = NULL;
    msg = profile_package_propertyreport(&service);
    if (send(new_fd, msg, strlen(msg), 0) < 0)
    {
        printf("send error\r\n");
        close(new_fd);
    }
    return;
}
  1. 接收命令处理
int deal_command_task(void)
{
    ssize_t ret;
    struct sockaddr_in client_sock;
    int sin_size;
    while (1)
    {
        printf("start accept\n");
        sin_size = sizeof(struct sockaddr_in);
        if ((new_fd = accept(sock_fd, (struct sockaddr *)&client_sock, (socklen_t *)&sin_size)) == -1)
        {
            perror("accept");
        }
        printf("accept succeed\n");
        is_accepted = 1;
        while (1)
        {
            bzero(recvbuf, sizeof(recvbuf));
            if (recv(new_fd, recvbuf, sizeof(recvbuf), 0) < 0)
            {
                printf("recv error\r\n");
                close(new_fd);
                is_accepted = 0;
                break;
            }
            else
            {  
                if (NULL != strstr(recvbuf, "Light"))
                {
                    //开启灯
                    if (NULL != strstr(recvbuf, "ON"))
                    {
                        Light_StatusSet(ON);
                        light_status = 1;
                        printf("Light On!\r\n");
                    }
                    //关闭灯
                    else if (NULL != strstr(recvbuf, "OFF"))
                    {
                        Light_StatusSet(OFF);
                        light_status = 0;
                        printf("Light Off!\r\n");     
                    }
                }
            }
        }
    }
}

五.手机代码

  1. 下载小熊派开源社区源码
  2. DevEco Studio打开后,修改应用代码配置文件 entry\src\main\config.json 中的 bundleName,为AppGallery Connect 应用中配置的应用包名。
  3. 修改 entry\src\main\js\default\pages.index\index.js 中的 bundleName,保持和config.json 中一致。
  4. 定义src/main/js/default/pages/index/index.js文件
data: {
        title: '鸿联-智能灯',
        ipaddress:'192.168.',
        port:"5678",
        send_value:0,
        startflag: false,
        client_statu: false,
        subscribe_statu: false,
        property:[
            {
                "name":"光照",
                "propertyName":"Lux",
                "unit":" lux"
            }
        ],
        command:[
            {
                "name":"庭院灯",
                "paraName":"Light",
                "type":"string"
            }
        ],
        properties:{
            "Lux":0,
            "Light":""
        }
    },
  1. 自动签名后,下载到手机

六.使用

  1. 开发版编译下载后,重启,会自动连接到WiFi,并建立TCP服务器,等待手机客户端接入
     【OpenHarmony  Canary】    手机操控的智能灯-鸿蒙开发者社区
    2.手机连接相同 WiFi,查看开发板 IP 为 192.168.43.239,打开手机端的智能灯 APP,点击右上角的加号按钮,输入开发板的 IP 192.168.43.239 和端口5678,点击OK 后会自动连接开发板。 【OpenHarmony  Canary】    手机操控的智能灯-鸿蒙开发者社区
    3.开发板将采集的光照数据传送到手机上显示,手机开关灯,开发板LED灯按指令亮和灭。
     【OpenHarmony  Canary】    手机操控的智能灯-鸿蒙开发者社区

实验完成,后续将不断改进。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-9-6 21:19:40修改
13
收藏 10
回复
举报
9条回复
按时间正序
/
按时间倒序
mb6130787976b5d
mb6130787976b5d

请问网络是如何连接的?

1
回复
2021-9-7 12:45:03
fh7578
fh7578

必须支持好文章,没板子。

1
回复
2021-9-7 14:42:35
jerckNing
jerckNing

用的是socket通信?咋不用软总线

回复
2021-9-7 18:38:35
鸿联
鸿联 回复了 mb6130787976b5d
请问网络是如何连接的?

下一贴换一块扩展板,说一下网络通讯

回复
2021-9-7 18:59:52
鸿联
鸿联 回复了 fh7578
必须支持好文章,没板子。

谢谢支持

回复
2021-9-7 19:00:10
鸿联
鸿联 回复了 jerckNing
用的是socket通信?咋不用软总线

软总线技术还没掌握,谢谢提醒

回复
2021-9-7 19:01:35
云司机iot
云司机iot

已收藏

回复
2021-9-18 20:56:20
txwtech
txwtech

请问鸿蒙开发板hi3861有中断引脚吗?

回复
2021-9-21 21:39:53
鸿联
鸿联

引脚初始化为输入引脚后,调用IoTGpioRegisterIsrFunc可以开启引脚的中断

回复
2021-9-22 06:32:15
回复
    相关推荐