0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTT RA2L1 MQTT网络温湿度采集

冬至子 来源:Lu_盼盼 作者:Lu_盼盼 2023-10-12 11:10 次阅读

1、添加uart0,波特率为默认的115200。串口回调函数为默认的user_uart_callbakc,TXD、RXD 为P101、P100,刚好适配PMOD2(J7),来接DA16200。

1.jpg

2、添加AT—client包

1.jpg

3、打开uart0:

1.jpg

4、编写DA16200.c的函数:

主要的思路是先初始化at_clinet客户端,根据da16200的mqtt命令初始化。如果注册成功,向服务器订阅与发布主题,详见代码:

/*

  • Copyright (c) 2006-2021, RT-Thread Development Team
  • SPDX-License-Identifier: Apache-2.0
  • Change Logs:
  • Date Author Notes
  • 2023-02-24 Administrator the first version
    /
    #include
    #include
    #include
    #include
    // #ifndef ULOG_USING_SYSLOG
    //#define LOG_TAG "AT_DA16200"
    //#define LOG_LVL LOG_LVL_DBG
    //#include
    //#else
    //#include
    //#endif /
    ULOG_USING_SYSLOG /
    /
    初始化 at_client /
    /
    设置当前 AT 客户端最大支持的一次接收数据的长度 */
    #define AT_CLIENT_RECV_BUFF_LEN 512
    #define AT_CLIENT_DEVICE_NAME "uart0"
    #define AT_WAITE_OK_MAXTIME 3000
    #define WIFI_SSID HUAWEI-H10R9U
    #define WIFI_PWD 18977381885@
    #define AT_ADDR_LEN 32
    static rt_err_t wifi_connect_state = -1;
    char ip[AT_ADDR_LEN] = {0};
    char gateway[AT_ADDR_LEN] = {0}, netmask[AT_ADDR_LEN] = {0};
    static void urc_conn_func(struct at_client *client ,const char data, rt_size_t size)
    {
    /
    WIFI 连 接 成 功 信 息 */
    rt_kprintf("AT Server device WIFI connect success!");
    wifi_connect_state = RT_EOK;
    }
    static void urc_recv_func(struct at_client *client ,const char data, rt_size_t size)
    {
    /
    接收到服务器发送数据 */
    char *ptr;
    char *p;
    rt_kprintf("AT Client receive AT Server data!");
    rt_kprintf("%s",data);
    ptr = strtok(data, ":");
    ptr = strtok(NULL, ",");
    while (ptr != NULL) {
    rt_kprintf("ptr=%sn", ptr);
    ptr = strtok(NULL, ",");
    }
    }
    int da16200_mqtt_pub(char *msg)
    {
    int result = RT_EOK;
    at_response_t resp = RT_NULL;
    if(wifi_connect_state != RT_EOK)
    {
    rt_kprintf("MQTT_client not ready!");
    return -1;
    }
    resp = at_create_resp(256, 0, rt_tick_from_millisecond(5000));
    if (resp == RT_NULL)
    {
    rt_kprintf("No memory for response structure!");
    return -2;
    }
    result = at_exec_cmd(resp, "AT+NWMQMSG='%s'",msg);
    if(resp < 0)
    {
    rt_kprintf("Pub msg ERRO! cord:%d", result);
    }
    at_delete_resp(resp);
    return result;
    }
    static void urc_func(struct at_client *client ,const char data, rt_size_t size)
    {
    /
    设备启动信息 /
    rt_kprintf("AT Server device startup!");
    rt_kprintf("%s",data);
    }
    static struct at_urc urc_table[] = {
    {"+NWMQCL:1", "rn", urc_conn_func},
    {"+NWMQMSG:", "rn", urc_recv_func},
    {"RDY", "rn", urc_func},
    };
    int at_client_port_init(void)
    {
    /
    添加多种 URC 数据至 URC 列表中,当接收到同时匹配 URC 前缀和后缀的数据,执行 URC 函数 /
    at_set_urc_table(urc_table, sizeof(urc_table) / sizeof(urc_table[0]));
    return RT_EOK;
    }
    int at_client_16200_mqtt_init(void)
    {
    int result = RT_EOK;
    at_response_t resp = RT_NULL;
    /
    创建响应结构体,设置最大支持响应数据长度为 256 字节
    (最大响应长度用户根据实际需求自定义),响应数据行数无限制,超时时间为 5 秒 /
    resp = at_create_resp(256, 0, rt_tick_from_millisecond(5000));
    if (resp == RT_NULL)
    {
    rt_kprintf("No memory for response structure!");
    return -2;
    }
    result = at_client_init(AT_CLIENT_DEVICE_NAME, AT_CLIENT_RECV_BUFF_LEN);
    if(result != RT_EOK)
    {
    rt_kprintf("at_clinet init erro %d",result);
    return result;
    }
    /
    等待AT OK /
    result = at_client_wait_connect(AT_WAITE_OK_MAXTIME);
    if(result != RT_EOK)
    {
    rt_kprintf("client to da16200 at timeout %d",result);
    return result;
    }
    /
    设置回显 /
    if(at_exec_cmd(resp, "ATE") != RT_EOK)
    {
    rt_kprintf("AT client send ATE failed,response error!");
    return -RT_ERROR;
    }
    /
    解释返回显状态 如果返回是on 则再发一条关闭 /
    if(at_resp_get_line_by_kw(resp, "on") != NULL)
    {
    at_exec_cmd(resp, "ATE");
    }
    /
    设置 station模式 */
    if(at_exec_cmd(resp, "AT+WFMODE=0") != RT_EOK)
    {
    rt_kprintf("AT client send AT+WFMODE failed,response error!");
    return -RT_ERROR;
    }
    /* 连接到 ap */
    if(at_exec_cmd(resp, "AT+WFJAPA=ssid,pwd") != RT_EOK)
    {
    rt_kprintf("AT client send AT+WFWFJAPA failed,response error!");
    return -RT_ERROR;
    }
    rt_thread_delay(2000);
    /* 查看IP服务器 */
    if(at_exec_cmd(resp, "AT+NWIP") != RT_EOK)
    {
    rt_kprintf("AT client send AT+NWIP failed,response error!");
    return -RT_ERROR;
    }
    rt_thread_delay(1000);
    //LOG_D("recv:%s,recv line:%d",resp->buf,resp->line_num);
    if(at_resp_parse_line_args(resp,2,"%*[^,],%[^,]",&ip)>0)
    {
    rt_kprintf("ip:%s ",ip);
    }
    else{
    rt_kprintf("NWIP erro");
    return -RT_ERROR;
    }
    /* 连接MQTT服务器*/
    if(at_exec_cmd(resp, "AT+NWMQBR=%s,%d","192.168.3.192",1883) != RT_EOK)
    {
    rt_kprintf("AT client send AT+NWMQBR failed,response error!");
    return -RT_ERROR;
    }
    /* 设置订阅主题 */
    if(at_exec_cmd(resp, "AT+NWMQTS=%d,%s",1,"lugl_sub") != RT_EOK)
    {
    rt_kprintf("AT client send AT+NWMQTS failed,response error!");
    return -RT_ERROR;
    }
    /* 设置发布主题 */
    if(at_exec_cmd(resp, "AT+NWMQTP=%s","lugl_pub") != RT_EOK)
    {
    rt_kprintf("AT client send AT+NWMQTP failed,response error!");
    return -RT_ERROR;
    }
    at_client_port_init();
    /* 使能MQTT */
    if(at_exec_cmd(resp, "AT+NWMQCL=1") != RT_EOK)
    {
    rt_kprintf("AT client send AT+NWMQCL failed,response error!");
    return -RT_ERROR;
    }
    /* 删 除 服 务 器 响 应 结 构 体 */
    at_delete_resp(resp);
    return RT_EOK;
    }
    hal_entry.c:

extern struct hs300x_device temp_humi_dev;
void hal_entry(void)
{
float temp_f,humi_f;
char mqtt_send_buf[128] = {0};
rt_kprintf("nHello RT-Thread!n");
rt_uint32_t led1_pin = rt_pin_get(LED1_PIN);
at_client_16200_mqtt_init();
while (1)
{
rt_pin_write(led1_pin, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(led1_pin, PIN_LOW);
rt_thread_mdelay(500);
hs300x_read_data(&temp_humi_dev, &humi_f, &temp_f);
rt_sprintf(mqtt_send_buf,"{"temp":"%d.%2d","humi":"%d.%2d"}",(int)temp_f,(int)(temp_f100)%100,(int)humi_f,(int)(humi_f100)%100);
da16200_mqtt_pub(mqtt_send_buf);
// rt_kprintf("HUMI: %d.%2dn", (int)humi_f, (int)(humi_f100)%100);
// rt_kprintf("HUMI: %d.%2dn", (int)temp_f, (int)(temp_f
100)%100);
}
}

实现在的效果:

1.jpg

打开mqtt客户端,收到数据

1.jpg

【项目总结】

作为国产的RT-Thread 实时操作系统,生态系统越来越丰富。同时也有自己的RT-Thread Studio IDE来实现图形化的配置,特别是集合了RASC的图形化配置系统。使得入门非常容易。

【有待改善的地方】

1、FSP的更新不向前兼容,导致会出现很多问题,这样新入门的朋友,可能被难倒在起点之处。
2、包更新后会覆盖掉原来的一起代码,如果不做备份,非常麻烦。
总之,通过这次DIY项目,加深了瑞萨+RT-Thread的编程印象,以后会经常关注RTT,同时也会贡献自己的力量。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PIN管
    +关注

    关注

    0

    文章

    36

    浏览量

    6324
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11554
  • MQTT协议
    +关注

    关注

    0

    文章

    97

    浏览量

    5362
  • Uart串口
    +关注

    关注

    0

    文章

    29

    浏览量

    6811
  • RTThread
    +关注

    关注

    8

    文章

    132

    浏览量

    40861
收藏 人收藏

    评论

    相关推荐

    使用RT-Thread和CPK-RA2L1采集DHT11温湿度

    本篇文章主要介绍使用RT-Thread Studio 和瑞萨 CPK-RA2L1评估板,使用大佬的轮子采集温湿度
    的头像 发表于 10-11 11:34 1607次阅读
    使用RT-Thread和CPK-<b class='flag-5'>RA2L1</b><b class='flag-5'>采集</b>DHT11<b class='flag-5'>温湿度</b>

    【天启教育M1开发板试用体验】MQTT温湿度

    【目的】建立一个温湿度计,并通过MQTT上传到服务器1、连接wifi:2、设置mqtt服务器连接信息:3、连接成功后,获取
    发表于 09-15 09:44

    如何实现RTT RA2L1 MQTT网络温湿度采集的设计呢

    的地方】  1、FSP的更新不向前兼容,导致会出现很多问题,这样新入门的朋友,可能被难倒在起点之处。  2、包更新后会覆盖掉原来的一起代码,如果不做备份,非常麻烦。  总之,通过这次DIY项目,加深了瑞萨+RT-Thread的编程印象,以后会经常关注
    发表于 02-28 15:07

    温湿度传感器与LM-8052NET实现网络化远程采集温湿度

    温湿度是自然界中和人类打交道最多的两个物理参数,无论是在生产实验场所,还是在居住休闲场所,温湿度采集或控制都十分频繁和重要,而且,网络化远程采集
    发表于 07-02 09:16 1349次阅读

    【天启教育M1开发板试用体验】MQTT温湿度

    到服务器 1、连接wifi: 2、设置mqtt服务器连接信息: 3、连接成功后,获取温湿度,并上传给服务器: 4、用mqttx监控订阅test的主题收到数据: 【积木程序图】 积木
    的头像 发表于 10-17 11:31 728次阅读
    【天启教育M<b class='flag-5'>1</b>开发板试用体验】<b class='flag-5'>MQTT</b><b class='flag-5'>温湿度</b>计

    RA2L1硬件用户手册(中英)

    RA2L1硬件用户手册(中英)
    发表于 11-07 19:49 6次下载
    <b class='flag-5'>RA2L1</b>硬件用户手册(中英)

    RA2L1开发板资料

    RA2L1开发板资料
    发表于 11-07 19:50 18次下载
    <b class='flag-5'>RA2L1</b>开发板资料

    RA2L1 组用户手册:硬件

    RA2L1 组用户手册:硬件
    发表于 01-09 19:06 5次下载
    <b class='flag-5'>RA2L1</b> 组用户手册:硬件

    RA2L1 组数据表

    RA2L1 组数据表
    发表于 01-09 19:06 0次下载
    <b class='flag-5'>RA2L1</b> 组数据表

    瑞萨e2studio----RA2L1通过传感器检测温湿度

     本篇文章主要介绍如何使用芯片型号R7FA2L1AB2DFL的开发板外接温湿度传感器进行温湿度检测,并通过串口显示温湿度
    的头像 发表于 01-04 14:38 1586次阅读
    瑞萨e<b class='flag-5'>2studio----RA2L1</b>通过传感器检测<b class='flag-5'>温湿度</b>

    RA2L1 组用户手册:硬件

    RA2L1 组用户手册:硬件
    发表于 06-30 18:50 1次下载
    <b class='flag-5'>RA2L1</b> 组用户手册:硬件

    RA2L1 组数据表

    RA2L1 组数据表
    发表于 06-30 18:50 0次下载
    <b class='flag-5'>RA2L1</b> 组数据表

    RTT RA2L1 HS3003采集温湿度之一

    选择基于开发板->CPK-RA2L1 填入项目名称,点击完成,就创建好了工程。
    的头像 发表于 10-12 11:02 617次阅读
    <b class='flag-5'>RTT</b> <b class='flag-5'>RA2L1</b> HS3003<b class='flag-5'>采集</b><b class='flag-5'>温湿度</b>之一

    基于RA2L1实现串口DTC数据接收

    基于RA2L1实现串口DTC数据接收
    的头像 发表于 10-10 09:34 542次阅读
    基于<b class='flag-5'>RA2L1</b>实现串口DTC数据接收

    瑞萨RA2L1系列CAN通信应用

    瑞萨RA2L1系列CAN通信应用
    的头像 发表于 06-26 08:06 603次阅读
    瑞萨<b class='flag-5'>RA2L1</b>系列CAN通信应用