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

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

实验框图

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

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


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


创建RTT工程

本实验我们需要用到RT-Thread的BH1750软件包、OneNet软件包及at_device软件包等。这些软件包的使用已经在前两篇笔记中有写到:

「RT-Thread笔记」BH1750软件包的使用

「RT-Thread」OneNet软件包的使用

本次实验也只是把它们融合在一起来使用。

1、添加相关软件包、配置:

添加完之后的RT-Thread Settings文件如:

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

添加软件包及软件包的一些详细配置可查阅上两篇笔记。这里也大概提一下要点:

(1)设置WiFi信息:

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

(2)设置OneNET信息

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

(3)配置I2C对接BH1750

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

这里我用的是RT-Thread Studio V1.1.0,这里的I2C的范例配置有点问题,其它版本的RT-Thread Studio应该可以按范例配置那么配,如果按范例配置编译不通过的话可以按照I2C2那样配置。


2、应用代码

(1)测试函数

/* 公众号:嵌入式大杂烩*/
/* onenet测试函数 */
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命令响应回调函数

/* 公众号:嵌入式大杂烩 */
/*  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
", 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
");
    }
    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
");
    }
    else
    {
        rt_kprintf("ledcmd ERROR!
");
    }
​
    /* 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
");
        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
", 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
");
        }
        else
        {
            rt_pin_write(SC1_LED_PIN, SC1_LED_OFF);
            led_status = SC1_LED_OFF;
            rt_kprintf("led_status = OFF
");
        }
​
        /* 上传光照数据至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应用来管理:

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

onenet构建web应用的方式与之前我们分享的基于LiteOS的智慧农业案例实验分享中华为云构建web应用的方式类似,都是通过拖控件的方式。我们创建好的应用如下:

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


实验结果

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

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

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

以上就是本次的分享。如果文章有帮助,转发分享、在看,也是我们继续更新的动力。

展开阅读全文

页面更新:2024-03-11

标签:华为   智慧   案例   阈值   软件包   云端   初始化   范例   路灯   传感器   嵌入式   函数   命令   状态   上传   数据   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top