社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
专业技术中心
›
DigiKey得捷技术专区
›
【得捷电子Follow me第4期】进阶任务:从NTP服务器获取 ...
返回列表
发新帖
回复
阅
323
|
回
0
alanlan86
当前离线
一粒金砂(高级)
最后登录
2024-9-12
在线时间
24 小时
威望
281分
芯积分
377分
(兑换)
E金币
0枚
(兑换)
(兑换)
好友
0
alanlan86
103
帖子
7
TA的资源
一粒金砂(高级)
+ 好友
私信
发表于2024-2-24 21:52
显示全部楼层
【得捷电子Follow me第4期】进阶任务:从NTP服务器获取时间并显示
[复制链接]
本帖最后由 alanlan86 于 2024-2-24 21:56 编辑
# 任务目标 - 通过Pico + W5500 EVB的以太网访问NTP服务器,获取到当前时间,并通过log打印和显示到OLED上 ![](http://docs.wiznet.io/assets/images/w5500_evb_pico_side-da676c5d9c41adedc0469b9f1810b81b.png) # 理论 NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。 【关于如何保证精准同步对时,是一个更深入的内容,此处不展开。感兴趣的可以网络查阅相关资料】 NTP(Network Time Protocol)协议使用UDP(User Datagram Protocol,用户数据报协议)进行数据包传输,其标准端口号是123。客户端在与NTP服务器交互时,会向NTP服务器的123端口发送请求;而当NTP服务器回应时,也会使用UDP协议的源端口123来返回应答。 - 基于这个本质Pico W5500需要先建立一个UDP的连接,访问一个NTP服务器。本任务选用了“ntp.aliyun.com” - 关于NTP帧格式: ![](https://img-blog.csdn.net/20180811164243878?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rvc3RoaW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) - 详细查看adafruit_wiznet5k库代码adafruit_wiznet5k_ntp.py 1. NTP初始化建立套接字socket ```python def __init__(self, iface, ntp_address,utc,debug=False): self._debug = debug self._iface = iface socket.set_interface(self._iface) self._sock = socket.socket(type=socket.SOCK_DGRAM) self._sock.settimeout(1) self._utc = utc self._ntp_server = ntp_address self._host = 0 self._request_id = 0 # request identifier self._pkt_buf_ = bytearray() ``` 2. 构建包头 ```python def _build_ntp_header(self,ip): self._pkt_buf_.append(0x23) for i in range(55): self._pkt_buf_.append(0x00) ``` 3. 绑定端口并发送UDP请求到NTP服务器,并接收返回,从而返回日历时间。 ```python def get_time(self): self._build_ntp_header(self._ntp_server) self._sock.bind((None,50001)) self._sock.sendto(self._pkt_buf_,(self._ntp_server, 123)) while True: data = self._sock.recv(1024) if data: sec = data[40:44] int_cal = int.from_bytes(sec,"big") cal =int_cal - 2208988800 + self._utc *3600 cal = time.localtime(cal) return cal ``` # 硬件 硬件连接部分继续采用Grove shield的底板和I2C接口的0.96inch的OLED屏幕。 ![](https://bbs.eeworld.com.cn/data/attachment/forum/202306/26/193646ezvqvpqtvvao83qs.png.thumb.jpg) # 软件 ## OLED显示 - 显示时间和日期 ```python # 显示日期 #splash.remove(text_area) splash.pop() text = "%s"%days[cal.tm_wday+1] +"/"+ str(cal.tm_mday) +"-"+ str(cal.tm_mon) +"-"+ str(cal.tm_year) text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=16, y=HEIGHT // 2 - 1) splash.append(text_area) display.show(splash) led.value = not led.value time.sleep(3) # 显示时间 #splash.remove(text_area) splash.pop() text = "%02d"%cal.tm_hour+":%02d"%cal.tm_min+":%02d"%cal.tm_sec text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=16, y=HEIGHT // 2 - 1 ) splash.append(text_area) display.show(splash) ``` ## NTP获取时间 - 通过get time直接得到日期和时间。 ```python #------------------------------------------------------------------------------ ntpserver_ip = eth.pretty_ip(eth.get_host_by_name("ntp.aliyun.com")) print("NTP : %s" % ntpserver_ip) #DNS Domain ntp = NTP(iface = eth, ntp_address =ntpserver_ip ,utc=8) cal = ntp.get_time() print("The date is %s %d/%d/%d" %(days[cal.tm_wday+1], cal.tm_mday,cal.tm_mon,cal.tm_year)) print("The time is %d:%02d:%02d" %(cal.tm_hour,cal.tm_min,cal.tm_sec)) ``` ## 循环获取时间 - 针对circuitpython库中NTP的调用,若需要循环获取时间,需要增加一个updat time函数。因为已经bind的sokcet是没法再次调用的,因此直接调用sendto函数进行请求发送即可。 ```python def update_time(self): #self._build_ntp_header(self._ntp_server) #self._sock.bind((None,50001)) self._sock.sendto(self._pkt_buf_,(self._ntp_server, 123)) while True: data = self._sock.recv(1024) if data: sec = data[40:44] int_cal = int.from_bytes(sec,"big") cal =int_cal - 2208988800 + self._utc *3600 cal = time.localtime(cal) return cal ``` ## 完整代码 ```python import board import busio import digitalio import time import adafruit_requests as requests from adafruit_wiznet5k.adafruit_wiznet5k import * import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket from adafruit_wiznet5k.adafruit_wiznet5k_ntp import NTP import adafruit_wiznet5k.adafruit_wiznet5k_dns as dns days = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") import displayio import terminalio from adafruit_display_text import label import adafruit_displayio_ssd1306 displayio.release_displays() # Use for I2C i2c = busio.I2C(scl=board.GP7, sda=board.GP6) display_bus = displayio.I2CDisplay(i2c, device_address=0x3C) WIDTH = 128 HEIGHT = 32 # Change to 64 if needed BORDER = 5 display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) # Make the display context splash = displayio.Group() display.root_group = splash color_bitmap = displayio.Bitmap(WIDTH, HEIGHT, 1) color_palette = displayio.Palette(1) color_palette[0] = 0xFFFFFF # White bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) splash.append(bg_sprite) # Draw a smaller inner rectangle inner_bitmap = displayio.Bitmap(WIDTH - BORDER * 2, HEIGHT - BORDER * 2, 1) inner_palette = displayio.Palette(1) inner_palette[0] = 0x000000 # Black inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=BORDER, y=BORDER) splash.append(inner_sprite) # Draw a label text = "Hello World!" text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=28, y=HEIGHT // 2 - 1 ) splash.append(text_area) time.sleep(1) ##SPI0 SPI0_SCK = board.GP18 SPI0_TX = board.GP19 SPI0_RX = board.GP16 SPI0_CSn = board.GP17 ##reset W5x00_RSTn = board.GP20 print("Wiznet5k NTP Test (DHCP)") # Setup your network configuration below # random MAC, later should change this value on your vendor ID MY_MAC = (0x00, 0x01, 0x02, 0x03, 0x04, 0x05) IP_ADDRESS = (192, 168, 1, 102) SUBNET_MASK = (255, 255, 255, 0) GATEWAY_ADDRESS = (192, 168, 1, 1) #DNS_SERVER = (8, 8, 8, 8) #google公共DNS服务器 DNS_SERVER = (114, 114, 114, 114) #114DNS led = digitalio.DigitalInOut(board.GP25) led.direction = digitalio.Direction.OUTPUT ethernetRst = digitalio.DigitalInOut(W5x00_RSTn) ethernetRst.direction = digitalio.Direction.OUTPUT # For Adafruit Ethernet FeatherWing cs = digitalio.DigitalInOut(SPI0_CSn) # For Particle Ethernet FeatherWing # cs = digitalio.DigitalInOut(board.D5) spi_bus = busio.SPI(SPI0_SCK, MOSI=SPI0_TX, MISO=SPI0_RX) # Reset W5500 first ethernetRst.value = False time.sleep(1) ethernetRst.value = True # Initialize ethernet interface with DHCP #eth = WIZNET5K(spi_bus, cs) # Initialize ethernet interface without DHCP #eth = WIZNET5K(spi_bus, cs, is_dhcp=False, mac=MY_MAC) # Set network configuration #eth.ifconfig = (IP_ADDRESS, SUBNET_MASK, GATEWAY_ADDRESS, DNS_SERVER) eth = WIZNET5K(spi_bus, cs, is_dhcp=True, mac=MY_MAC, debug=False) print("Chip Version:", eth.chip) print("MAC Address:", [hex(i) for i in eth.mac_address]) print("My IP address is:", eth.pretty_ip(eth.ip_address)) # 显示IP地址 #splash.remove(text_area) splash.pop() text = "IP:" + eth.pretty_ip(eth.ip_address) text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=16, y=HEIGHT // 2 - 1 ) splash.append(text_area) display.show(splash) #------------------------------------------------------------------------------ ntpserver_ip = eth.pretty_ip(eth.get_host_by_name("ntp.aliyun.com")) print("NTP : %s" % ntpserver_ip) #DNS Domain ntp = NTP(iface = eth, ntp_address =ntpserver_ip ,utc=8) cal = ntp.get_time() print("The date is %s %d/%d/%d" %(days[cal.tm_wday+1], cal.tm_mday,cal.tm_mon,cal.tm_year)) print("The time is %d:%02d:%02d" %(cal.tm_hour,cal.tm_min,cal.tm_sec)) while True: cal = ntp.update_time() print("The date is %s %d/%d/%d" %(days[cal.tm_wday+1], cal.tm_mday,cal.tm_mon,cal.tm_year)) print("The time is %d:%02d:%02d" %(cal.tm_hour,cal.tm_min,cal.tm_sec)) # 显示日期 #splash.remove(text_area) splash.pop() text = "%s"%days[cal.tm_wday+1] +"/"+ str(cal.tm_mday) +"-"+ str(cal.tm_mon) +"-"+ str(cal.tm_year) text_area = label.Label(terminalio.FONT, text=text, color=0xFFFFFF, x=16, y=HEIGHT // 2 - 1) splash.append(text_area) display.show(splash) led.value = not led.value time.sleep(3) # 显示时间 #splash.remove(text_area) splash.pop() text = "%02d"%cal.tm_hour+":%02d"%cal.tm_min+":%02d"%cal.tm_sec text_area = label.Label( terminalio.FONT, text=text, color=0xFFFFFF, x=16, y=HEIGHT // 2 - 1 ) splash.append(text_area) display.show(splash) led.value = not led.value time.sleep(3) #-------------------------------------------------------------------------------------- ``` # 调试 - 通过MuEditor的调试数据信息,可以看到NTP服务器返回的日期和时间信息。
# 演示视频
演示
# 总结 在了解了NTP的原理后,就可以通过简单的调用cirucitpython的简单几行代码,即可以实现从网络获取到UTC时间,进而可以进行RTC的设置或者网络校时功能,真正的简单方便!!!
此帖出自
DigiKey得捷技术专区论坛
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
猜你喜欢
【帖子】【得捷电子Follow me第4期】进阶任务:从NTP服务器获取时间并显示
【帖子】【得捷电子Follow me第4期】进阶任务:从NTP服务器同步时间,获取时间
【帖子】【得捷Follow me第4期】进阶任务:从NTP服务器同步时间送显示屏显示
【帖子】【得捷Follow me第4期】进阶任务:从NTP服务器同步时间
【帖子】【得捷电子Follow me第1期】+开发板到货前资料准备工作
【帖子】【得捷电子Follow me第1期】 OLED显示报错
【帖子】【得捷电子Follow me第2期】CircuitPython入门到完成任务1-5详细教程
【帖子】【DigiKey“智造万物,快乐不停”创意大赛】3、使用lv_port_esp32适配1.69寸触摸屏
【下载】【得捷电子Follow me第2期】屏幕中文显示(任务一代码)
【下载】【得捷电子Follow me第2期】 任务1:控制屏幕显示中文
【下载】【得捷电子Follow me第2期】任务1:控制屏幕显示中文(必做任务 )
【下载】【得捷电子Follow me第2期】任务1:控制屏幕显示中文
【下载】【得捷电子Follow me第2期】玩转Adafruit ESP32-S3 TFT Feather资料包
【下载】【得捷电子Follow me第2期】玩转Adafruit ESP32-S3 TFT Feather 新资料包
【下载】【得捷电子Follow me第2期】Adafruit ESP32-S3 TFT Feather 任务代码
【下载】【得捷电子Follow me第2期】esp32-s3
【电路】使用ESP8266从NTP服务器获取时间并在OLED显示器上显示
【文章】DigiKey 推出《数字化城市》第 4 季视频系列,聚焦人工智能
活动
更多>>
Arrow&allegro有奖直播:下一代磁感应解决方案:XtremeSense™ TMR 技术如何促进高效应用
瑞萨电子边缘AI 技术研讨会——深圳站, 火热报名中,参会有好礼!
报名有好礼!50元京东卡等您拿!
罗姆有奖直播 | 高输出功率激光二极管—助力激光雷达性能提升
2024 DigiKey 应用说:树莓派 5 在视频直播中的应用
相约秋色~相约北京~恩智浦工业和物联网技术峰会 约起来!
泰科电子工业事业部邀您云逛展 ——打破时间、空间的限制,TE Connectivity 线上工博会为您带来沉浸式VR观展体验
关注有礼 | 泰克中端示波器增“重”计划
开源项目
更多>>
LT3971、5V 降压转换器的典型应用电路
无线充电
2021-LED板
具有低压逻辑接口的 LTC4420CMSE 备用电池的典型应用电路
LTC2992CDE 双向 30V 至 300V 高侧功率监视器的典型应用
NCV431低压精密可调并联稳压器的典型应用
3171907122
DC715A,使用 LTC5530ES6、300MHz 至 7000MHz 射频功率检测器的演示板
MIC2842A 的典型应用:具有 DAM 和单线数字控制的高效 4 通道 WLED 驱动器
LTC2378-16、16 位、1Msps、低功耗 SAR ADC 的典型应用
随便看看
得捷电子Follow me第4期】进阶任务:从NTP服务器获取时间并显示
【得捷电子Followme第4期】进阶任务:从NTP服务器获取时间并显示硬件环境硬件基本环境构建了一个可以连接网络的局域网,局域网内有一台PC和W5500-EVB-Pico设备。[attach]785606[/attach]图1网络架构软件实现采用基础任务一的软件为基础,搭建一个sntp的客户端 ...
【得捷电子Follow me第4期】进阶任务:从NTP服务器获取同步时间
[i=s]本帖最后由TL-LED于2024-2-2520:11编辑[/i]测试从NTP服务器获取同步时间,编译环境ArduinoIDE。一、进阶任务进阶任务:从NTP服务器(注意数据交互格式的解析)同步时间,获取时间送显示屏(串口)显示。二、安装NTPClient库IDE的库管理中下载NTPClient[attac ...
10月16日Arrow&allegro 有奖直播报名中!
10月16日Arrow&allegro有奖直播:下一代磁感应解决方案:XtremeSense™TMR技术如何促进高效应用报名中!>>点击报名直播时间:2024年10月16日(周三)上午10:00直播主题:下一代磁感应解决方案:XtremeSense™TMR技术如何促进高效应用直播简介 ...
麻烦看下这款调节板哪里可以买
【 匠芯创D133CBS】-小火苗-PWM测试
有用C8051F06x系列单片机做AD转换的吗?
红外解码在电脑上显示
国内外IC设计公司创业模式比较
Infineon Position2Go开发套件测评@1.开箱篇
PLC工程师招聘
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
铝电解用碳阳极
bldc电机控制
模块化设计
鼓式制动器
误比特率
数字源表
阻流电感
CAN模块
arm中国
方波
相关文章
更多>>
中科院研发全新隔膜 锂电池安全了:内部不再“长刺”
9月13日消息,使用传统商业隔膜的锂电池循环一定次数后,在锂金属阳极表面会出现大量“菜花状”的锂枝晶。 锂枝晶是锂金属电池中常见的问题,它们不仅会导致电池短路,还会加速电池的老化过程。 近日,中国科
我国突破氢离子注入核心技术 100%国产
据国家电力投资集团官方消息,近日,集团所属国电投核力创芯(无锡)科技有限公司核力创芯暨国家原子能机构核技术(功率芯片质子辐照)研发中心,完成了首批氢离子注入性能优化芯片产品客户交付。 这标志着,我国
印度部长:印度产苹果iPhone 16将供应全球
黄仁勋:必要时,英伟达可弃用台积电
博主曝车企对供应链的压价已到疯狂地步:领导不满意价格 立马重新招标
工信部印发《通知》—— 推动移动物联网从“万物互联”迈向“万物智联”
IGBT背后的男人,彻底改变了新能源汽车,获巨额奖金
下代龙芯3B6600明年上半年流片:单核性能领先
Mobileye放弃下代第一方调频连续波激光雷达开发,裁撤相关部门
欧洲法院终裁苹果公司须补缴130亿欧元税款
新帖速递
STM32和无源蜂鸣器播放声音的问题
车规级AECQ200介绍,混合铝电解电容器的选择
嵌入式教程_DSP技术_DSP实验箱操作教程:2-28 搭建轻量级WEB服务器实验
OPA847IDBVR运放器国产替代
AG32VF407测试UART
【得捷电子Follow Me第二期】第一章 收到货物的分享
请问这个红外接收头是什么型号?能用哪个型号代替?谢谢
出售全新未拆封ZYNQ 7Z020 FPGA核心板
用在锂电池供电的水表设置上的LORA模块,当有100块水表集中安装在一个楼道内时,节能
请问一下,当某个端口被设置为 RX0后,这个端口的输入输出方向还有必要设置吗
今年怎么这么难,比疫情时还难,三十了面临失业好迷茫
请教稳压管测试问题
【小华HC32F448测评】关于小华半导体的UART中断发送和PRINTF构造和重定向
【BIGTREETECH PI开发板】 HDMI输出测试
【BIGTREETECH PI开发板】+08.音频测试(zmj)
精选推荐
【ST NUCLEO-WB09KE测评】-5-RTC测试
LS635这款激光雷达芯片比较猛啊
【得捷Follow me第二季第1期】任务提交+红外功能使用
汽车电子之BMS电池管理系统
《智能驾驶之激光雷达算法详解》4、LiDAR-Camera 的外参标定
新能源储能设计 | 动力电池管理系统BMS有哪些安全管理功能?
好书共读——《硬件设计指南:从器件认知到手机基带设计》_第四、五、六部分
要给产品加AI功能,成本似乎高了不少
新能源汽车电池管理系统(BMS)中的传感器应用
电磁干扰的烦恼
相约秋色~相约北京~恩智浦工业和物联网技术峰会 约起来!
2024年10月11日(周五),恩智浦诚邀您相聚北京,来参与“恩智浦工业和物联网技术峰会”,洞见技术发展趋势,共促未来市场发展!
预报从速,好礼等您拿~
查看 »
有奖活动|英飞凌新品情报站:最新 5V XENSIVTM PAS CO2 传感器 知识挑战赛
申请时间:即日起-10月8日
活动奖励:充电宝、螺丝刀套装、散热架、蓝牙耳机、按摩仪、手环
查看 »
泰科电子工业事业部邀您云逛展
打破时间、空间的限制,TE Connectivity 线上工博会为您带来沉浸式VR观展体验
查看 »
有奖直播 | 基于数字孪生的软件工具,助力射频子系统验证
直播时间:9月27日(周五)下午14:00
参与福利:电动牙刷、蓝牙耳机、双肩包、《微波器件测量手册》、《ADS信号完整性仿真与实战》
查看 »
Microchip 有奖直播报名中
直播主题:Microchip mSiC™ 产品及其在电动出行中的典型应用方案
直播时间:2024年9月24日(星期二)上午10:30-11:30
查看 »
免费申请 | MPS MIE 系列隔离式稳压 DCDC 模块!
诚邀您按实际情况填写申请!MPS 对申请信息进行审核,为通过申请的网友发送样品。(每人最多5片)
拿到样片的网友可参加第三期评测活动哦!奖品多多~快来申请免费模块吧!
查看 »
报名直播有好礼~ADI & WT ·世健 MCU 痛点问题探索季
前阵子,我们收集到了很多来自一线工程师反馈的MCU应用难题 9月19日上午10:00 ADI技术专家将在直播间一一答疑解惑,剖析、攻克这些痛点
查看 »
英飞凌有奖直播报名中!
直播时间:9月25日(周三)下午14:00
直播主题:基于英飞凌AIROC™ CYW20829低功耗蓝牙芯片的无线组网解决方案
查看 »
有奖直播:英飞凌新型SSI系列固态隔离器的创新技术与应用设计
直播时间:9月26日(周四)上午10:00
直播福利:露营车、双肩包、保温杯
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
关闭
站长推荐
1
/10
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
平头哥RISC-V活动专区
ADI · 世健工业技术
电子技术交流
嵌入式系统
单片机
国产芯片交流
电机驱动控制
FPGA/CPLD
模拟电子
电源技术
PCB技术
RF/无线
传感器
综合技术交流
下载中心专版
大学堂专版
测评中心专版
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
行业应用
汽车电子
移动便携
医疗电子
工控电子
安防电子
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛