一、智慧路燈簡介
我們平時看到的傳統路燈基本是通過定時開啟、定時關閉來控制路燈亮滅,在夏天白晝時間長,路燈過早開啟,造成能源浪費;在冬天白晝時間短,往往經常是天已經黑了,路燈卻未開啟,給人們的出行帶來了諸多不便;也有的路燈通過專人手動開啟關閉,這種方式雖較定時方式靈活,但也存在需要人為操作的局限性。隨著社會的發展進步,智慧路燈應運而生,智慧路燈通過自身攜帶的光線傳感器,通過傳感器采集的的光線數據判斷天黑情況,可以根據預置的閾值來實現路燈開啟關閉;同時智慧路燈的光線數據也可以同步上傳云端,通過云端可以查詢到智慧路燈的光線數據、路燈開啟關閉狀態,同時也可以設置智慧路燈開啟關閉的閾值,實現云管理。
前面的文章介紹了基于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燈。模塊硬件電路簡單,這里就不對此進行多余的說明。
圖1智慧路燈模塊硬件電路圖
小凌派RK2206開發板與智慧路燈模塊均帶有防呆設計,能夠很容易區分安裝方向,直接將模塊插入到小凌派RK2206開發板的E53母座接口上即可,安裝如圖2所示.
圖2 硬件連接圖
一、軟件設計
1、主程序設計
小凌派RK2206開發板上電后,OpenHarmony系統開始運行,LiteOS系統初始化后,通過LOS_QueueCreate函數創建一個消息隊列,用于線程間傳遞信息;通過LOS_TaskCreate創建e53_isl_thread和iot_cloud_isl_thread兩個任務。其中,e53_isl_thread任務周期獲取智慧路燈模塊采集的信息;iot_cloud_isl_thread任務處理消息隊列里的信息,將智慧路燈模塊采集的信息上報華為云。
{ 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};
/*創建消息隊列*/ 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; }
/*創建智慧路燈信息獲取任務*/ 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; }
/*創建華為云IoT任務*/ 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、智慧路燈信息獲取任務程序設計
智慧路燈信息獲取任務,進入主程序先初始化智慧路燈模塊,程序進入主循環,2秒獲取一次光線傳感器BH1750的光線強度值,當光線強度值小于20時,打開LED路燈;當光線強度值大于等于20時,關閉LED路燈。同時,將獲取到的光線強度值寫入消息隊列中,等待華為云IoT處理。智慧路燈信息獲取任務使用的接口在基于OpenHarmony的智慧路燈實現文章中已經詳細說明,這里不再贅述。
{ float lum = 0; isl_msg_t *app_msg = NULL;
/*智慧路燈模塊初始化*/ e53_isl_init();
while (1){ /*獲取智慧路燈模塊數據*/ lum = e53_isl_read_data();
printf("luminance value is %.2f\n", lum);
/*光線強度值小于20,點亮LED燈;否則,熄滅LED燈*/ if (lum < 20) { isl_light_set_status(ON); } else { isl_light_set_status(OFF); }
/*光線強度值寫入消息隊列中*/ 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任務程序設計
華為云IoT任務主要處理消息隊列里的信息。任務啟動后,通過SetWifiModeOn連接WIFI;WIFI連接成功后,初始化MQTT協議棧,連接到華為云IoT服務器;成功連接華為云IoT服務器后,線程開始處理消息隊列里的消息。消息隊列里只有一種消息格式,智慧路燈信息獲取任務傳輸過來的智慧路燈模塊的數據,線程直接通過MQTT協議傳輸到華為云IoT平臺上,此時平臺上可以查看到最新上報的智慧路燈模塊的亮度數據。
{ isl_msg_t *app_msg = NULL; unsigned int addr; int ret;
/*WIFI連接網絡,通過網絡*/ 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){ /*從隊列中獲取數據*/ 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: /*將光線強度值上報到華為云平臺*/ isl_deal_report_msg(&app_msg->report); break; default: break; } free(app_msg); app_msg = NULL; } else { LOS_Msleep(100); } }}isl_deal_report_msg函數將光線強度值按照華為云平臺的數據結構填充,將光線強度值上報到華為云平臺。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;}
一、編譯測試
1、登錄華為云IoT平臺
設備連接華為云前,需要做一些準備工作,請在華為云平臺注冊個人用戶賬號,并且需要實名認證后才可以正常使用。如圖3所示,為華為云IotDM地址:https://www.huaweicloud.com/product/iotdm.html。
圖3 華為云IoT網址
2、創建產品
點擊立即使用,進入設備接入頁面,選擇側邊欄產品頁面,點擊右上角創建產品,添加智慧路燈產品,如圖4所示,按照要求填寫產品類型。
圖4 創建產品
點擊進入創建的產品,點擊添加服務,服務ID填入智慧路燈,如圖5所示。
圖5 添加服務
選擇智慧路燈服務,點擊添加屬性,添加亮度屬性,如圖6所示。
圖6 添加屬性
3、注冊設備
創建產品成功后,側邊欄選擇設備,點擊右上角注冊設備,按照要求填寫設備信息,保存密匙信息,如圖7所示。
圖7 注冊設備
設備創建成功后,點擊進入設備詳情頁面,可以查看設備詳細詳細,保存設備ID信息,如圖8所示。
圖8 設備詳情
在連接華為云前需要獲取CLIENT_ID、USERNAME、PASSWORD,訪問華為云iot工具https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/;填寫注冊設備時生成的設備ID和設備密鑰,生成連接信息(ClientId、Username、Password),如圖9所示。
圖9 生成賬號、密匙
對應修改代碼中對應的CLIENT_ID、USERNAME、PASSWORD。
#defineCLIENT_ID "61c69349078a93029b83ceff_E53_ISL_0_0_2021122504"
#define USERNAME "61c69349078a93029b83ceff_E53_ISL"
#define PASSWORD "82933df2133618cad436234d88fde06a196dd8ebc0d5c8cf2ee065968a469546"
4、測試結果
程序編譯燒寫到小凌派RK2206開發板后,按下開發板的RESET按鍵,通過串口軟件查看日志如下所示;通過遮擋智慧路燈模塊上的光線傳感器,從而來改變光線強度值,當光線強度值小于20時,LED燈打開;當光線強度值大于20時,LED燈關閉。
luminance value is 45.83light offluminance value is 4.17light on
同時,在華為云平臺上,可以看到設備上報上來的光線強度,如圖10所示。
圖10 華為云數據顯示
-
智慧路燈
+關注
關注
2文章
744瀏覽量
17058
發布評論請先 登錄
相關推薦
評論