NUC980 开发板 DIY 项目大挑战
边缘计算网关
作者:BabyKing
基于新唐的NuMaker-IIoT-NUC980开发板,开发的边缘计算网关。网关通过引出的引脚与温度、湿度、光照传感器模组连接,使用RTT提供的软件包驱动传感器模组。使用RTT提供的软件包连接阿里云物联网平台,通过阿里云物联网平台下发边缘计算的规则。边缘网关按照规则对传感器模组进行周期性得采集与上报。传感器数据可通过阿里云物联网平台进行查看。边缘计算规则支持配置每个传感器的采集周期、支持定时上报数据与变化上报数据模式。
在文章的最后放了源码与演示视频。
第一步
先按照NuMaker-IIoT-NUC980上手指南跑通系统。我用的源码版本是v4.0.5,因为尝试过v4.1.0,第一次编译没通过(可能有的地方没配置好),用v4.0.5的一次性编译通过。
第二步
安装ENV工具环境,参考Env 用户手册。
第三步
在上一步跑通的代码的基础上增加ali-iotkit、dht11、bh1750软件包。
menuconfig配置:
① 选上sensor drivers选项,因为我们用到的传感器数据采集依赖于RTT的SENSOR组件。
② 选上dht11与bh1750。
③ 选上ali-iotkit,注意ali-iotkit里边的选项不要选Sample,否则编译会出错,后续我们会参考Sample自己添加文件。
④ 保存,退出menuconfig。
⑤ 更新软件包。
pkgs --update
⑥ 生成keil工程
scons --target=mdk5
第四步
① 修改dht11代码,以适配我们的板子与传感器。参考源码放在文章的最后。
文件:dht11_sample.c。修改数据引脚,这里我们用PB1。
/* 获取板子PB1的引脚号 */
#define DHT11_DATA_PIN NU_GET_PININDEX(NU_PB, 1)
将实例代码中的线程创建与线程入口函数删掉,读取传感器数据的实现我们自己写。
② 修改bh1750代码,以适配我们的板子与传感器。参考源码放在文章的最后。
文件:sensor_rohm_bh1750.c。将I2C设备改为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);
return 0;
}
INIT_COMPONENT_EXPORT(bh1750_port);
文件:bh1750.c,bh1750_set_measure_mode的最后一个参数改为200,太小的话会采集失败。
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;
}
第五步
硬件连接,按照下图将传感器用杜邦线连接至板子上。
第六步
在阿里云物联网平台创建产品与设备,参考公共实例快速入门 (aliyun.com)。
我在创建了一个名为“边缘网关”的产品,基于产品添加了一个名为“gateway1”的设备,在产品上添加了三个属性:
第七步
增加edge.c文件,主要功能是连接阿里云物联网平台、解析云端下发的边缘计算规则并存储、采集数据并上报至阿里云物联网平台。将以下参数替换为我们在阿里云物联网平台增加的产品与设备的真实参数。参考源码放在文章的最后。
#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"
第八步
① 编译工程,将固件下载至板子上运行。
② 在阿里云物联网平台通过/ProductKey/DeviceName/user/get主题下发边缘计算规则,网关就可以按照规则周期性采集数据与上报数据了。其中“ProductKey”与“DeviceName”要替换为阿里云提供的真实的参数。
边缘计算规则
{
"sensors":[
{
"name":"temperature", //传感器名称
"collect_cycle":1, //采集周期,秒
"up_type":1, //1:定时上报,2:变化上报
"up_cycle":5 //上报周期,秒,up_type为1时有效
}
]
}
本项目中用的规则为:
{
"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
}
]
}
心得体会
rtt为我们提供了丰富的设备驱动、组件、软件包,使用rtt进行工程的创建、项目的开发是比较快速方便的,但同时有很多组件或者软件包还不是特别的完善,例如本项目中用到的dht11与bh1750软件包,则需要修改其中的一些关键参数(如bh1750_set_measure_mode中的时间参数)才能正常采集数据。再如rt_sprintf不能格式化输出%lld的long long型数据。相信通过我们共同的努力,rtt会变得越来越强大,越来越好用。
源码地址:https://gitee.com/mojie_baby/rt-thread-nk-980iot-v4.0.5.git
视频地址:https://b23.tv/gZ5CdYb
|