前言
本文由OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)開源開發者成長計劃活動的參與者李建濤提供,詳細闡述了由搭載OpenHarmony系統的拓維Niobe開發套件開發而來的智能陽臺項目的全過程,包括項目流程、硬件準備、軟件分析,以及問題分析等,能夠為開發者后續開發類似項目時提供一些參考。
一、項目設計與分析
1.1 項目描述 基于OpenHarmony的智能陽臺具體功能如下:
1. 能夠實時監測室外環境是否下雨;
2. 能夠對接華為IoT物聯網平臺,從平臺上接入設備實時查看到當前狀態(窗戶開關情況、室外是否下雨);
3. 當傳感器采集到的數據超過預先設定的閾值時,本地啟動關窗馬達,并上報關窗信息;
4. 本設備能夠成功搭載OpenHarmony開發板的環境監測設備,并實現環境監測功能。
1.2 系統架構圖
基于OpenHarmony的智能陽臺系統架構圖如下:
根據系統架構圖,可以看出基于OpenHarmony的智能陽臺主要是由三部分組成:
1. 數據采集:由雨滴傳感器采集室外的環境情況;
2. 信號傳送:開發板接收到傳感器的數據進行判斷,并且發送判斷后的信號給電機驅動模塊;開發板通過MQTT協議將數據上傳到華為云平臺;華為云平臺也可以通過下發命令給開發板并將該命令的信號發送給電機驅動模塊;
3. 執行部件:電機控制模塊根據單片機的信號控制電機執行相應的動作(開窗或關窗的動作)。
1.3 系統流程圖
基于OpenHarmony的智能陽臺系統流程圖如下:
1.4 系統原理圖
基于OpenHarmony的智能陽臺系統原理圖如下:
二、硬件準備
2.1 基于OpenHarmony的智能陽臺硬件準備情況如下: (1)預裝windows系統的PC機
(2)拓維信息Niobe Wifi IoT開發板套件
(3)雨滴傳感器模塊一套
(4)電機及驅動電機模塊一套(步進電機、直流電機、舵機等都可以)
(5)USB Type-C線(用于連接Windows工作臺與Niobe Wifi IoT 開發板)
2.2 硬件一:OpenHarmony開發板
拓維Niobe開發板是一塊專門基于OpenHarmony 3.0 LTS版本設計的開發板,板載高度集成了2.4GHz WLAN SoC芯片Hi3861V100。
Hi3861V100 WiFi基帶支持正交頻分復用(OFDM)技術,并向下兼容直接序列擴頻(DSSS)和補碼鍵控(CCK)技術,支持IEEE 802.11 b/g/n協議的各種數據速率。
Hi3861V100芯片集成高性能32bit微處理器、硬件安全引擎以及豐富的外設接口,外設接口包括SPI、UART、I2C、PWM、GPIO和多路ADC。
Hi3861V100芯片適應于智能家電等物聯網智能終端領域。
拓維信息-OpenHarmony開發板(Talkweb Niobe)的相關資料可以在拓維信息的Gitee倉庫中查看。
2.3 硬件二:雨滴傳感器模塊
本項目選用雨滴傳感器,目的是監測天氣狀況并轉成AO電壓輸出。
(1)材質:雨滴傳感器采用FR-04雙面材料,并用鍍鎳處理表面,具有抗氧化,導電性等性能。
(2)輸出形式:模擬量AO電壓輸出。
(3)AO模擬輸出,連接單片機的AD口檢測滴在上面的雨量大小(雨量越大輸出電壓越小)。
2.4 硬件三:電機模塊
2.4.1 本項目選用直流電機目的是模擬窗戶開關的情景(可根據自己的需要選擇步進電機或者舵機也是可以的)。
電機正轉一定角度表示開窗,反轉一定角度表示關窗。
注:直流電機的工作電壓為5V左右。
2.4.2 本項目選用了直流電機,故要另外選用L298N直流電機驅動模塊,目的是驅動直流電機的運作。
(1)本模塊使用L298N作為主驅動芯片,具有驅動能力強,發熱量低,抗干擾能力強的特點。
(2)L298N直流電機驅動模塊,支持雙軸控制,其電路原理就是兩個H橋電路。
(3)該模塊可以直接驅動兩路3-30V直流電機,并提供5V輸出接口,可以方便地控制直流電機速度和方向
(4)該模塊和控制端口的接口:控制直流電機時IN1、IN2和ENA為一組,IN1和IN2是邏輯信號,控制電機的正反轉;OUT1和OUT2它們控制電機A,接在A+和A-。
三、軟件分析
3.1 開發環境的搭建 萬事開頭難,要完成基于OpenHarmony智能陽臺的項目開發,首先第一件事就是開發環境的搭建。搭建好開發環境是學習OpenHarmony開發板以及后續項目開發的基礎,其中包括安裝虛擬機,配置Docker編譯環境,下載開發板源碼等步驟,每一步都非常重要,且需要確保零錯誤。對于一個有經驗的開發者來說,從開發環境的搭建到編譯成功可能會花一兩天時間,而對于像我這樣剛接觸OpenHarmony開發板的小白來說花費的時間會更多,且非常困難。
對此我經過幾天的查閱資料和觀看一些導師的課程,一步一步地進行開發環境的搭建以及燒錄過程。對此也編寫了一篇《基于OpenHarmony開發板的環境搭建及燒錄過程(拓維Niobe開發板)》的文章,具體文章已發布于Gitee上。
鏈接如下
https://gitee.com/lijiantao201906100052/OpenHarmony/blob/master/README.md
3.2 關鍵代碼分析
本項目的代碼可以在Gitee倉庫里下載https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/team_x/smart_balcony
代碼目錄如下:
3.2.1 電機配置部分
電機配置分為電機的初始化和設置電機的開關狀態兩個部分,相應代碼位置都在motor.c文件里。
(1)電機的初始化
使用開發板上的GPIO7、GPIO8管腳控制電機正反轉,使用PWM輸出電壓控制電機轉動速度。
代碼如下:
GPIO7和GPIO8的配置一樣。但GPIO7使用PWM0,而GPIO8使用PWM1。
IoTGpioInit(IoT_GPIO_IO_GPIO_7);//GPIO初始化IoTIoSetFunc(IoT_GPIO_IO_GPIO_7,IoT_IO_FUNC_GPIO_7_PWM0_OUT);//GPIO使能IoTGpioSetDir(IoT_GPIO_IO_GPIO_7, IoT_GPIO_DIR_OUT);//設置GPIO方向---IoT_GPIO_DIR_OUT---輸出IoTGpioSetOutputVal(IoT_GPIO_IO_GPIO_7, IoT_GPIO_VALUE0);//設置GPIO輸出電平---低電平IoTPwmInit(IoT_PWM_PORT_PWM0);//初始化PWM設備
(2)設置電機的開關狀態
啟動PWM信號輸出:使用PWM給定輸出頻率和相應的占空比指定給端口。
代碼如下:
開窗情景為:MotorStatusSet(ON); 電機正轉。
關窗情景為:MotorStatusSet(OFF); 電機反轉。
void MotorStatusSet(Motor_Status_ENUM status){ if (status == ON)//正轉 { IoTPwmStart(IoT_PWM_PORT_PWM1, 30, 15000); usleep(400000); IoTPwmStop(IoT_PWM_PORT_PWM1); } if (status == OFF)//反轉 { IoTPwmStart(IoT_PWM_PORT_PWM0, 30, 15000); usleep(400000); IoTPwmStop(IoT_PWM_PORT_PWM0); }}
3.2.2 雨滴傳感器配置部分
雨滴傳感器配置分為雨滴傳感器的初始化和使用ADC采集雨滴傳感器數據兩個部分,雨滴傳感器的初始化代碼位置在motor.c文件里,使用ADC采集雨滴傳感器數據代碼位置在balcony.c文件里。
(1)雨滴傳感器初始化
使用開發板上的GPIO4管腳控制雨滴傳感器(有雨輸出低電平,雨量越大電壓越低)
代碼如下:
IoTGpioInit(IoT_GPIO_IO_GPIO_4);//GPIO初始化IoTIoSetFunc(IoT_GPIO_IO_GPIO_4,IoT_IO_FUNC_GPIO_4_GPIO);//GPIO使能IoTGpioSetDir(IoT_GPIO_IO_GPIO_4,IoT_GPIO_DIR_IN);//設置GPIO方向---IoT_GPIO_DIR_IN---輸入
(2)使用ADC采集雨滴傳感器數據
代碼如下:
//GPIO4的ADC轉換通道號為ADC1ret = IoTAdcRead(IoT_ADC_CHANNEL_1,&val,IoT_ADC_EQU_MODEL_8, IoT_ADC_CUR_BAIS_DEFAULT, 256);//將電壓數值轉化為百位數,以便數據分析與觀察val = IoTAdcConvertToVoltage(val);val = 3.4 - val;voltage=(float)((float)val)/3.5*100;
3.2.3 連接華為IoT平臺部分
連接華為IoT平臺后,設備端可向華為IoT平臺上傳設備狀態、數據等信息。同時華為IoT平臺也可以下發命令給設備端,設備端收到命令后進行響應。
我們把設備端與華為IoT平臺連接分為獲取華為IoT平臺IP地址、華為IoT平臺的搭建、編寫上傳數據相關代碼以及編寫下發命令相關代碼四個部分。
(1)獲取華為IoT平臺IP地址
設備端與云端通訊采用的相關協議為MQTT協議。
首先在華為IoT平臺選擇MQTT協議的接入地址,并復制接入地址在PC終端上ping一下該接入地址。得到一個地址為121.36.42.100的IP地址,該地址為華為IoT平臺的IP地址。
在oc_mqtt.h文件里我們可以查看到相應代碼配置。
(2)華為IoT平臺的搭建
華為IoT平臺的搭建首先創建產品并且注冊對應的設備,華為IoT平臺就會分配給設備一個設備ID,設備端可通過設備ID和相應的密鑰來確保安全可信地連接到華為IoT平臺。
注冊對應的設備步驟如下:
① 所有設備 --> 注冊設備
② 選擇所屬產品、填寫標識符和設備名稱,分配設備ID平臺會自動分配可以不用修改
③ 點擊確認后會有兩條設備信息,一條為設備ID另外一條為設備密鑰,點擊保存并關閉會提示你下載一個txt文件,txt文件里面就包含這兩條信息。
④ 進去設備對接信息網站填寫設備ID、設備密鑰:https://IoT-tool.obs-website.cn-north-4.myhuaweicloud.com/
生成相應信息:ClientID、Username、Password。(每設備生成的信息都是不一樣的)
代碼如下:
在balcony.c文件里可以查看到以下配置:
注冊設備后,我們可以在華為IoT平臺產品中的模型定義里創建一個產品,并添加服務、屬性、命令等內容。
服務信息:(服務ID、服務類型)
屬性信息:(屬性名稱、數據類型)
命令信息:(命令名稱、參數名稱、數據類型、長度、枚舉)
注:代碼中的服務ID、屬性名稱、命令名稱等與華為IoT平臺一一對應。
引用開源代碼oc_mqtt.c和oc_mqtt_profile_package.c函數編寫代碼。
Wi-Fi連接配置:引用開源代碼wifi_connect.c函數編寫代碼,連接Wi-Fi需要用到本地的Wi-Fi賬號密碼,在balcony.c文件里修改Wi-Fi信息。
(3)上傳數據的配置
代碼如下:
static void deal_report_msg(report_t *report){//定義Service級別數據,該處對應云平臺配置的Balcony服務下的數據oc_mqtt_profile_service_t service;//定義屬性級別數據,該處對應云平臺配置的屬性voltage信息oc_mqtt_profile_kv_t voltage;//定義屬性級別數據,該處對應云平臺配置的屬性Window_flag信息oc_mqtt_profile_kv_t Window_flag;//定義屬性級別數據,該處對應云平臺配置的屬性Rain_flag信息oc_mqtt_profile_kv_t Rain_flag;//定義屬性級別數據,該處對應云平臺配置的屬性motor信息oc_mqtt_profile_kv_t motor; service.event_time = NULL;//對應云平臺配置的服務ID service.service_id = "Balcony";//在Balcony服務下添加屬性信息service.service_property = &voltage;//該產品上報數據中僅存在Balcony一種服務,所以next指針為空service.nxt = NULL; //對應云平臺配置的屬性名稱voltage.key = "voltage";//voltage的取值由設備實際狀態voltage決定voltage.value = &report->voltage;//對應云平臺配置的數據類型voltage.type = EN_OC_MQTT_PROFILE_VALUE_FLOAT;//繼續添加Balcony服務下的另一屬性voltage.nxt = &Window_flag; Window_flag.key = "Window_flag";Window_flag.value = g_app_cb.Window_flag ? "ON" : "OFF";Window_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING;Window_flag.nxt = &Rain_flag; Rain_flag.key = "Rain_flag";Rain_flag.value = g_app_cb.Rain_flag ? "ON" : "OFF";Rain_flag.type = EN_OC_MQTT_PROFILE_VALUE_STRING;Rain_flag.nxt = &motor; motor.key = "Motor_Status";//Motor_Status的ON,OFF取值由設備實際motor.value = g_app_cb.motor ? "ON" : "OFF";motor.type = EN_OC_MQTT_PROFILE_VALUE_STRING;//Balcony服務下沒有其它屬性了,next置為null。motor.nxt = NULL; //打包數據oc_mqtt_profile_propertyreport(USERNAME, &service);return;}
(4)下發命令控制電機的配置
代碼如下:
if(0==strcmp(cJSON_GetStringValue(obj_cmdname), "Balcony_Control_Motor")){ obj_para = cJSON_GetObjectItem(obj_paras, "Motor"); if (NULL == obj_para) { goto EXIT_OBJPARA; } //操作電動馬達 if (0 == strcmp(cJSON_GetStringValue(obj_para), "ON")) { g_app_cb.motor = 1; MotorStatusSet(ON);//開窗 g_app_cb.Window_flag = 1; Window_flag = 1; } else { g_app_cb.motor = 0; MotorStatusSet(OFF);//關窗 g_app_cb.Window_flag = 0; Window_flag = 0; }}
四、問題總結及解決過程
4.1 問題一:硬件連接 在硬件連接的過程,電機驅動模塊的GND沒有和開發板的GND相連,導致電機不轉,輸出端電壓為0V。
查閱了資料發現L298N供電的12V如果是用另外電源供電的話,那么需要將單片機的GND和驅動模塊的GND連接起來,這樣單片機上過來的邏輯信號才有個參考點,板載12V穩壓芯片的輸入引腳和電機供電驅動接線端子導通的。
4.2 問題二:燒錄問題
在燒錄的時候,如果外接的傳感器(雨滴傳感器)的VCC接口接在開發板的5V上可能會導致燒錄的時候復位不成功。
所以我們在燒錄的時候需要將傳感器接在開發板的5V及GND先斷開,等待燒錄成功后就可連接起來。
4.3 問題三:連接華為云IoT平臺
在連接華為IoT平臺的過程中,我們需要注意的問題是代碼中的服務ID、屬性名稱、命令名稱等信息與華為IoT平臺一一對應,否則會導致數據上傳不成功或者命令下發不成功。
五、項目作品演示
1. 能在華為IoT平臺上下發命令控制電機的轉動。 2. 可在雨滴傳感器上滴上水珠,達到預定的閾值時,電機轉動模擬關窗。
3. 能夠在華為IoT平臺上查看相關傳感器測得的數值以及窗戶(是否開窗)、環境(是否下雨)狀態的情況。
Wi-Fi連接成功串口顯示:
華為IoT平臺在線調試--可看到數據接收和命令發送的情況:
華為IoT平臺查看到最新的上報數據:
以下分別對四個情景進行分析與說明:
情景一:無雨天氣并且使用華為IoT平臺下發命令開窗
當華為IoT平臺下發命令Balcony_Control_Motor --> ON。窗戶馬達則會轉動,將窗戶打開并且將數據信息上傳回華為IoT平臺。
華為IoT平臺數據信息同步更新:
硬件圖如下:
情景二:無雨天氣并且使用華為IoT平臺下發命令關窗
當華為IoT平臺下發命令Balcony_Control_Motor --> OFF。窗戶馬達則會轉動將窗戶關閉并且將數據信息上傳回華為IoT平臺。
華為IoT平臺數據信息同步更新:
硬件圖如下:
情景三:窗戶開著,檢測到下雨天氣,則會關窗并且上報數據
當窗戶開著的情況,天氣從晴朗天氣變成下雨天氣,當雨滴檢測板檢測到雨滴,并且超過設定的閾值的時候,窗戶馬達將轉動將窗戶關閉并且將數據信息上傳回華為IoT平臺。
華為IoT平臺數據信息同步更新:
硬件圖如下:
情景四:下完雨后,雨滴檢測板沒有雨滴
當天氣從下雨天氣變成晴朗天氣,雨滴檢測板沒有檢測到雨滴(此處為了方便實驗,使用了紙巾擦除雨滴檢測板上的水),并且將數據信息上傳回華為IoT平臺。
華為IoT平臺數據信息同步更新:
硬件圖如下:
六、心得體會
參加本次OpenHarmony開源開發者成長計劃活動,讓我收獲良多,不僅了解到OpenHarmony的生態系統,也在開發項目的過程中深入接觸到OpenHarmony的開發板。在開發項目的過程中曾經出現大大小小的問題,例如環境搭建、硬件連接、WiFi連接配網和連接華為云平臺等,但有問題并不可怕,只要下定決心去解決就總會找到相應的方法。
我在這個實踐過程中積累了不少經驗,這讓我對OpenHarmony開發產生了更濃厚的興趣,讓我更想往下不斷學習,學習一些更有深度和更有趣的OpenHarmony知識。
-
傳感器
+關注
關注
2548文章
50664瀏覽量
751939 -
物聯網
+關注
關注
2903文章
44262瀏覽量
371213 -
開發板
+關注
關注
25文章
4943瀏覽量
97188 -
OpenHarmony
+關注
關注
25文章
3658瀏覽量
16144 -
NiobeU4
+關注
關注
3文章
31瀏覽量
500
原文標題:成長計劃校園極客秀|基于OpenHarmony的智能陽臺
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論