8浏览
查看: 8|回复: 8

[K10教程] 【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟

[复制链接]
【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图1

行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。

主要特点
集成摄像头&内置算法,可进行离线图像检测
集成麦克风&内置算法,可进行离线语音识别
集成扬声器&内置算法,可进行离线语音合成
2.8寸彩色屏幕,数据展示更清晰
集成度高,利于教学
接口丰富,兼容软件多,扩展性好


【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图2

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

行空板K10的网络服务模块,都在这里

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图2

网络服务 NTP 授时积木

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图1c573.jpeg#pic_center)

网络服务 Wi-Fi 相关积木

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图3


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

辅助:屏幕显示相关积木

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

知识点:Wi-Fi

Wi-Fi(无线保真)是一种允许设备通过无线电波连接到互联网的技术。以下是一些关于Wi-Fi的关键知识点:

1、基本概念
无线局域网(WLAN):Wi-Fi 技术基于无线局域网 (WLAN),通过无线电波在有限的区域内传输数据。
频段:常用的 Wi-Fi 频段有2.4GHz 和5GHz,5GHz 频段提供更快的速度,但覆盖范围较小;2.4GHz 频段则覆盖范围较大,但速度相对较慢。

2、主要标准
Wi-Fi 有多个版本,每个版本在速度和覆盖范围上都有不同的性能:
802.11b:2.4GHz 频段,最大传输速度为11 Mbps。
802.11g:2.4GHz 频段,最大传输速度为54 Mbps。
802.11n:2.4GHz 和5GHz 频段,最大传输速度为600 Mbps。
802.11ac:5GHz 频段,最大传输速度可达到1Gbps 以上。
802.11ax(Wi-Fi 6):2.4GHz 和5GHz 频段,支持更高的速度和更大的设备连接数。

3、Wi-Fi 的工作原理
接入点(AP):Wi-Fi 网络的核心组件,用于发送和接收无线信号,通常为路由器。
客户端设备:例如智能手机、电脑、平板电脑等,通过无线网络适配器连接到接入点。
数据传输:无线电波在接入点和客户端设备之间传输数据,通过SSID(服务集标识符)和安全协议(如 WPA2)进行连接和加密。

4、安全与加密
WEP:一种较早的加密标准,安全性较低,易被破解。
WPA/WPA2:较新的加密标准,WPA2 是目前广泛使用的加密协议,安全性更高。
WPA3:最新的加密协议,提供更强大的安全性和易用性。

5、Wi-Fi 的应用
Wi-Fi 广泛应用于家庭、办公、公共场所等环境,提供无线互联网连接:
家庭网络:用于连接智能家居设备、智能电视等。
办公网络:用于企业内部的无线连接,提高办公效率。
公共热点:例如咖啡店、机场等,为用户提供免费或付费的无线连接服务。

6、常见问题与解决方法
信号弱:检查路由器位置,避免放置在金属物品或墙壁后面,可以使用Wi-Fi中继器或Mesh网络增强信号。
连接不稳定:检查是否有设备过多,导致网络拥堵,尝试重启路由器或更换频段。
慢速:确保路由器和设备支持最新的Wi-Fi标准,检查是否有网络干扰或带宽被占用。

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

知识点:NTP网络授时

NTP 即网络时间协议(Network Time Protocol),是一种用于在计算机网络中同步时钟的协议,以下从主要特点、工作原理、应用场景等方面进行详细介绍:

1、定义与基本信息
NTP 属于应用层协议,基于 UDP(用户数据报协议)传输,使用 UDP 端口号 123。它的设计目标是使网络中的各个计算机保持时间同步,将所有计算机的时间同步到一个统一的时间基准上,其时间精度在局域网内可达亚毫秒级,在广域网中通常能达到几十毫秒的精度。

2、主要特点
高精度:通过复杂的算法和同步机制,NTP 能够实现较高的时间同步精度,满足大多数网络应用对时间准确性的要求。
稳定性:具有良好的稳定性,能够在不同的网络环境和系统负载下保持时间同步的可靠性,确保时间信息的准确传递和系统的稳定运行。
分层架构:采用分层的时间同步体系,将时间服务器组织成不同的层级,形成一个树形结构。顶层是权威时间源,如原子钟或 GPS 时钟,底层是普通的客户端。这种架构使得 NTP 能够适应大规模的网络环境,实现高效的时间同步。
可扩展性:协议具有良好的可扩展性,能够方便地添加新的功能和特性,以适应不断变化的网络需求和技术发展。

3、工作原理
NTP 客户端向 NTP 服务器发送时间请求报文,服务器接收到请求后,会在报文中填入当前的时间戳并返回给客户端。客户端根据接收到的时间戳和本地时间计算出时间偏移量,从而调整本地时钟。为了提高精度,NTP 还会考虑网络延迟等因素,采用多种算法对时间进行校准。

4、应用场景
金融领域:在银行系统、证券交易等金融业务中,时间的准确性至关重要。如股票交易的时间戳用于记录交易顺序和确定交易价格,时间不同步可能导致交易记录混乱、价格不一致等问题,影响市场的公平性和稳定性。
电信行业:通信网络中的各种设备需要精确的时间同步来保证信号的传输、交换和处理的准确性。如在 CDMA、GSM 等移动通信系统中,基站之间需要精确同步,以避免信号干扰,确保用户通话质量和数据传输的稳定性。
分布式系统:在云计算、大数据处理等分布式系统中,多个节点之间需要进行协同工作,时间同步能够保证数据的一致性和操作的顺序性。如分布式数据库中的事务处理,需要准确的时间戳来确保数据的更新顺序正确,避免数据冲突和不一致。
工业自动化:在工业生产过程中,各种自动化设备和控制系统需要精确的时间同步,以实现生产流程的协调和监控。如汽车制造生产线中的机器人操作、流水线的启停控制等,时间同步能够保证生产过程的准确性和高效性,提高产品质量和生产效率。

5、需要注意的事项
网络延迟:网络延迟可能会对时间同步的精度产生影响,在跨广域网进行时间同步时,需要考虑网络延迟的变化,采用合适的算法进行补偿。
服务器可靠性:NTP 服务器的可靠性直接影响时间同步的效果,应选择可靠的 NTP 服务器,并建立备份服务器,以防止单点故障。
安全问题:NTP 通信可能会受到网络攻击,如时间欺骗、拒绝服务攻击等,需要采取相应的安全措施,如使用认证机制、加密传输等,以确保时间同步的安全性和准确性。

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

【花雕动手做】行空板K10系列实验之网络服务NTP授时动态圆形挂钟
实验开源代码

  1. // 引入WiFi物联网库,用于连接无线网络、支撑NTP网络授时
  2. #include <DFRobot_Iot.h>
  3. // 行空板K10核心驱动库,提供画布、画线、画圆、文字等图形绘制接口
  4. #include "unihiker_k10.h"
  5. // NTP网络授时库,同步互联网标准北京时间,获取时、分、秒、日期
  6. #include <MPython_NtpTime.h>
  7. // 全局浮点变量,volatile防止编译器优化,存储钟表绘图计算用角度偏移值、时分秒数值
  8. volatile float mind_n_h, mind_n_m, mind_n_s, mind_n_a, mind_n_b, mind_n_i, mind_n_j;
  9. // 自定义绘图函数声明,提前告知编译器后续定义的四个钟表绘制函数
  10. void DF_HuaShiZhen();    // 绘制时针
  11. void DF_HuaMiaoZhen();   // 绘制秒针
  12. void DF_HuaFenZhen();    // 绘制分针
  13. void DF_HuaBiaoPan();    // 绘制钟表表盘外圈、刻度、中心圆点
  14. // 实例化WiFi联网对象
  15. DFRobot_Iot     myIot;
  16. // 实例化网络时间同步对象
  17. MPython_NtpTime ntptime;
  18. // 实例化行空板K10主控操作对象
  19. UNIHIKER_K10    k10;
  20. // 设置屏幕旋转方向参数2
  21. uint8_t         screen_dir=2;
  22. // 上电初始化函数,仅执行一次
  23. void setup() {
  24.         k10.begin(); // 初始化K10全部底层硬件资源
  25.         k10.initScreen(screen_dir); // 按设定方向初始化显示屏
  26.         k10.creatCanvas(); // 创建绘图画布,所有图形文字都绘制在画布上
  27.         myIot.wifiConnect("zhz3", "z6156721"); // 连接指定WiFi名称与密码
  28.         while (!myIot.wifiStatus()) {} // 阻塞等待,WiFi连接成功才向下执行
  29.         ntptime.setNtpTime(ntptime.UTCEast8_t, "edu.ntp.org.cn"); // 配置东八区北京时间、国内授时服务器
  30.         k10.setScreenBackground(0xFFFFFF); // 设置屏幕背景为纯白色
  31. }
  32. // 主循环,持续刷新时钟画面
  33. void loop() {
  34.         // 在坐标(75,5)位置、深蓝色、24号中英字体、透明度50、实心模式显示标题“圆形挂钟”
  35.         k10.canvas->canvasText("圆形挂钟", 75, 5, 0x000099, k10.canvas->eCNAndENFont24, 50, true);
  36.         // (45,40)红色字体打印NTP同步的完整日期
  37.         k10.canvas->canvasText(ntptime.getDate(), 45, 40, 0xFF0000, k10.canvas->eCNAndENFont24, 50, true);
  38.         // (45,70)蓝色字体打印NTP同步的时分秒时间
  39.         k10.canvas->canvasText(ntptime.getTime(), 45, 0x0000FF, k10.canvas->eCNAndENFont24, 50, true);
  40.         // 提取网络时间里的小时、分钟、秒存入全局变量,供绘图函数计算指针角度
  41.         mind_n_h = ntptime.localTime(ntptime.Hour);
  42.         mind_n_m = ntptime.localTime(ntptime.Minute);
  43.         mind_n_s = ntptime.localTime(ntptime.Second);
  44.         DF_HuaBiaoPan();   // 第一步:绘制表盘外圈、60秒刻度、12小时刻度、中心圆点
  45.         DF_HuaShiZhen();   // 第二步:绘制时针
  46.         DF_HuaFenZhen();   // 第三步:绘制分针
  47.         DF_HuaMiaoZhen();  // 第四步:绘制秒针
  48.         k10.canvas->updateCanvas(); // 一次性把所有绘制内容刷新到屏幕显示
  49.         delay(500); // 延时500ms,降低刷新频率,减少屏幕闪烁与运算压力
  50. }
  51. // 自定义函数:绘制时针
  52. void DF_HuaShiZhen() {
  53.         k10.canvas->canvasSetLineWidth(6); // 设置时针线条粗细为6像素
  54.         // 时针角度计算:1小时30°,每分钟额外偏移0.5°;三角函数换算屏幕坐标偏移量
  55.         mind_n_a = (40 * (sin((float)((30 * mind_n_h) + (0.5 * mind_n_m)) / 180 * PI)));
  56.         mind_n_b = (40 * (cos((float)((30 * mind_n_h) + (0.5 * mind_n_m)) / 180 * PI)));
  57.         // 从表盘中心点(120,200)画直线到计算出的时针端点,深蓝色
  58.         k10.canvas->canvasLine(120, 200, (120 + mind_n_a), (200 - mind_n_b), 0x000066);
  59. }
  60. // 自定义函数:绘制秒针
  61. void DF_HuaMiaoZhen() {
  62.         k10.canvas->canvasSetLineWidth(2); // 秒针最细,线宽2像素
  63.         // 每秒转动6°,三角函数换算端点偏移
  64.         mind_n_a = (70 * (sin((float)(6 * mind_n_s) / 180 * PI)));
  65.         mind_n_b = (70 * (cos((float)(6 * mind_n_s) / 180 * PI)));
  66.         // 中心点到秒针端点,橙黄色线条
  67.         k10.canvas->canvasLine(120, 200, (120 + mind_n_a), (200 - mind_n_b), 0xFF9900);
  68. }
  69. // 自定义函数:绘制分针
  70. void DF_HuaFenZhen() {
  71.         k10.canvas->canvasSetLineWidth(4); // 分针粗细4像素,介于时针秒针之间
  72.         // 每分钟转动6°,计算坐标偏移
  73.         mind_n_a = (60 * (sin((float)(6 * mind_n_m) / 180 * PI)));
  74.         mind_n_b = (60 * (cos((float)(6 * mind_n_m) / 180 * PI)));
  75.         // 中心点到分针端点,大红色线条
  76.         k10.canvas->canvasLine(120, 200, (120 + mind_n_a), (200 - mind_n_b), 0xFF0000);
  77. }
  78. // 自定义函数:绘制完整表盘(外圆、60个秒刻度、12个时刻度、多层内圈、中心圆点)
  79. void DF_HuaBiaoPan() {
  80.         k10.canvas->canvasSetLineWidth(3); // 外圈大圆线宽3像素
  81.         // 绘制最外层表盘大圆:圆心(120,200),半径82,轮廓蓝色、填充浅青色、实心填充
  82.         k10.canvas->canvasCircle(120, 200, 82, 0x0000FF, 0x00FFFF, true);
  83.         mind_n_i = 0;
  84.         // 循环60次,画出60根秒刻度线(每1秒一根刻度)
  85.         for (int index = 0; index < 60; index++) {
  86.                 mind_n_a = (80 * (sin((float)(6 * mind_n_i) / 180 * PI)));
  87.                 mind_n_b = (80 * (cos((float)(6 * mind_n_i) / 180 * PI)));
  88.                 k10.canvas->canvasLine(120, 200, (120 + mind_n_a), (200 - mind_n_b), 0x0000FF);
  89.                 mind_n_i += 1;
  90.         }
  91.         // 绘制第二层内圈小圆
  92.         k10.canvas->canvasCircle(120, 200, 76, 0x00FFFF, 0x00FFFF, true);
  93.         mind_n_j = 0;
  94.         // 循环12次,画出12根小时刻度(每小时一根长刻度)
  95.         for (int index = 0; index < 12; index++) {
  96.                 mind_n_a = (80 * (sin((float)(30 * mind_n_j) / 180 * PI)));
  97.                 mind_n_b = (80 * (cos((float)(30 * mind_n_j) / 180 * PI)));
  98.                 k10.canvas->canvasLine(120, 200, (120 + mind_n_a), (200 - mind_n_b), 0x0000FF);
  99.                 mind_n_j += 1;
  100.         }
  101.         // 绘制第三层内层小圆
  102.         k10.canvas->canvasCircle(120, 200, 72, 0x00FFFF, 0x00FFFF, true);
  103.         // 表盘中心实心小圆点,固定指针旋转中心
  104.         k10.canvas->canvasCircle(120, 200, 4, 0x0000FF, 0x0000FF, true);
  105. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

代码解读

一、整体功能
行空板 K10 连接 WiFi,通过 NTP 同步北京时间,利用画布绘图函数动态绘制圆形模拟钟表,屏幕同时显示文字日期、数字时间,时针、分针、秒针随实时时间同步转动,每 500ms 刷新一次画面。

二、头文件、全局变量与函数声明
库文件作用
DFRobot_Iot.h:WiFi 联网基础,没有网络无法获取标准时间;
unihiker_k10.h:提供屏幕画布、画圆、画线、自定义字体绘图全套图形接口;
MPython_NtpTime.h:网络授时,提取时、分、秒、完整日期字符串。
volatile float变量说明
volatile关键字防止编译器优化,保证绘图时实时读取数值;
mind_n_h/mind_n_m/mind_n_s:存储网络读取的小时、分钟、秒;
mind_n_a/mind_n_b:通用坐标偏移变量,三角函数计算指针端点位置;
mind_n_i/mind_n_j:循环计数变量,分别用来画 60 个秒刻度、12 个小时刻度。
前置函数声明
提前声明 4 个自定义绘图函数,告诉编译器后续会定义表盘、三针绘制逻辑,避免编译报错。

三、对象实例
myIot:WiFi 连接控制对象
ntptime:NTP 时间同步对象
k10:K10 主板、画布、屏幕控制核心对象
screen_dir=2:设定屏幕旋转角度

四、setup () 上电初始化流程
初始化主板硬件、显示屏、创建绘图画布;
连接指定 WiFi zhz3,密码z6156721;
while (!myIot.wifiStatus()){}阻塞等待,WiFi 连接成功才向下运行,杜绝无网请求时间崩溃;
NTP 配置:东八区北京时间,授时服务器edu.ntp.org.cn;
设置屏幕底色为纯白色。

五、loop () 主循环运行逻辑
1、文字信息打印
坐标 (75,5) 打印标题 “圆形挂钟”;
坐标 (45,40) 红色打印同步好的完整日期;
坐标 (45,70) 蓝色打印时分秒数字时间;
字体统一使用 24 号中英混合字体。
2、提取时间数值
把网络解析出的时、分、秒存入全局变量,供给绘图函数做角度运算。
绘图执行顺序(顺序不能乱)
1)DF_HuaBiaoPan():先画表盘底图、刻度、中心圆点;
2)DF_HuaShiZhen():绘制时针;
3)DF_HuaFenZhen():绘制分针;
4)DF_HuaMiaoZhen():绘制秒针;
图层逻辑:底层表盘→中层时针分针→最上层秒针。
3、画面刷新与延时
updateCanvas()一次性把所有图形渲染到屏幕;delay(500)半秒刷新一次,平衡画面流畅度与设备算力消耗。

六、四大自定义绘图函数核心原理(三角函数极坐标转屏幕直角坐标)
表盘中心点固定坐标 (120,200)
1. DF_HuaBiaoPan () 表盘绘制
外层大圆:半径 82,蓝边浅青填充;
循环 60 次画秒刻度:每秒对应 6°,从圆心向外画短线;
嵌套两层内圈实心浅青色圆;
循环 12 次画小时刻度:每小时间隔 30°;
中心绘制实心小圆点,作为所有指针旋转支点。
2. DF_HuaShiZhen () 时针
线宽 6 像素,深蓝色,长度 40 像素;
角度规则:1 小时 = 30°,额外叠加分钟带来的微小偏移(每分钟 + 0.5°),保证时针缓慢随分钟滑动,不会整点才跳;
公式:总角度 = 30× 小时 + 0.5× 分钟;
利用 sin/cos 把角度换算成 XY 偏移,叠加中心坐标得到指针终点。
3. DF_HuaFenZhen () 分针
线宽 4 像素,红色,长度 60 像素;
角度规则:1 分钟 = 6°;
公式:总角度 = 6× 分钟。
4. DF_HuaMiaoZhen () 秒针
线宽 2 像素(最细),橙黄色,长度 70 像素(最长);
角度规则:1 秒钟 = 6°;
公式:总角度 = 6× 秒数。

七、关键细节要点
屏幕 Y 轴向下递增,所以计算 Y 坐标时用 200 - mind_n_b 实现钟表向上伸展的正常视觉;
线条粗细区分层级:时针粗 > 分针中 > 秒针细;长度:秒针最长、分针次之、时针最短,贴合真实钟表样式;
每次 loop 会重绘整张表盘和指针,旧画面被新画布覆盖,实现指针转动动画;
依赖 WiFi 网络,断网后程序卡在初始化 WiFi 等待环节,无法进入时钟绘制循环。

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

Mind+图形编程

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 1 小时前

【花雕动手做】K10系列实验之网络服务动态圆形挂钟

实验场景图与视频记录

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图2

【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图1


【花雕动手做】K10系列实验之网络服务动态 NTP 圆形挂钟图3
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail