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