使用RT-Thread 系统实现DIY数字仪表(四)——同步网络时间

目录:

1.使用RT-Thread 系统实现DIY数字仪表(一)——STM32CUBMX5.6移植touchGFX4.13
2.使用RT-Thread 系统实现DIY数字仪表(二)——把TouchGFX移植到RTThread系统
3.使用RT-Thread 系统实现DIY数字仪表(三)——获取温湿度传感器数据
4.使用RT-Thread 系统实现DIY数字仪表(四)——同步网络时间
5.使用RT-Thread 系统实现DIY数字仪表(五)——链接阿里云物联网平台
6.使用RT-Thread 系统实现DIY数字仪表(六)——完善TouchGFX仪表界面
7.使用RT-Thread 系统实现DIY数字仪表(七)——开发微信小程序

实验平台:

硬件: 野火挑战者STM32F767 V1开发版和ESP8266模块
软件: TouchGFXDesigner v4.13和 STM32CubeMX v5.6.0,MDK v5.29,RT-Thread env 工具

实验前准备工作:

1.准备一套 野火挑战者STM32F767 开发版或其他核心板
2.安装 TouchGFXDesigner v4.13
3.安装STM32CubeMX v5.6.0和X_CUBE_TOUCHGFX软件包
4.安装 MDK v5.27以上版本
5.下载 RTThread源码包https://gitee.com/rtthread/rt-thread

下载:

代码持续更新中:github代码下载地址https://gitee.com/Aladdin-Wang/hellotouchGFX.git

联系作者:

加微信备注touchgfx,拉入touchgfx-rtthread技术交流群共同学习
在这里插入图片描述

1.添加ESP8266设备驱动

1.1. 使能C++组件

使用at_device软件包之前,需要先开启libc组件,touchgfx使用的C++编程语言,使用libc组件前,需要先打开C++组件支持
在这里插入图片描述

1.2 使能libc组件

使用at_device软件包之前,需要先开启libc组件
在这里插入图片描述

1.3 添加at_device软件包

AT device 软件包是对 AT 组件和 AT socket 功能的移植,需开启 AT 组件库和 AT socket 功能来获取 AT device 软件包。

RT-Thread online packages —>
IoT - internet of things —>
-*- AT DEVICE: RT-Thread AT component porting or samples for different device
[ ] Enable at device init by thread
AT socket device modules (Not selected, please select) —>
Version (V1.6.0) —>

在这里插入图片描述
在这里插入图片描述

1.4 通过cubmx打开uart3

在这里插入图片描述
增加RX缓冲区大小:
在这里插入图片描述

1.5 打开 BSD socket:

在这里插入图片描述
此时 net device和文件系统也将自动被打开(fd 的管理在文件系统中,所以需要文件系统):
在这里插入图片描述
在这里插入图片描述

2 网络测试

ifcong测试:
在这里插入图片描述
ping测试:
在这里插入图片描述
tcpclient测试:
在软件包中开启基础示例代码 tcp client

-> RT-Thread online packages
-> miscellaneous packages
-> samples: kernel and components samples
-> a network_samples package for rt-thread

在这里插入图片描述
由于使用的是AT Socket 协议栈,所以把AF_INET替换成AF_AT
在这里插入图片描述
在这里插入图片描述

3 获取网络时间

3.1 添加netutils工具软件包

netutils软件包中汇集了 RT-Thread 可用的全部网络小工具集合,包括NTP工具。
NTP 是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机时间的协议,RT-Thread 上的 NTP 客户端连接上网络后,可以获取当前 UTC 时间,并更新至 RTC 中。
在这里插入图片描述

3.2 开启RTC

因为NTP工具在获取到网络时间后,需要同步到本地RTC,所以需要开启本地RTC功能
在这里插入图片描述
使用NTP工具包自带的命令进行测试:
在这里插入图片描述

3.3 编写上电自动同步时间代码

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <arpa/inet.h> 
#include <netdev.h>
#include <ntp.h>

/* defined the LED0 pin: PH10 */
#define LED0_PIN    GET_PIN(H, 10)

int main(void)
{
    int count = 1;
	time_t cur_time;
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
	rt_pin_write(LED0_PIN, PIN_HIGH);
	//获取网卡对象
	struct netdev* net = netdev_get_by_name("esp0");

	//阻塞判断当前网络是否正常连接
	while(netdev_is_internet_up(net) != 1)
	{
	   rt_thread_mdelay(200);
	}
	//提示当前网络已就绪
	rt_kprintf("network is ok!\n");

	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");
	}

    while (count++)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(1000);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

3.4 将网络时间同步到UI

使用SIMULATOR这个宏来区分vs仿真和使用hal库的代码

#ifndef SIMULATOR
#include "Thread.h"
#include <rtdevice.h>
#endif
void mainView::handleTickEvent()
{
	#ifdef SIMULATOR
	/*使用VS仿真的代码*/
	tickCounter++;

    if (tickCounter % 60 == 0)
    {
        if (++digitalSeconds >= 60)
        {
            digitalSeconds = 0;
            if (++digitalMinutes >= 60)
            {
                digitalMinutes = 0;
                if (++digitalHours >= 24)
                {
                    digitalHours = 0;
                }
            }
        }

        if (++analogSeconds >= 60)
        {
            analogSeconds = 0;
            if (++analogMinutes >= 60)
            {
                analogMinutes = 0;
                if (++analogHours >= 24)
                {
                    analogHours = 0;
                }
            }
        }

        // Update the clocks
        digitalClock.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
        analogClock.setTime24Hour(analogHours, analogMinutes, analogSeconds);
    }
	#else
	/*使用HAL库的代码*/
	time_t now;
	struct tm *clock;
	now = time(RT_NULL);
	clock = gmtime(&now);
	
	digitalHours = clock->tm_hour;
	digitalMinutes = clock->tm_min;
	digitalSeconds = clock->tm_sec;
	
	analogHours = clock->tm_hour;
	analogMinutes = clock->tm_min;
	analogSeconds = clock->tm_sec;
	
	digitalClock.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
    analogClock.setTime24Hour(analogHours, analogMinutes, analogSeconds);


	#endif

}

4 效果

上电获取时间:
在这里插入图片描述
UI同步时间:
在这里插入图片描述

扩展阅读:RT-Thread学习笔记之网络框架

发布了33 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/sinat_31039061/article/details/105343118