关注、星标公众号,直达精彩内容
作者:KK
上期回顾:(点此连接跳转),上期介绍了如何使用TouchGFX的MVP架构。
本期将介绍一下如何利用rtthread系统同步网络时间和天气预报到UI上。
在 RT-Thread 所支持的 BSP 中,大部分都有支持以太网驱动。但具体到用户的硬件中,可能会和默认的代码有所差异。本文选择相对以太网驱动比较完善的 stm32 BSP进行介绍。
常见的以太网芯片种类
以太网芯片有很多种,大致可以分成 3 种:
以太网芯片只有 PHY(物理接口收发器 ),需要单片机带 MAC(以太网媒体接入控制器 ),通过 MII 或者 RMII 接口和单片机通讯。例如 LAN8720。
以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯。例如 ENC28J60。
以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯,同时内置硬件协议栈,适合低速单片机。例如 W5500。
本项目使用的以太网芯片是第一种,硬件链接方式如下图所示:
使能 lwIP 与 net dev
首先使能以太网外设:
NetUtils 组件简介
RT-Thread NetUtils 作为网络工具合集,既有用于测试调试的 Ping 命令, 同步时间的 NTP 工具, 性能和带宽测试的 Iperf 、 NetIO,还有在嵌入式系统中广泛使用的轻量级文件传输工具 TFTP,方便地通过网络完成两个设备间的文件互传。
NTP 工具
NTP 是网络时间协议 (Network Time Protocol),它是用来同步网络中各个计算机时间的协议。在 RT-Thread 上实现了 NTP 客户端,连接上网络后,可以获取当前 UTC 时间,并更新至 RTC 中。
在 NetUtils 菜单栏使能 NTP 选项:
Finsh/MSH 命令效果如下:
time_t ntp_sync_to_rtc(void)
,返回值大于 0 成功,等于 0 失败。
1int main(void)
2{
3 time_t cur_time;
4 cur_time = ntp_sync_to_rtc(NULL);
5 if (cur_time)
6 {
7 rt_kprintf("Cur Time: %s", ctime((const time_t*) &cur_time));
8 }
9 else
10 {
11 rt_kprintf("NTP sync fail.\n");
12 }
13 return RT_EOK;
14}
将时间同步至 Screen
1void Screen2View::handleTickEvent()
2{
3 now = time(RT_NULL);
4 clock = gmtime(&now);
5
6 digitalHours = clock->tm_hour;
7 digitalMinutes = clock->tm_min;
8 digitalSeconds = clock->tm_sec;
9 digitalYear = clock->tm_year;
10 digitalMon = clock->tm_mon;
11 digitalDay = clock->tm_mday;
12 digitalWday = clock->tm_wday;
13
14 analogHours = clock->tm_hour;
15 analogMinutes = clock->tm_min;
16 analogSeconds = clock->tm_sec;
17
18 digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
19 analogClock1.setTime24Hour(analogHours, analogMinutes, analogSeconds);
20
21 Unicode::snprintf(DateYearTextBuffer, DATEYEARTEXT_SIZE, "20%d", digitalYear-100);
22 DateYearText.invalidate();
23
24 Unicode::snprintf(DateDayTextBuffer, DATEDAYTEXT_SIZE, "%d", digitalDay);
25 DateDayText.invalidate();
26
27 Unicode::UnicodeChar monthText[DATEMONTHTEXT_SIZE];
28 const char* months[] = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" };
29 Unicode::strncpy(monthText, months[digitalMon], DATEMONTHTEXT_SIZE);
30
31 Unicode::snprintf(DateMonthTextBuffer, DATEMONTHTEXT_SIZE, "%s", monthText);
32 DateMonthText.invalidate();
33}
注册心知天气,获取网络API接口
添加WebClient软件包
由于我们获取天气信息是通过访问心知天气的网络API,所以我们需要开启本地Web客户端。
使用命令行进行测试
代码开源地址:https://gitee.com/Aladdin-Wang/hellotouchGFX
你可以添加微信17775982065为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群!
RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。
长按二维码,关注我们
转一转
赞一赞
看一看
“在看”的小可爱永远十八岁!