[文章]基于OpenHarmony的华为云IoT智慧路灯实现

阅读量0
2
7
一、智慧路灯简介
我们平时看到的传统路灯基本是通过定时开启、定时关闭来控制路灯亮灭,在夏天白昼时间长,路灯过早开启,造成能源浪费;在冬天白昼时间短,往往经常是天已经黑了,路灯却未开启,给人们的出行带来了诸多不便;也有的路灯通过专人手动开启关闭,这种方式虽较定时方式灵活,但也存在需要人为操作的局限性。随着社会的发展进步,智慧路灯应运而生,智慧路灯通过自身携带的光线传感器,通过传感器采集的的光线数据判断天黑情况,可以根据预置的阈值来实现路灯开启关闭;同时智慧路灯的光线数据也可以同步上传云端,通过云端可以查询到智慧路灯的光线数据、路灯开启关闭状态,同时也可以设置智慧路灯开启关闭的阈值,实现云管理。

前面的文章介绍了基于OpenHarmony的智慧路灯实现,本文将在前面文章的基础上,添加华为云IoT功能,实现基于OpenHarmony系统的IoT智慧路灯。小凌派RK2206开发板内置WIFI模块,外部接口丰富,使用小凌派RK2206开发板搭载智慧路灯模块,能够轻松实现华为云IoT智慧路灯。智慧路灯模块本身自带光线传感器,通过传感器采集的光线数据判断天黑情况,根据预设的阈值来实现路灯的开关,同时将光线数据上传到华为云平台,实现华为云平台管理智慧路灯。

二、硬件电路设计
智慧路灯模块硬件电路如图1所示,电路中包含了E53接口连接器、EEPROM存储器、光线传感器BH1750、大功率LED灯驱动电路。本文主要使用光线传感器BH1750和LED灯驱动电路,其中光线传感器为数字接口芯片,使用I2C总线控制;LED灯驱动电路通过PWD_LED口控制LED灯开启、关闭,PWD_LED输出高电平点亮LED灯,PWD_LED输出低电平熄灭LED灯。模块硬件电路简单,这里就不对此进行多余的说明。
                                       
图片9.png
图1 智慧路灯模块硬件电路图

小凌派RK2206开发板与智慧路灯模块均带有防呆设计,能够很容易区分安装方向,直接将模块插入到小凌派RK2206开发板的E53母座接口上即可,安装如图2所示.
                                
图片1.png
图2 硬件连接图


三、软件设计
1、主程序设计
小凌派RK2206开发板上电后,OpenHarmony系统开始运行,LiteOS系统初始化后,通过LOS_QueueCreate函数创建一个消息队列,用于线程间传递信息;通过LOS_TaskCreate创建e53_isl_thread和iot_cloud_isl_thread两个任务。其中,e53_isl_thread任务周期获取智慧路灯模块采集的信息;iot_cloud_isl_thread任务处理消息队列里的信息,将智慧路灯模块采集的信息上报华为云。
  1. {
  2.     unsigned int ret = LOS_OK;
  3.     unsigned int thread_id1;
  4.     unsigned int thread_id2;
  5.     TSK_INIT_PARAM_S task1 = {0};
  6. TSK_INIT_PARAM_S task2 = {0};

  7.     /*创建消息队列*/
  8.     ret = LOS_QueueCreate("queue", MSG_QUEUE_LENGTH, &m_isl_msg_queue, 0, BUFFER_LEN);
  9.     if (ret != LOS_OK)
  10.     {
  11.         printf("Falied to create Message Queue ret:0x%xn", ret);
  12.         return;
  13.     }

  14.     /*创建智慧路灯信息获取任务*/
  15.     task1.pfnTaskEntry = (TSK_ENTRY_FUNC)iot_cloud_isl_thread;
  16.     task1.uwStackSize = 10240;
  17.     task1.pcName = "iot_cloud_isl_thread";
  18.     task1.usTaskPrio = 24;
  19.     ret = LOS_TaskCreate(&thread_id1, &task1);
  20.     if (ret != LOS_OK)
  21.     {
  22.         printf("Falied to create iot_cloud_isl_thread ret:0x%xn", ret);
  23.         return;
  24.     }

  25.     /*创建华为云IoT任务*/
  26.     task2.pfnTaskEntry = (TSK_ENTRY_FUNC)e53_isl_tread;
  27.     task2.uwStackSize = 2048;
  28.     task2.pcName = "e53_isl_tread";
  29.     task2.usTaskPrio = 25;
  30.     ret = LOS_TaskCreate(&thread_id2, &task2);
  31.     if (ret != LOS_OK)
  32.     {
  33.         printf("Falied to create e53_isl_tread ret:0x%xn", ret);
  34.         return;
  35.     }
  36. }
复制代码

2、智慧路灯信息获取任务程序设计
智慧路灯信息获取任务,进入主程序先初始化智慧路灯模块,程序进入主循环,2秒获取一次光线传感器BH1750的光线强度值,当光线强度值小于20时,打开LED路灯;当光线强度值大于等于20时,关闭LED路灯。同时,将获取到的光线强度值写入消息队列中,等待华为云IoT处理。智慧路灯信息获取任务使用的接口在基于OpenHarmony的智慧路灯实现文章中已经详细说明,这里不再赘述。
  1. {
  2.     float lum = 0;
  3.     isl_msg_t *app_msg = NULL;

  4.     /*智慧路灯模块初始化*/
  5.     e53_isl_init();

  6.     while (1)
  7. {
  8.     /*获取智慧路灯模块数据*/
  9.         lum = e53_isl_read_data();

  10.         printf("luminance value is %.2fn", lum);

  11.         /*光线强度值小于20,点亮LED灯;否则,熄灭LED灯*/
  12.         if (lum < 20)
  13.         {
  14.             isl_light_set_status(ON);
  15.         }
  16.         else
  17.         {
  18.             isl_light_set_status(OFF);
  19.         }

  20.         /*光线强度值写入消息队列中*/
  21.         app_msg = malloc(sizeof(isl_msg_t));
  22.         if (app_msg != NULL)
  23.         {
  24.             app_msg->msg_type = en_msg_report;
  25.             app_msg->report.lum = (int)lum;
  26.             if (LOS_QueueWrite(m_isl_msg_queue, (void *)app_msg, sizeof(isl_msg_t), LOS_WAIT_FOREVER) != LOS_OK)
  27.             {
  28.                 printf("%s LOS_QueueWrite failn", __func__);
  29.                 free(app_msg);
  30.             }
  31.         }
  32.         LOS_Msleep(2000);
  33.     }
  34. }
复制代码

3、华为云IoT任务程序设计
华为云IoT任务主要处理消息队列里的信息。任务启动后,通过SetWifiModeOn连接WIFI;WIFI连接成功后,初始化MQTT协议栈,连接到华为云IoT服务器;成功连接华为云IoT服务器后,线程开始处理消息队列里的消息。消息队列里只有一种消息格式,智慧路灯信息获取任务传输过来的智慧路灯模块的数据,线程直接通过MQTT协议传输到华为云IoT平台上,此时平台上可以查看到最新上报的智慧路灯模块的亮度数据。   
  1. {
  2.     isl_msg_t *app_msg = NULL;
  3.     unsigned int addr;
  4.     int ret;

  5.     /*WIFI连接网络,通过网络*/
  6.     SetWifiModeOn();

  7.   /*初始化MQTT用户名和密匙*/
  8.     device_info_init(CLIENT_ID, USERNAME, PASSWORD);
  9.     ret = oc_mqtt_init();
  10.     if (ret != LOS_OK)
  11.     {
  12.         printf("oc_mqtt_init fail ret:%dn", ret);
  13.     }

  14.     while (1)
  15. {
  16.     /*从队列中获取数据*/
  17.         ret = LOS_QueueRead(m_isl_msg_queue, (void *)&addr, BUFFER_LEN, LOS_WAIT_FOREVER);
  18.         if (ret == LOS_OK)
  19.         {
  20.             app_msg = addr;
  21.             switch (app_msg->msg_type)
  22.             {
  23.                 case en_msg_report:
  24.                     /*将光线强度值上报到华为云平台*/
  25.                     isl_deal_report_msg(&app_msg->report);
  26.                     break;
  27.                 default:
  28.                     break;
  29.             }
  30.             free(app_msg);
  31.             app_msg = NULL;
  32.         }
  33.         else
  34.         {
  35.             LOS_Msleep(100);
  36.         }
  37.     }
  38. }
  39. isl_deal_report_msg函数将光线强度值按照华为云平台的数据结构填充,将光线强度值上报到华为云平台。
  40. void isl_deal_report_msg(isl_report_t *report)
  41. {
  42.     oc_mqtt_profile_service_t service;
  43.     oc_mqtt_profile_kv_t Lum;

  44.     service.event_time = NULL;
  45.     service.service_id = "智慧路灯";
  46.     service.service_property = &Lum;
  47.     service.nxt = NULL;

  48.     Lum.key = "亮度";
  49.     Lum.value = &report->lum;
  50.     Lum.type = EN_OC_MQTT_PROFILE_VALUE_INT;
  51.     Lum.nxt = NULL;

  52.     oc_mqtt_profile_propertyreport(USERNAME, &service);
  53.     return;
  54. }
复制代码

四、编译测试
1、登录华为云IoT平台
设备连接华为云前,需要做一些准备工作,请在华为云平台注册个人用户账号,并且需要实名认证后才可以正常使用。如图3所示,为华为云IotDM地址:https://www.huaweicloud.com/product/iotdm.html
                             
图片2.png

3 华为云IoT网址

2、创建产品
点击立即使用,进入设备接入页面,选择侧边栏产品页面,点击右上角创建产品,添加智慧路灯产品,如图4所示,按照要求填写产品类型。
                              
图片3.png

图4 创建产品

点击进入创建的产品,点击添加服务,服务ID填入智慧路灯,如图5所示。
                             
图片4.png

5 添加服务

选择智慧路灯服务,点击添加属性,添加亮度属性,如图6所示。
                           
图片5.png

图6 添加属性

3、注册设备
创建产品成功后,侧边栏选择设备,点击右上角注册设备,按照要求填写设备信息,保存密匙信息,如图7所示。
                             
图片6.png

7 注册设备

设备创建成功后,点击进入设备详情页面,可以查看设备详细详细,保存设备ID信息,如图8所示。
                           
图片7.png

8 设备详情

在连接华为云前需要获取CLIENT_ID、USERNAME、PASSWORD,访问华为云iot工具https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/;填写注册设备时生成的设备ID和设备密钥,生成连接信息(ClientId、Username、Password),如图9所示。
                           
图片10.png

                                                               9 生成账号、密匙

对应修改代码中对应的CLIENT_ID、USERNAME、PASSWORD。
#define CLIENT_ID                       "61c69349078a93029b83ceff_E53_ISL_0_0_2021122504"
#define USERNAME                        "61c69349078a93029b83ceff_E53_ISL"

#define PASSWORD                        "82933df2133618cad436234d88fde06a196dd8ebc0d5c8cf2ee065968a469546"

4、测试结果
程序编译烧写到小凌派RK2206开发板后,按下开发板的RESET按键,通过串口软件查看日志如下所示;通过遮挡智慧路灯模块上的光线传感器,从而来改变光线强度值,当光
  1. luminance value is 45.83
  2. light off
  3. luminance value is 4.17
  4. light on
复制代码
同时,在华为云平台上,可以看到设备上报上来的光线强度,如图10所示。
图片8.png
10 华为云数据显示

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友