913|1

280

帖子

7

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子Follow me第1期】003:网络连接和同步时钟 [复制链接]

 

上一帖介绍驱动两个外设:蜂鸣器和OLED。这一贴介绍网络连接和同步时钟。参考大佬给的文档和代码,我的试验过程如下。

Raspberry Pico W和 Pico WH 在PICO的基础上保留了 Pico 外形,添加了WIFI功能,搭载了英飞凌(Infineon)CYW43439模块,使其具有了链接2.4G wifi的能力,并且未来有可能会支持蓝牙。 板载2.4GHz无线接口具有以下特点:无线 (802.11n),单频段 (2.4 GHz), WPA3,最多支持四个客户端的软接入点。

首先是网络连接,树莓派底层MicroPython固件做了大量联网方面工作,将很多协议栈和函数都封装到了一起,所以我们用起来就简化成了很简单的几个函数,直接上代码。

图1、联网代码

运行后如下图所示,可见获得的IP地址、子网掩码、网关地址等信息。

图2、网络信息

连上网络之后,通过访问网络上的NTP服务器,可以获取当前时间,在MicroPython上是通过ntptime模块获取时间的。

通过host设置目标ntp服务器,为了访问会快一些我这里选择了阿里云的一个服务器,用默认的服务器时,有时会出现超时的错误。访问NTP服务器获取到的是UTC时间的秒数,而且不是北京时间的秒数。北京时间是东八区的时间,因此需要设置NTP_DELTA为3155644800。中国在UTC+8 的时区计算方式: 3155673600 - 8*3600 = 3155644800 , 3155673600 是默认的UTC,以秒计算偏移量。之后再调用time模块,将秒数转化成常用的日期格式。下面是具体的代码。

图3、同步时间代码

运行后输出如下。

图4、同步时间结果

参考资料:

https://bbs.eeworld.com.cn/thread-1239327-1-1.html

点赞 关注
 
 

回复
举报

280

帖子

7

TA的资源

一粒金砂(高级)

沙发
 

写这篇帖子的时候,做实验发现同步时间总是在UTC0和UTC8之间反复跳变,开始没搞明白咋回事,今天看完ntptime.py的代码,再结合Thonny和Mu两个编辑器特点,终于搞明白咋回事了。

先看ntptime.py源代码:

链接已隐藏,如需查看请登录或者注册

import utime

try:
    import usocket as socket
except:
    import socket
try:
    import ustruct as struct
except:
    import struct

# The NTP host can be configured at runtime by doing: ntptime.host = 'myhost.org'
host = "pool.ntp.org"
# The NTP socket timeout can be configured at runtime by doing: ntptime.timeout = 2
timeout = 1


def time():
    NTP_QUERY = bytearray(48)
    NTP_QUERY[0] = 0x1B
    addr = socket.getaddrinfo(host, 123)[0][-1]
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.settimeout(timeout)
        res = s.sendto(NTP_QUERY, addr)
        msg = s.recv(48)
    finally:
        s.close()
    val = struct.unpack("!I", msg[40:44])[0]

    EPOCH_YEAR = utime.gmtime(0)[0]
    if EPOCH_YEAR == 2000:
        # (date(2000, 1, 1) - date(1900, 1, 1)).days * 24*60*60
        NTP_DELTA = 3155673600
    elif EPOCH_YEAR == 1970:
        # (date(1970, 1, 1) - date(1900, 1, 1)).days * 24*60*60
        NTP_DELTA = 2208988800
    else:
        raise Exception("Unsupported epoch: {}".format(EPOCH_YEAR))

    return val - NTP_DELTA


# There's currently no timezone support in MicroPython, and the RTC is set in UTC time.
def settime():
    t = time()
    import machine

    tm = utime.gmtime(t)
    machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6] + 1, tm[3], tm[4], tm[5], 0))

从上面代码可以看到,在程序中

def sync_ntp():
     ntptime.NTP_DELTA = 3155644800   # 可选 UTC+8偏移时间(秒),不设置就是UTC0
     ntptime.host = 'cn.ntp.org.cn'#'ntp1.aliyun.com'  # 可选,ntp服务器,默认是"pool.ntp.org"
     ntptime.settime()   # 修改设备时间,到这就已经设置好了

传入ntptime.NTP_DELTA的值没什么用,最终都会被内部数值代替掉,传回来的永远是UTC0的时间。

那为什么有时候出来的时间是对的呢?

这就得问问鸡贼的Thonny编辑器了,这货会自己把PC系统时间自动传给开发板,使开发板时间变成正确的。

换成Mu编辑器,没有这个功能,就没有这么多故事了,你设成什么就是什么。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表