項(xiàng)目描述
基于NUVOTON的NK-980IOT開發(fā)板,開發(fā)的邊緣計(jì)算網(wǎng)關(guān)。網(wǎng)關(guān)通過(guò)引出的引腳與溫度、濕度、光照傳感器模組連接,使用RTT提供的軟件包驅(qū)動(dòng)傳感器模組。使用RTT提供的軟件包連接阿里云物聯(lián)網(wǎng)平臺(tái),通過(guò)阿里云物聯(lián)網(wǎng)平臺(tái)下發(fā)邊緣計(jì)算的規(guī)則。邊緣網(wǎng)關(guān)按照規(guī)則對(duì)傳感器模組進(jìn)行周期性得采集與上報(bào)。傳感器數(shù)據(jù)可通過(guò)阿里云物聯(lián)網(wǎng)平臺(tái)進(jìn)行查看。邊緣計(jì)算規(guī)則支持配置每個(gè)傳感器的采集周期、支持定時(shí)上報(bào)數(shù)據(jù)與變化上報(bào)數(shù)據(jù)模式。
DIY過(guò)程
第一步:
先按照NK-980IOT 上手指南跑通系統(tǒng)。我用的源碼版本是v4.0.5,因?yàn)閲L試過(guò)v4.1.0,第一次編譯沒(méi)通過(guò)(可能有的地方?jīng)]配置好),用v4.0.5的一次性編譯通過(guò)。
第二步:
安裝ENV工具環(huán)境,參考Env 用戶手冊(cè)。
第三步:
在上一步跑通的代碼的基礎(chǔ)上增加ali-iotkit、dht11、bh1750軟件包。
menuconfig配置:
① 選上sensor drivers選項(xiàng),因?yàn)槲覀冇玫降膫鞲衅鲾?shù)據(jù)采集依賴于RTT的SENSOR組件。
② 選上dht11與bh1750。
③ 選上ali-iotkit,注意ali-iotkit里邊的選項(xiàng)不要選Sample,否則編譯會(huì)出錯(cuò),后續(xù)我們會(huì)參考Sample自己添加文件。
④ 保存,退出menuconfig。
⑤ 更新軟件包。
pkgs --update
⑥ 生成keil工程
scons --target=mdk5
第四步:
① 修改dht11代碼,以適配我們的板子與傳感器。參考源碼放在文章的最后。
文件:dht11_sample.c。修改數(shù)據(jù)引腳,這里我們用PB1。
/* 獲取板子PB1的引腳號(hào) */
#define DHT11_DATA_PIN NU_GET_PININDEX(NU_PB,1)
將實(shí)例代碼中的線程創(chuàng)建與線程入口函數(shù)刪掉,讀取傳感器數(shù)據(jù)的實(shí)現(xiàn)我們自己寫。
② 修改bh1750代碼,以適配我們的板子與傳感器。參考源碼放在文章的最后。
文件:sensor_rohm_bh1750.c。將I2C設(shè)備改為i2c2,我們用板子上的i2c2連接傳感器。
int bh1750_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.dev_name ="i2c2";
cfg.intf.user_data =(void*)BH1750_ADDR;
cfg.irq_pin.pin = RT_PIN_NONE;
rt_hw_bh1750_init("bh1750",&cfg);
return0;
}
INIT_COMPONENT_EXPORT(bh1750_port);
文件:bh1750.c,bh1750_set_measure_mode的最后一個(gè)參數(shù)改為200,太小的話會(huì)采集失敗。
?
float bh1750_read_light(bh1750_device_t hdev)
{
rt_uint8_t temp[2];
float current_light =0;
RT_ASSERT(hdev);
bh1750_set_measure_mode(hdev, BH1750_CON_H_RES_MODE,200);
bh1750_read_regs(hdev->bus,2, temp);
current_light =((float)((temp[0]<<8)+ temp[1])/1.2);
return current_light;
}
第五步:
硬件連接,按照下圖將傳感器用杜邦線連接至板子上。
第六步:
在阿里云物聯(lián)網(wǎng)平臺(tái)創(chuàng)建產(chǎn)品與設(shè)備,參考公共實(shí)例快速入門 (aliyun.com)。 我在創(chuàng)建了一個(gè)名為“邊緣網(wǎng)關(guān)”的產(chǎn)品,基于產(chǎn)品添加了一個(gè)名為“gateway1”的設(shè)備,在產(chǎn)品上添加了三個(gè)屬性:
第七步:
增加edge.c文件,主要功能是連接阿里云物聯(lián)網(wǎng)平臺(tái)、解析云端下發(fā)的邊緣計(jì)算規(guī)則并存儲(chǔ)、采集數(shù)據(jù)并上報(bào)至阿里云物聯(lián)網(wǎng)平臺(tái)。將以下參數(shù)替換為我們?cè)诎⒗镌莆锫?lián)網(wǎng)平臺(tái)增加的產(chǎn)品與設(shè)備的真實(shí)參數(shù)。參考源碼放在文章的最后。
#define PKG_USING_ALI_IOTKIT_PRODUCT_KEY "a1LEPYmKptP"
#define PKG_USING_ALI_IOTKIT_PRODUCT_SECRET "XObSHBABkXzxmgYm"
#define PKG_USING_ALI_IOTKIT_DEVICE_NAME "gateway1"
#define PKG_USING_ALI_IOTKIT_DEVICE_SECRET "857b78c5a8fc79aa2703379ef9666eb2"
第八步:
① 編譯工程,將固件下載至板子上運(yùn)行。 ② 在阿里云物聯(lián)網(wǎng)平臺(tái)通過(guò)/ProductKey/DeviceName/user/get主題下發(fā)邊緣計(jì)算規(guī)則,網(wǎng)關(guān)就可以按照規(guī)則周期性采集數(shù)據(jù)與上報(bào)數(shù)據(jù)了。 其中“ProductKey”與“DeviceName”要替換為阿里云提供的真實(shí)的參數(shù)。
邊緣計(jì)算規(guī)則
?
{
"sensors":[
{
"name":"temperature",//傳感器名稱
"collect_cycle":1,//采集周期,秒
"up_type":1,//1:定時(shí)上報(bào),2:變化上報(bào)
"up_cycle":5//上報(bào)周期,秒,up_type為1時(shí)有效
}
]
}
本項(xiàng)目中用的規(guī)則為:
?
{
"sensors":[
{
"name":"temperature",
"collect_cycle":5,
"up_type":1,
"up_cycle":30
},
{
"name":"Humidity",
"collect_cycle":5,
"up_type":1,
"up_cycle":30
},
{
"name":"LightLux",
"collect_cycle":1,
"up_type":2
}
]
}
心得體會(huì)
rtt為我們提供了豐富的設(shè)備驅(qū)動(dòng)、組件、軟件包,使用rtt進(jìn)行工程的創(chuàng)建、項(xiàng)目的開發(fā)是比較快速方便的,但同時(shí)有很多組件或者軟件包還不是特別的完善,例如本項(xiàng)目中用到的dht11與bh1750軟件包,則需要修改其中的一些關(guān)鍵參數(shù)。
審核編輯:劉清
評(píng)論
查看更多