一、智慧路燈簡介
我們平時(shí)看到的傳統(tǒng)路燈基本是通過定時(shí)開啟、定時(shí)關(guān)閉來控制路燈亮滅,在夏天白晝時(shí)間長,路燈過早開啟,造成能源浪費(fèi);在冬天白晝時(shí)間短,往往經(jīng)常是天已經(jīng)黑了,路燈卻未開啟,給人們的出行帶來了諸多不便;也有的路燈通過專人手動(dòng)開啟關(guān)閉,這種方式雖較定時(shí)方式靈活,但也存在需要人為操作的局限性。隨著社會(huì)的發(fā)展進(jìn)步,智慧路燈應(yīng)運(yùn)而生,智慧路燈通過自身攜帶的光線傳感器,通過傳感器采集的的光線數(shù)據(jù)判斷天黑情況,可以根據(jù)預(yù)置的閾值來實(shí)現(xiàn)路燈開啟關(guān)閉;同時(shí)智慧路燈的光線數(shù)據(jù)也可以同步上傳云端,通過云端可以查詢到智慧路燈的光線數(shù)據(jù)、路燈開啟關(guān)閉狀態(tài),同時(shí)也可以設(shè)置智慧路燈開啟關(guān)閉的閾值,實(shí)現(xiàn)云管理。
前面的文章介紹了基于OpenHarmony的智慧路燈實(shí)現(xiàn),本文將在前面文章的基礎(chǔ)上,添加華為云IoT功能,實(shí)現(xiàn)基于OpenHarmony系統(tǒng)的IoT智慧路燈。小凌派RK2206開發(fā)板內(nèi)置WIFI模塊,外部接口豐富,使用小凌派RK2206開發(fā)板搭載智慧路燈模塊,能夠輕松實(shí)現(xiàn)華為云IoT智慧路燈。智慧路燈模塊本身自帶光線傳感器,通過傳感器采集的光線數(shù)據(jù)判斷天黑情況,根據(jù)預(yù)設(shè)的閾值來實(shí)現(xiàn)路燈的開關(guān),同時(shí)將光線數(shù)據(jù)上傳到華為云平臺(tái),實(shí)現(xiàn)華為云平臺(tái)管理智慧路燈。
智慧路燈模塊硬件電路如圖1所示,電路中包含了E53接口連接器、EEPROM存儲(chǔ)器、光線傳感器BH1750、大功率LED燈驅(qū)動(dòng)電路。本文主要使用光線傳感器BH1750和LED燈驅(qū)動(dòng)電路,其中光線傳感器為數(shù)字接口芯片,使用I2C總線控制;LED燈驅(qū)動(dòng)電路通過PWD_LED口控制LED燈開啟、關(guān)閉,PWD_LED輸出高電平點(diǎn)亮LED燈,PWD_LED輸出低電平熄滅LED燈。模塊硬件電路簡單,這里就不對(duì)此進(jìn)行多余的說明。
圖1 智慧路燈模塊硬件電路圖
小凌派RK2206開發(fā)板與智慧路燈模塊均帶有防呆設(shè)計(jì),能夠很容易區(qū)分安裝方向,直接將模塊插入到小凌派RK2206開發(fā)板的E53母座接口上即可,安裝如圖2所示.
圖2 硬件連接圖
三、軟件設(shè)計(jì)
1、主程序設(shè)計(jì)
小凌派RK2206開發(fā)板上電后,OpenHarmony系統(tǒng)開始運(yùn)行,LiteOS系統(tǒng)初始化后,通過LOS_QueueCreate函數(shù)創(chuàng)建一個(gè)消息隊(duì)列,用于線程間傳遞信息;通過LOS_TaskCreate創(chuàng)建e53_isl_thread和iot_cloud_isl_thread兩個(gè)任務(wù)。其中,e53_isl_thread任務(wù)周期獲取智慧路燈模塊采集的信息;iot_cloud_isl_thread任務(wù)處理消息隊(duì)列里的信息,將智慧路燈模塊采集的信息上報(bào)華為云。
{ unsigned int ret = LOS_OK; unsigned int thread_id1; unsigned int thread_id2; TSK_INIT_PARAM_S task1 = {0};TSK_INIT_PARAM_S task2 = {0};
/*創(chuàng)建消息隊(duì)列*/ ret = LOS_QueueCreate("queue", MSG_QUEUE_LENGTH, &m_isl_msg_queue, 0, BUFFER_LEN); if (ret != LOS_OK) { printf("Falied to create Message Queue ret:0x%x\n", ret); return; }
/*創(chuàng)建智慧路燈信息獲取任務(wù)*/ task1.pfnTaskEntry = (TSK_ENTRY_FUNC)iot_cloud_isl_thread; task1.uwStackSize = 10240; task1.pcName = "iot_cloud_isl_thread"; task1.usTaskPrio = 24; ret = LOS_TaskCreate(&thread_id1, &task1); if (ret != LOS_OK) { printf("Falied to create iot_cloud_isl_thread ret:0x%x\n", ret); return; }
/*創(chuàng)建華為云IoT任務(wù)*/ task2.pfnTaskEntry = (TSK_ENTRY_FUNC)e53_isl_tread; task2.uwStackSize = 2048; task2.pcName = "e53_isl_tread"; task2.usTaskPrio = 25; ret = LOS_TaskCreate(&thread_id2, &task2); if (ret != LOS_OK) { printf("Falied to create e53_isl_tread ret:0x%x\n", ret); return; }}
2、智慧路燈信息獲取任務(wù)程序設(shè)計(jì)
智慧路燈信息獲取任務(wù),進(jìn)入主程序先初始化智慧路燈模塊,程序進(jìn)入主循環(huán),2秒獲取一次光線傳感器BH1750的光線強(qiáng)度值,當(dāng)光線強(qiáng)度值小于20時(shí),打開LED路燈;當(dāng)光線強(qiáng)度值大于等于20時(shí),關(guān)閉LED路燈。同時(shí),將獲取到的光線強(qiáng)度值寫入消息隊(duì)列中,等待華為云IoT處理。智慧路燈信息獲取任務(wù)使用的接口在基于OpenHarmony的智慧路燈實(shí)現(xiàn)文章中已經(jīng)詳細(xì)說明,這里不再贅述。
{ float lum = 0; isl_msg_t *app_msg = NULL;
/*智慧路燈模塊初始化*/ e53_isl_init();
while (1){ /*獲取智慧路燈模塊數(shù)據(jù)*/ lum = e53_isl_read_data();
printf("luminance value is %.2f\n", lum);
/*光線強(qiáng)度值小于20,點(diǎn)亮LED燈;否則,熄滅LED燈*/ if (lum < 20) ? ? ? ?{ ? ? ? ? ? ?isl_light_set_status(ON); ? ? ? ?} ? ? ? ?else ? ? ? ?{ ? ? ? ? ? ?isl_light_set_status(OFF); ? ? ? ?}
/*光線強(qiáng)度值寫入消息隊(duì)列中*/ app_msg = malloc(sizeof(isl_msg_t)); if (app_msg != NULL) { app_msg->msg_type = en_msg_report; app_msg->report.lum = (int)lum; if (LOS_QueueWrite(m_isl_msg_queue, (void *)app_msg, sizeof(isl_msg_t), LOS_WAIT_FOREVER) != LOS_OK) { printf("%s LOS_QueueWrite fail\n", __func__); free(app_msg); } } LOS_Msleep(2000); }}
3、華為云IoT任務(wù)程序設(shè)計(jì)
華為云IoT任務(wù)主要處理消息隊(duì)列里的信息。任務(wù)啟動(dòng)后,通過SetWifiModeOn連接WIFI;WIFI連接成功后,初始化MQTT協(xié)議棧,連接到華為云IoT服務(wù)器;成功連接華為云IoT服務(wù)器后,線程開始處理消息隊(duì)列里的消息。消息隊(duì)列里只有一種消息格式,智慧路燈信息獲取任務(wù)傳輸過來的智慧路燈模塊的數(shù)據(jù),線程直接通過MQTT協(xié)議傳輸?shù)饺A為云IoT平臺(tái)上,此時(shí)平臺(tái)上可以查看到最新上報(bào)的智慧路燈模塊的亮度數(shù)據(jù)。
{ isl_msg_t *app_msg = NULL; unsigned int addr; int ret;
/*WIFI連接網(wǎng)絡(luò),通過網(wǎng)絡(luò)*/ SetWifiModeOn();
/*初始化MQTT用戶名和密匙*/ device_info_init(CLIENT_ID, USERNAME, PASSWORD); ret = oc_mqtt_init(); if (ret != LOS_OK) { printf("oc_mqtt_init fail ret:%d\n", ret); }
while (1){ /*從隊(duì)列中獲取數(shù)據(jù)*/ ret = LOS_QueueRead(m_isl_msg_queue, (void *)&addr, BUFFER_LEN, LOS_WAIT_FOREVER); if (ret == LOS_OK) { app_msg = addr; switch (app_msg->msg_type) { case en_msg_report: /*將光線強(qiáng)度值上報(bào)到華為云平臺(tái)*/ isl_deal_report_msg(&app_msg->report); break; default: break; } free(app_msg); app_msg = NULL; } else { LOS_Msleep(100); } }}isl_deal_report_msg函數(shù)將光線強(qiáng)度值按照華為云平臺(tái)的數(shù)據(jù)結(jié)構(gòu)填充,將光線強(qiáng)度值上報(bào)到華為云平臺(tái)。void isl_deal_report_msg(isl_report_t *report){ oc_mqtt_profile_service_t service; oc_mqtt_profile_kv_t Lum;
service.event_time = NULL; service.service_id = "智慧路燈"; service.service_property = &Lum; service.nxt = NULL;
Lum.key = "亮度"; Lum.value = &report->lum; Lum.type = EN_OC_MQTT_PROFILE_VALUE_INT; Lum.nxt = NULL;
oc_mqtt_profile_propertyreport(USERNAME, &service); return;}
四、編譯測(cè)試
1、登錄華為云IoT平臺(tái)
設(shè)備連接華為云前,需要做一些準(zhǔn)備工作,請(qǐng)?jiān)谌A為云平臺(tái)注冊(cè)個(gè)人用戶賬號(hào),并且需要實(shí)名認(rèn)證后才可以正常使用。如圖3所示,為華為云IotDM地址:https://www.huaweicloud.com/product/iotdm.html
圖3 華為云IoT網(wǎng)址
2、創(chuàng)建產(chǎn)品
點(diǎn)擊立即使用,進(jìn)入設(shè)備接入頁面,選擇側(cè)邊欄產(chǎn)品頁面,點(diǎn)擊右上角創(chuàng)建產(chǎn)品,添加智慧路燈產(chǎn)品,如圖4所示,按照要求填寫產(chǎn)品類型。
圖4 創(chuàng)建產(chǎn)品
點(diǎn)擊進(jìn)入創(chuàng)建的產(chǎn)品,點(diǎn)擊添加服務(wù),服務(wù)ID填入智慧路燈,如圖5所示。
圖5 添加服務(wù)
選擇智慧路燈服務(wù),點(diǎn)擊添加屬性,添加亮度屬性,如圖6所示。
圖6 添加屬性
3、注冊(cè)設(shè)備
創(chuàng)建產(chǎn)品成功后,側(cè)邊欄選擇設(shè)備,點(diǎn)擊右上角注冊(cè)設(shè)備,按照要求填寫設(shè)備信息,保存密匙信息,如圖7所示。
圖7 注冊(cè)設(shè)備
設(shè)備創(chuàng)建成功后,點(diǎn)擊進(jìn)入設(shè)備詳情頁面,可以查看設(shè)備詳細(xì)詳細(xì),保存設(shè)備ID信息,如圖8所示。
圖8 設(shè)備詳情
-
OpenHarmony
+關(guān)注
關(guān)注
25文章
3660瀏覽量
16156
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論