热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【实践】基于RTThread的智慧路灯案例实验分享

之前分享了基于LiteOS的智慧农业案例实验分享基于LiteOS的智慧农业案例实验分享,阅读量挺不错,看样子大家都挺喜欢这种实验。那咱们就再来一个类似的实验:基于RT-Thread

之前分享了基于LiteOS的智慧农业案例实验分享基于LiteOS的智慧农业案例实验分享,阅读量挺不错,看样子大家都挺喜欢这种实验。那咱们就再来一个类似的实验:基于RT-Thread的智慧路灯案例实验。


实验框图

技术图片

技术图片

实验说明:设备终端不断采集光强数据并上传至云端进行监控,同时也会把当前LED(路灯)的状态上传。LED的状态会根据光照值进行打开、关闭。比如当光照值低于(夜晚)我们设置的光照阈值时就会打开LED,当光照高于(白天)光照阈值时就会熄灭LED灯。除此之外,云端可以远程控制LED的亮灭,达到一个远程控制的作用。


创建RTT工程



  • 硬件:小熊派开发板。

  • 软件:STM32+RT-Thread。

  • 开发工具: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应用的方式类似,都是通过拖控件的方式。我们创建好的应用如下:

技术图片


实验结果

技术图片
技术图片
技术图片



若觉得文章不错,转发分享、在看,也是我们继续更新的动力。

在公众号内回复更多资源,可免费获取嵌入式资料。期待你的关注~

加ZhengN为好友,回暗号【嵌入式大杂烩】,进微信群

技术图片

【实践】基于RT-Thread的智慧路灯案例实验分享



推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • Windows 系统下 MySQL 8.0.11 的安装与配置
    本文详细介绍了在 Windows 操作系统中安装和配置 MySQL 8.0.11 的步骤,包括环境准备、安装过程以及后续配置,帮助用户顺利完成数据库的部署。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
author-avatar
enjoy楠神
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有