数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 11679|回复: 21

[Arduino] ESP8266+tm1650+48行arduino代码 制作迷你数码管NTP时钟(开源带库)

[复制链接]
发表于 2019-9-13 13:43:49 | 显示全部楼层 |阅读模式
本帖最后由 zljcat 于 2019-9-13 13:52 编辑

用esp8266 mini D1 开发板作为基础平台, 做一个NTP校时的迷你数码管时钟。原来想用一个成品Tm1650显示模块做,但不想用导线连接,已有的模块用起来不够利索,没有做到合适的,后来干脆自己画块板
自己画的这个板与mini d1开发板差不多大小,可以通过排针排座连接在一起,由于面积确实小,只能刚好用0.36的4位数码管,这个尺寸的数码有一点不好,
没有即有带4个小数点和时钟点的数码管0.36共阴的数码管只找到红色,白色2种,要想用其它颜色得用共阳的才有


开发环境为 arduino IDE 1.8.5 for ESP8266
代码很简单,只有48行肯定要用到库了,除自带库 用到了tm1650驱动库,NTPClient 2个库,这个两个库都可以在IDE库管理中找到
这个两个库都很简洁,有兴趣可以研究一下,实现更多功能

校时是初次上电校时,然后就按设定的时间间隔校一次,具体过程可以看一下NTPClient ,而计时是NTPClient 库中使用millis()时差实现
所以只要获取时分数据显示出来即可,loop中只负责跳秒点和刷新显示


只要连上了wfii,名称和密码不变,上电就自动连接NTP服务器校时,自动定时更新


基本功能有注释,这个只是一个框架代码,还有更大的发挥空间,比如加几行引用一个wifimanager库就可以实现ap配网了,可能除掉注释也不会超过50行





  1. #include <NTPClient.h>
  2. #include <ESP8266WiFi.h>
  3. #include <WiFiUdp.h>
  4. #include <Wire.h>
  5. #include <TM1650.h>
  6. TM1650 d;
  7. //填入要连接的路由器的SSID和密码
  8. const char *ssid     = "<SSID>";//
  9. const char *password = "<PASSWORD>";//
  10. WiFiUDP ntpUDP;
  11. //时区北京时间,每隔10分钟同步时间stdtime.gov.hk(香港天文台服务器,快),cn.pool.ntp.org
  12. NTPClient timeClient(ntpUDP, "stdtime.gov.hk", 8*3600, 10*60*1000);
  13. int time_h=0,time_m=0;
  14. String time_str="";
  15. char time_show[]="    ";
  16. void setup(){
  17.     Serial.begin(115200);
  18.     Wire.begin(12,14); //SDA-12,SCL-14 接TM1650 SDA,SCL
  19.     d.init();
  20.     d.setBrightnessGradually(5);
  21.     d.displayString("boot");
  22.     WiFi.begin(ssid, password);
  23.     while ( WiFi.status() != WL_CONNECTED ) {
  24.     delay ( 500 );
  25.     Serial.print ( "." );
  26.   }
  27.     timeClient.begin();
  28. }
  29. void loop() {
  30.            if(timeClient.update()){
  31.             time_h = timeClient.getHours();
  32.             time_m = timeClient.getMinutes();
  33.             time_str=Num2Str(time_h)+Num2Str(time_m);
  34.             strcpy(time_show,time_str.c_str());
  35.             d.displayString(time_show);
  36.             d.setDot(1,true);
  37.               delay(500);
  38.             d.setDot(1,false);
  39.              delay(500);
  40.              Serial.println(timeClient.getFormattedTime());
  41.            }
  42.            else
  43.            {d.displayString("-SN-"); d.setDot(1,false);}//
  44. }
  45. //数字首位补零
  46. String Num2Str(int num) {
  47.   if (num<10) { return "0" + String(num);} else { return String(num);}
  48. }
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 3家元 +60 收起 理由
温力口 + 20 谢谢分享。。。。。折腾的不错。。。。.
lemontreenm + 20 優秀文章
不长叶子的树 + 20

查看全部打赏

 楼主| 发表于 2019-9-23 17:07:29 | 显示全部楼层
yygcom 发表于 2019-9-23 16:01
发现用8266 ntp会慢2秒不知道为什么

如果用esp8266直接驱动方式的时钟,用NTP校时的例程一般都只是校到秒没有处理毫秒部分,都会比标准时间慢,运气好,NTP毫秒部分小于200ms基本上看不出差别
另外看你的参考标准时间是什么,百度出来的网页版的NTP时间也是校到秒,有时也会慢半拍,香港天文台的网页NTP时间秒基本同步
可以下载个clocksync安卓版,这个显示的时间与标准时间秒同步
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-23 17:13:26 | 显示全部楼层
yygcom 发表于 2019-9-23 16:01
发现用8266 ntp会慢2秒不知道为什么

检查一下程序,从开始校时到校时完成所需要的时间,看是否在这个过程耗时大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-5 16:37:49 | 显示全部楼层
Never。 发表于 2019-10-4 19:23
能出个和tcp共存的源码么

tcp方式校时?
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-20 08:06 , Processed in 0.234001 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表