前言实验框图实验说明:设备终端不断采集光强数据并上传至云端进行监控,同时也会把当前LED(路灯)的状态上传。LED的状态会根据光照值进行打开、关闭。 比如当光照值低于(夜晚)我们设置的光照阈值时就会打开LED,当光照高于(白天)光照阈值时就会熄灭LED灯。除此之外,云端可以远程控制LED的亮灭,达到一个远程控制的作用。 创建RTT工程- 开发工具:RT-Thread Studio V1.1.0。
本实验我们需要用到RT-Thread的BH1750软件包、OneNet软件包及at_device软件包等。这些软件包的使用已经在前两篇笔记中有写到: 【RT-Thread笔记】BH1750软件包的使用
【RT-Thread笔记】OneNet软件包的使用
本次实验也只是把它们融合在一起来使用。 1、添加相关软件包、配置:添加完之后的RT-Thread Settings 文件如: 添加软件包及软件包的一些详细配置可查阅上两篇笔记。这里也大概提一下要点: (1)设置WiFi信息:(2)设置OneNET信息(3)配置I2C对接BH1750这里我用的是RT-Thread Studio V1.1.0 ,这里的I2C的范例配置有点问题,其它版本的RT-Thread Studio 应该可以按范例配置那么配,如果按范例配置编译不通过的话可以按照I2C2那样配置。 2、应用代码(1)测试函数左右滑动查看全部代码>>> int onenet_upload_example(void) { rt_thread_t tid;
/* onenet初始化 */ onenet_mqtt_init();
/* 绑定led命令响应回调函数 */ onenet_set_cmd_rsp_cb(onenet_ledcmd_rsp_cb);
/* 创建onenet数据上传任务 */ tid = rt_thread_create("onenet_upload", onenet_upload_entry, RT_NULL, 2048, 10, 5); if (tid) rt_thread_startup(tid);
return 0; } MSH_CMD_EXPORT(onenet_upload_example, send data to OneNET cloud cycle);
首先进行一个onenet初始化,这个初始化接口时onenet软件包提供的。 接着进行一个led命令响应回调函数的绑定,回调函数onenet_ledcmd_rsp_cb里进行的就是接收到onenet下发的led命令之后进行地一些操作。最后就是创建一个onenet数据上传的线程。 最后把这个函数以命令的形式导出,以便我们可以在命令行输入onenet_upload_example 命令进行测试。 (2)led命令响应回调函数左右滑动查看全部代码>>> static void onenet_ledcmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size) { char res_buf[20] = {0}; char recv_buf[5] = {0};
LOG_D("recv data is %.*s\n", recv_size, recv_data);
if (!strncmp((char*)recv_data, "ledon", 5)) { rt_pin_write(SC1_LED_PIN, SC1_LED_ON); rt_snprintf(res_buf, sizeof(res_buf), "led is on"); rt_kprintf("led is on\n"); } else if(!strcmp((char*)recv_data, "ledoff", 5)) { rt_pin_write(SC1_LED_PIN, SC1_LED_OFF); rt_snprintf(res_buf, sizeof(res_buf), "led is off"); rt_kprintf("led is off\n"); } else { rt_kprintf("ledcmd ERROR!\n"); }
/* user have to malloc memory for response data */ *resp_data = (uint8_t *) rt_malloc(strlen(res_buf));
strncpy((char *)*resp_data, res_buf, strlen(res_buf));
*resp_size = strlen(res_buf); }
我们收到onenet下发的命令之后,所需要做的操作放在这里面。比如当我们的设备接收到ledon 字符串时,打开led,并打印提示信息。最后再把led is on 信息应答给onenet。 (3)上传数据的任务左右滑动查看全部代码>>> /* 上传数据至onenet */ static void onenet_upload_entry(void *parameter) { rt_device_t dev = RT_NULL; struct rt_sensor_data data; rt_size_t res; char led_status = SC1_LED_OFF; char send_buf[32] = {0};
/* 设置高亮LED的引脚为输出模式 */ rt_pin_mode(SC1_LED_PIN, PIN_MODE_OUTPUT);
/* 查找bh1750传感器 */ dev = rt_device_find("li_bh1750"); if (dev == RT_NULL) { rt_kprintf("Can't find device:li_bh1750\n"); return; }
/* 以只读模式打开bh1750 */ if (rt_device_open(dev, RT_DEVICE_FLAG_RDONLY) != RT_EOK) { rt_kprintf("open device failed!"); return; }
while (1) { /* 从传感器读取一个数据 */ res = rt_device_read(dev, 0, &data, 1); if (1 != res) { rt_kprintf("read data failed!size is %d", res); } else { rt_kprintf("light:%4d.%d lux\n", data.data.light / 10, data.data.light % 10); rt_sprintf(send_buf,"%4d.%d", data.data.light / 10, data.data.light % 10); }
/* 高亮LED灯根据光照值自动打开、熄灭 */ if (data.data.light / 10 <= 40) { rt_pin_write(SC1_LED_PIN, SC1_LED_ON); led_status = SC1_LED_ON; rt_kprintf("led_status = ON\n"); } else { rt_pin_write(SC1_LED_PIN, SC1_LED_OFF); led_status = SC1_LED_OFF; rt_kprintf("led_status = OFF\n"); }
/* 上传光照数据至onenet */ if (onenet_mqtt_upload_string("light", (const char*)send_buf) < 0) { LOG_E("upload has an error, stop uploading"); break; }
/* 上传高亮led灯的状态至onenet */ if (onenet_mqtt_upload_string("led_status", (const char*)ledsta_str[led_status]) < 0) { LOG_E("upload has an error, stop uploading"); break; }
rt_thread_delay(rt_tick_from_millisecond(3 * 1000)); } rt_device_close(dev); }
这是我们的上传任务:读取BH1750传感器采集的光照值,通过onenet软件包给我们提供的onenet_mqtt_upload_string接口上传至onenet。 同时,led的状态根据光照值的结果自动打开/关闭,led的状态也是通过onenet_mqtt_upload_string接口传至onenet。 3、OneNET云端web应用(1)创建一个web应用为了能更好地、更直观的展示我们的数据,我们创建一个web应用来管理: onenet构建web应用的方式与之前我们分享的《基于LiteOS的智慧农业案例实验分享》中华为云构建web应用的方式类似,都是通过拖控件的方式。我们创建好的应用如下: 实验结果因为Onenet数据最快是3秒刷新一次,所以存在一点延迟。 源码下载本实验的RT-Thread Studio工程将上传至本公众号粉丝qq群,如有兴趣,可自行获取。qq群号:696658660。同时,本篇笔记将会同步至我的个人博客:www.lizhengnian.cn,欢迎来访。据说现在微信公号文章推送规则有点变化,如果觉得本公众号文章有用,不妨星标置顶本公众号。
|