热门标签 | 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的智慧路灯案例实验分享



推荐阅读
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 本文详细探讨了在Windows 98环境下安装Apache 1.3.9、JServ、GNUJSP 1.0、JDK 1.2.2及JSDK 2.0后遇到的中文显示问题,并提供了多种有效的解决方案。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 使用Python构建网页版图像编辑器
    本文详细介绍了一款基于Python开发的网页版图像编辑工具,具备多种图像处理功能,如黑白转换、铅笔素描效果等。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
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社区 版权所有