当前位置:首页 > 嵌入式 > 嵌入式大杂烩
[导读]点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记! 进入文章正题之前先说一个事:昨天分享的那本Linux书籍是去嵌入式Linux公众号回复呀,不是在本公众号回复哈。 前言 之前分享了基于LiteOS的智慧农业案例实验分享《基于LiteOS的智慧农

点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记!

进入文章正题之前先说一个事:昨天分享的那本Linux书籍是去嵌入式Linux公众号回复呀,不是在本公众号回复哈。

前言

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

实验框图


实验说明:设备终端不断采集光强数据并上传至云端进行监控,同时也会把当前LED(路灯)的状态上传。LED的状态会根据光照值进行打开、关闭。

比如当光照值低于(夜晚)我们设置的光照阈值时就会打开LED,当光照高于(白天)光照阈值时就会熄灭LED灯。除此之外,云端可以远程控制LED的亮灭,达到一个远程控制的作用。

创建RTT工程

  • 硬件:小熊派开发板。
  • 软件:基于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应用的方式类似,都是通过拖控件的方式。我们创建好的应用如下:

实验结果

因为Onenet数据最快是3秒刷新一次,所以存在一点延迟。

源码下载

本实验的RT-Thread Studio工程将上传至本公众号粉丝qq群,如有兴趣,可自行获取。qq群号: 696658660 同时,本篇笔记将会同步至我的个人博客: www.lizhengnian.cn ,欢迎来访。 据说现在微信公号文章推送规则有点变化,如果觉得本公众号文章有用,不妨星标置顶本公众号。

猜你喜欢

基于GUILite的简易万年历

十年经验工程师为何被裁?

ARM编译器那些事

串口打印知多少?

嵌入式百宝箱:第2期

最后

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

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


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

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭