数码之家

 找回密码
 立即注册
搜索
查看: 8741|回复: 21

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

[复制链接]
发表于 2019-9-13 13:43:49 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
本帖最后由 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行

r1.jpg
w1.jpg
D1_D1.jpg
D1_d_coin.jpg
  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. }
复制代码




Mini NTPCLock.rar

12.81 KB, 下载次数: 41, 下载积分: 家元 -55

mini NTP时钟源码和库

打赏

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

查看全部打赏

发表于 2019-9-13 15:23:44 | 显示全部楼层
学习,收藏了,谢谢分享!
回复 支持 反对

使用道具 举报

发表于 2019-9-23 16:01:05 | 显示全部楼层
发现用8266 ntp会慢2秒不知道为什么
回复 支持 反对

使用道具 举报

 楼主| 发表于 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-4 19:23:55 | 显示全部楼层
能出个和tcp共存的源码么
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-1-13 10:37:01 | 显示全部楼层
PCB板有文件不?
回复 支持 反对

使用道具 举报

发表于 2020-2-8 11:10:16 | 显示全部楼层
下载学习一下
回复 支持 反对

使用道具 举报

发表于 2020-2-11 16:16:38 | 显示全部楼层
谢谢分享。。。。。折腾的不错。。。。收藏备用。。。。
回复 支持 反对

使用道具 举报

发表于 2021-7-22 18:30:45 | 显示全部楼层
真的很棒 学习力:lol::lol::lol::lol::lol::lol:
回复 支持 反对

使用道具 举报

发表于 2021-9-9 16:28:29 | 显示全部楼层
这个<NTPClient.h>库的函数说明去哪里可以找到?
没有说明不会用啊
回复 支持 反对

使用道具 举报

发表于 2021-9-9 23:38:25 | 显示全部楼层
彭大伟 发表于 2021-9-9 16:28
这个库的函数说明去哪里可以找到?
没有说明不会用啊

在库文件夹里面有readme文档,里面提供了开源的地址和简单说明,详细可以去github看
# NTPClient

[![Build Status](https://travis-ci.org/arduino-li ... t.svg?branch=master)](https://travis-ci.org/arduino-libraries/NTPClient)

Connect to a NTP server, here is how:

```cpp
#include <NTPClient.h>
// change next line to use with another board/shield
#include <ESP8266WiFi.h>
//#include <WiFi.h> // for WiFi shield
//#include <WiFi101.h> // for WiFi 101 shield or MKR1000
#include <WiFiUdp.h>

const char *ssid     = "<SSID>";
const char *password = "<PASSWORD>";

WiFiUDP ntpUDP;

// By default 'pool.ntp.org' is used with 60 seconds update interval and
// no offset
NTPClient timeClient(ntpUDP);

// You can specify the time server pool and the offset, (in seconds)
// additionaly you can specify the update interval (in milliseconds).
// NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);

void setup(){
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();

  Serial.println(timeClient.getFormattedTime());

  delay(1000);
}
```
回复 支持 反对

使用道具 举报

发表于 2021-9-30 17:58:12 | 显示全部楼层
修改了一下代码:增加定时器,用定时器操作中间两个点闪烁,原贴中代码数码管显示有抖动,仔细看能看出。增加热插拔功能,LED模块可以带电插拔。原贴拔下数码管再装上不能恢复显示。调整了数码管亮度为最低,夜间看时间对眼睛更友好。另外时钟和数据引脚也给更换了,对我的小板来说能够pin对pin,楼主的板子需要改一下配置才能用。
源码:
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <TM1650.h>
#include <Ticker.h>
TM1650 d;
Ticker T;
//填入要连接的路由器的SSID和密码
const char *ssid     = "divaip";//
const char *password = "1a2s3d4f5g6h7j8k9l";//
WiFiUDP ntpUDP;
//时区北京时间,每隔10分钟同步时间stdtime.gov.hk(香港天文台服务器,快),cn.pool.ntp.org
NTPClient timeClient(ntpUDP, "stdtime.gov.hk", 8*3600, 10*60*1000);
int time_h=0,time_m=0;
String time_str="";
char time_show[]="    ";
char dian=0;
char liang = 0;
void setd(){
  if(dian == 0)
    dian = 1;
  else
    dian = 0;
}
void setup(){
    Serial.begin(115200);
    Wire.begin(14,12); //SDA-14,SCL-12 接TM1650 SDA,SCL
    d.init();                       //显示初始化
    d.setBrightnessGradually(2);    //默认亮度设置
    d.displayString("boot");        //上电显示内容
    WiFi.begin(ssid, password);     //wifi 初始化
    while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
    T.attach_ms(500,setd);
  }
     timeClient.begin();
}
void loop() {
           if(timeClient.update()){
            time_h = timeClient.getHours();
            time_m = timeClient.getMinutes();
            time_str=Num2Str(time_h)+Num2Str(time_m);
            strcpy(time_show,time_str.c_str());
            if(dian == 0)
            {
                d.setDot(1,true);
            }
            else{
                d.displayString(time_show);
                d.displayOn ();
            }
             Serial.println(timeClient.getFormattedTime());
           }
           else
           {d.displayString("-SN-"); d.setDot(1,false);}//
}
//数字首位补零
String Num2Str(int num) {
  if (num<10) { return "0" + String(num);} else { return String(num);}
}
回复 支持 反对

使用道具 举报

发表于 2022-8-10 21:24:35 | 显示全部楼层
上传之后为什么总是显示一下时间就立即变成-SN-?
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-12 08:44:27 | 显示全部楼层
厉害   厉害  真佩服你们这群爱折腾人事
回复 支持 1 反对 0

使用道具 举报

发表于 2022-8-12 09:56:22 | 显示全部楼层
!timeClient.update()就可以了。
timeClient.update()输出为0

大家的iftimeClient.update()难道是1 吗???
回复 支持 反对

使用道具 举报

发表于 2022-8-12 10:33:13 | 显示全部楼层
好东西必须收藏,备用。
回复 支持 反对

使用道具 举报

发表于 2022-8-13 09:46:08 | 显示全部楼层
网络用来同步,平时没有网络照样要走
回复 支持 反对

使用道具 举报

发表于 2022-9-15 13:43:44 | 显示全部楼层
大神,有原理图就完美了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-28 18:04 , Processed in 0.187200 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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