专栏首页AIoT开源项目分享【DIY数字仪表】RT-Thread移植touchgfx实现自动同步网络时间和天气预报(3)

【DIY数字仪表】RT-Thread移植touchgfx实现自动同步网络时间和天气预报(3)

作者:KK 本期将介绍一下如何利用rtthread系统同步网络时间和天气预报到UI上。

1.移植网络协议栈

在 RT-Thread 所支持的 BSP 中,大部分都有支持以太网驱动。但具体到用户的硬件中,可能会和默认的代码有所差异。本文选择相对以太网驱动比较完善的 stm32 BSP进行介绍。 常见的以太网芯片种类 以太网芯片有很多种,大致可以分成 3 种:

  • 以太网芯片只有 PHY(物理接口收发器 ),需要单片机带 MAC(以太网媒体接入控制器 ),通过 MII 或者 RMII 接口和单片机通讯。例如 LAN8720。
  • 以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯。例如 ENC28J60。
  • 以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯,同时内置硬件协议栈,适合低速单片机。例如 W5500。

本项目使用的以太网芯片是第一种,硬件链接方式如下图所示:

驱动架构图

数据接收流程

当以太网硬件设备收到网络报文产生中断时,接收到的数据会被存放到接收缓冲区,然后以太网中断程序会发送邮件来唤醒 erx 线程,erx 线程会按照接收到的数据长度来申请 pbuf,并将数据放入 pbuf 的 payload 中,然后将 pbuf 通过邮件发送给 去处理。 数据发送流程

当有数据需要发送时,LwIP 会将数据通过邮件发送给 etx 线程,然后永久等待在 tx_ack 信号量上。etx 线程接收到邮件后,通过调用驱动中的 rt_stm32_eth_tx() 函数发送数据,发送完成之后再发送一次 tx_ack 信号量唤醒 LwIP 。

使能 lwIP 与 net dev 首先使能以太网外设:

启用 lwIP 与 net device:

测试网络

确认IP地址:

ping 测试:

2.同步时间

NetUtils 组件简介 RT-Thread NetUtils 作为网络工具合集,既有用于测试调试的 Ping 命令, 同步时间的 NTP 工具, 性能和带宽测试的 Iperf 、 NetIO,还有在嵌入式系统中广泛使用的轻量级文件传输工具 TFTP,方便地通过网络完成两个设备间的文件互传。 NTP 工具 NTP 是网络时间协议 (Network Time Protocol),它是用来同步网络中各个计算机时间的协议。在 RT-Thread 上实现了 NTP 客户端,连接上网络后,可以获取当前 UTC 时间,并更新至 RTC 中。

在 NetUtils 菜单栏使能 NTP 选项:

同步本地时间至 RTC 如果开启 RTC 设备,还可以使用下面的命令及 API 同步 NTP 的本地时间至 RTC 设备。

Finsh/MSH 命令效果如下:

同步本地时间至 RTC 函数原型为:time_t ntp_sync_to_rtc(void),返回值大于 0 成功,等于 0 失败。

int main(void)
{
    time_t cur_time;
    cur_time = ntp_sync_to_rtc(NULL);
    if (cur_time)
    {
        rt_kprintf("Cur Time: %s", ctime((const time_t*) &cur_time));
    }
    else
    {
        rt_kprintf("NTP sync fail.\n");
    }
    return RT_EOK;
}

将时间同步至 Screen

void Screen2View::handleTickEvent()
{
    now = time(RT_NULL);
    clock = gmtime(&now);

    digitalHours = clock->tm_hour;
    digitalMinutes = clock->tm_min;
    digitalSeconds = clock->tm_sec;
    digitalYear = clock->tm_year;
    digitalMon = clock->tm_mon;
    digitalDay = clock->tm_mday;    
    digitalWday = clock->tm_wday;

    analogHours = clock->tm_hour;
    analogMinutes = clock->tm_min;
    analogSeconds = clock->tm_sec;

    digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
    analogClock1.setTime24Hour(analogHours, analogMinutes, analogSeconds);

    Unicode::snprintf(DateYearTextBuffer, DATEYEARTEXT_SIZE, "20%d", digitalYear-100);
    DateYearText.invalidate();

    Unicode::snprintf(DateDayTextBuffer, DATEDAYTEXT_SIZE, "%d", digitalDay);
    DateDayText.invalidate();

    Unicode::UnicodeChar monthText[DATEMONTHTEXT_SIZE];
    const char* months[] = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" };
    Unicode::strncpy(monthText, months[digitalMon], DATEMONTHTEXT_SIZE);

    Unicode::snprintf(DateMonthTextBuffer, DATEMONTHTEXT_SIZE, "%s", monthText);
    DateMonthText.invalidate();
}

3.同步天气预报

注册心知天气,获取网络API接口

location参数,我们根据请求的IP,自动获取所在位置的天气信息。

添加WebClient软件包 由于我们获取天气信息是通过访问心知天气的网络API,所以我们需要开启本地Web客户端。

由于API返回的数据是格式是JSON,所以还需要开启CJSON软件包用于解析数据。

最后,添加我们自己的用户代码,解析返回的数据即可。

使用命令行进行测试

将天气信息同步至 Screen 参考上篇文章,利用touchgfx的MVP架构:【DIY数字仪表】使用TouchGFX的MVP架构来实现GUI和硬件的双向交互(2)

代码开源地址:https://gitee.com/Aladdin-Wang/hellotouchGFX

本文分享自微信公众号 - AIoT开源项目分享(Aladdin-Wang),作者:AIoTkk

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【DIY数字仪表】RT-Thread结合TouchGFX实战教程(完)

    2.命令行功能演示: 命令行添加了更多功能,不仅可以通过命令行调试系统,还可以通过命令行获取时间、天气信息、升级固件,也能把sd卡中的图片文件复制到spi fl...

    AIoT-KK
  • 零代码玩转OTA升级

    前言: 前边讲过stm32通用bootloader的实现方法,没有看过的,可以参考这一篇文章:STM32通用Bootloader——FOTA,这次将在上篇boo...

    AIoT-KK
  • OOPC精要——撩开“对象”的神秘面纱

    由于前文《C/C++面向对象编程之封装》存在一些小错误或者难以理解的地方,Gorgon Meducer(傻孩子,PLOOC开源项目的作者)对此进行了修改和必要的...

    AIoT-KK
  • 常见加密算法简析

    说到加密算法,开发人员基本都不会陌生。我们平常开发中接触形形色色的加密算法,简单来说分为对称加密算法与非对称加密算法以及散列算法。算法的区别在...

    逆月翎
  • dotnet OpenXML 如何获取 schemeClr 颜色

    颜色是一个大的主题,在 ECMA 376 里面用了 19 页 A4 描述了颜色,但仅是简单的描述。在 OpenXML 定义了 Scheme Color (sch...

    林德熙
  • 你应该知道的那些Jupyter Notebook奇技

    Jupyter Notebook是一个在线编辑器,可以在网页上编辑程序,在编辑的过程中,每次编辑一行代码就可以运行一行代码,运行的结果也可以显示在代码的下方,方...

    石晓文
  • 你应该知道的那些Jupyter Notebook奇技淫巧

    Jupyter Notebook是一个在线编辑器,可以在网页上编辑程序,在编辑的过程中,每次编辑一行代码就可以运行一行代码,运行的结果也可以显示在代码的下方,方...

    1480
  • GOOGLE招聘之行为准则

    大数据文摘
  • BAR面试题6:LR和SVM的联系与区别

    接下来,每天一道BAT面试题陪伴你,日积月累,相信大家会从中学到一些东西。最后希望你们顺利拿到理想的OFFER.

    double
  • 币聪-Chainlink行情分析:熊市中LINK过去24小时涨幅2.39%,价格长期看涨?

    ChainLink在过去24小时的交易中价格上涨了2.39%。LINK目前以0.2828美元的价格交易,并继续与整体市场情绪进行交易。该项目在过去7个交易日内上...

    币聪财经

扫码关注云+社区

领取腾讯云代金券