数码之家

 找回密码
 立即注册
搜索
查看: 3888|回复: 12

esp12+TM1637网络授时时钟代码问题

[复制链接]
发表于 2020-12-3 10:13:07 | 显示全部楼层 |阅读模式
小白偶得的ESP12E,加了一个TM16374位数码管,想做个WIFI时钟,于是就在网上找了大量的例程,终于找到一个可以用的,但是,发现一个问题,就是小时为两位数时显是正常,一位时(1-9点)就不正常了,如7:25显示为7250,是不是补0位补错了,请大神指点一下该修改哪里,跪谢了!
这是代码,如有侵权,回复马上删。



//8266NODEMCU 连接TM1637四位数码管,从NTP服务器获取时间并显示
//  TM1637       8266 NODEMCU
//  CLK          IO12
//  DIO          IO14

#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>
#include <TM1637TinyDisplay.h>

// Define Digital Pins
#define CLK 12
#define DIO 14
// Initialize TM1637TinyDisplay
TM1637TinyDisplay display(CLK, DIO);
const char *ssid     = "suchongap";
const char *password = "suchongshiye";
int i=59;
WiFiUDP ntpUDP;
//NTPClient timeClient(ntpUDP);
NTPClient timeClient(ntpUDP, "ntp1.aliyun.com",60*60*8, 30*60*1000);

void setup(){
  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
display.setBrightness(BRIGHT_7);
  timeClient.begin();
}
String time1="";
void loop() {
//  timeClient.update();
  if((i+1)%60==0){
    Serial.println("ok");
    timeClient.update();
   time1=timeClient.getFormattedTime();
   i=getValue(time1,':',2).toInt();
  }
//  Serial.println(timeClient.getFormattedTime());
  Serial.println(i);
  Serial.println(time1);
  String part01 = getValue(time1,':',0);
  String part02 = getValue(time1,':',1);
  float timenumb=part01.toFloat()+part02.toFloat()/100.0;  
  if(i%2==0){
  display.showNumber(timenumb);}
  else{display.showNumber(timenumb*100);}
  i++;
  delay(1000);
}

// 使用指定字符 切割字符串
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length()-1;

  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
        found++;
        strIndex[0] = strIndex[1]+1;
        strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }

  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

发表于 2020-12-3 17:20:02 | 显示全部楼层
时间字串,补够 位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-3 17:38:58 | 显示全部楼层
devcang 发表于 2020-12-3 17:20
时间字串,补够 位

我真的是小白,能标注一下吗?谢谢了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-3 18:24:29 | 显示全部楼层
devcang 发表于 2020-12-3 17:20
时间字串,补够 位

刚才摸索着调整了一下,明天看下是否正常。另外问一下,如果要加入调整数码管亮度的代码好做吗?
回复 支持 反对

使用道具 举报

发表于 2020-12-3 18:33:43 | 显示全部楼层
display.showNumber(timenumb);}
主要是这个函数吧,是把时间当一个四位整数显示,除100,就是显示中间的秒点了
要看这个函数里面三位整数是怎么处理的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 07:43:10 | 显示全部楼层
akikyoua 发表于 2020-12-3 18:33
display.showNumber(timenumb);}
主要是这个函数吧,是把时间当一个四位整数显示,除100,就是显示中间的秒 ...

先谢谢,这个不是不显是秒点,是零位应该补到左边,现 在在右边,比如:7:25应该 是07:25,现在却显示为7250了。时位为两位数时(10-23点)显示正常,比如:12:08显示就正常的
回复 支持 反对

使用道具 举报

发表于 2020-12-4 10:21:53 | 显示全部楼层
longjunling 发表于 2020-12-3 18:24
刚才摸索着调整了一下,明天看下是否正常。另外问一下,如果要加入调整数码管亮度的代码好做吗? ...

使用是现成的库,应该有函数调节,,看看 TM1637TinyDisplay.h 头文件


像另一个库,就有这样的函数
    void set(uint8_t = BRIGHT_TYPICAL,uint8_t = 0x40,uint8_t = 0xc0);//To take effect the next time it displays.

回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 12:34:35 | 显示全部楼层
devcang 发表于 2020-12-4 10:21
使用是现成的库,应该有函数调节,,看看 TM1637TinyDisplay.h 头文件

真正的小白鼠一个,能不能明示一下,这个真的是看不太懂,就是想做个WIFI授时的时钟,本想有现成的搬过来就可以了,没有预料到会碰到这个问题。万分感谢!!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 12:37:10 | 显示全部楼层
devcang 发表于 2020-12-4 10:21
使用是现成的库,应该有函数调节,,看看 TM1637TinyDisplay.h 头文件

也看了其它的时钟代码,和这个有太大的区别,不能移植,但时其他的代码试了又不能用。所以求大侠帮忙看看
回复 支持 反对

使用道具 举报

发表于 2020-12-6 22:12:25 | 显示全部楼层
https://blog.csdn.net/xiaotuwai8/article/details/109958741

本来想改一下,后来发现有现成的,楼主试一下这个代码,时间是四个数字分别显示,不会出现三位数错位末尾补0的情况
tm1637.display(0,(part01.toInt()/10));
tm1637.display(1,(part01.toInt()%10));
tm1637.display(2,(part02.toInt()/10));
tm1637.display(3,(part02.toInt()%10));
这要是这段代码
回复 支持 反对

使用道具 举报

发表于 2020-12-10 11:45:42 | 显示全部楼层
NTP.h

#ifndef NTP_H_
#define NTP_H_


#include <ESP8266WiFi.h>
#include <ESPAsyncUDP.h>
#include <TimeLib.h>


#define NTP_PACKET_SIZE 48 // NTP time is in the first 48 bytes of message


struct deviceUptime {
        long days;
        long hours;
        long mins;
        long secs;
};


class NtpClient {
public:


        void ICACHE_FLASH_ATTR Ntp(const char * server, int8_t tz, time_t syncSecs);
        ICACHE_FLASH_ATTR virtual ~NtpClient();


        static char * TimeServerName;
        static IPAddress timeServer;
        static int8_t timezone;
        static time_t syncInterval;


        static AsyncUDP udpListener;


        static byte NTPpacket[NTP_PACKET_SIZE];


        static ICACHE_FLASH_ATTR String iso8601DateTime();
        static ICACHE_FLASH_ATTR deviceUptime getDeviceUptime();
        static ICACHE_FLASH_ATTR String getDeviceUptimeString();
        static ICACHE_FLASH_ATTR time_t getUtcTimeNow();
        bool ICACHE_FLASH_ATTR processTime();
        time_t getUptimeSec();


private:
        static ICACHE_FLASH_ATTR String zeroPaddedIntVal(int val);
        static ICACHE_FLASH_ATTR time_t getNtpTime();


protected:
        time_t _uptimesec = 0;
};


#endif /* NTP_H_ */





NTP.cpp


#include "Ntp.h"
#include <ESPAsyncUDP.h>




char * NtpClient::TimeServerName;
int8_t NtpClient::timezone;
time_t NtpClient::syncInterval;
IPAddress NtpClient::timeServer;


AsyncUDP NtpClient::udpListener;


byte NtpClient::NTPpacket[NTP_PACKET_SIZE];


void ICACHE_FLASH_ATTR NtpClient::Ntp(const char * server, int8_t tz, time_t syncSecs) {
        TimeServerName = strdup(server);
        timezone = tz;
        syncInterval = syncSecs;
        WiFi.hostByName(TimeServerName, timeServer);
        setSyncProvider(getNtpTime);
        setSyncInterval(syncInterval);
}




ICACHE_FLASH_ATTR NtpClient::~NtpClient() {
        udpListener.close();
}


// send an NTP request to the time server at the given address
time_t ICACHE_FLASH_ATTR NtpClient::getNtpTime() {
        memset(NTPpacket, 0, sizeof(NTPpacket));
        NTPpacket[0] = 0b11100011;
        NTPpacket[1] = 0;
        NTPpacket[2] = 6;
        NTPpacket[3] = 0xEC;
        NTPpacket[12] = 49;
        NTPpacket[13] = 0x4E;
        NTPpacket[14] = 49;
        NTPpacket[15] = 52;
        if (udpListener.connect(timeServer, 123)) {
                udpListener.onPacket([](AsyncUDPPacket packet) {
                        unsigned long highWord = word(packet.data()[40], packet.data()[41]);
                        unsigned long lowWord = word(packet.data()[42], packet.data()[43]);
                        time_t UnixUTCtime = (highWord << 16 | lowWord) - 2208988800UL;
                        setTime(UnixUTCtime);
                });
        }
        else {


        }
        udpListener.write(NTPpacket, sizeof(NTPpacket));
        // ugly
        return 0;
}


bool ICACHE_FLASH_ATTR NtpClient::processTime() {


        timeStatus_t ts = timeStatus();


        switch (ts) {
        case timeNeedsSync:
                return false;
                break;
        case timeSet:
                return true;
                break;
        default:
                return false;
        }
}


String ICACHE_FLASH_ATTR NtpClient::zeroPaddedIntVal(int val) {
        if (val < 10)
                return "0" + String(val);
        else
                return String(val);
}


//returns the current date/time as a string in iso8601 format
String ICACHE_FLASH_ATTR NtpClient::iso8601DateTime() {


        String hyphen = "-";
        String colon = ":";


        return        String(year()) + hyphen +
                zeroPaddedIntVal(month()) + hyphen +
                zeroPaddedIntVal(day()) + "T" +
                zeroPaddedIntVal(hour()) + colon +
                zeroPaddedIntVal(minute()) + colon +
                zeroPaddedIntVal(second()) +
                (timezone == 0 ? "Z" : String(timezone));
}


time_t NtpClient::getUptimeSec() {
        _uptimesec = _uptimesec + (millis () - _uptimesec);
        return _uptimesec / 1000;
}


deviceUptime ICACHE_FLASH_ATTR NtpClient::getDeviceUptime() {


        unsigned long currentmillis = millis();


        deviceUptime uptime;
        uptime.secs  = (long)((currentmillis / 1000) % 60);
        uptime.mins  = (long)((currentmillis / 60000) % 60);
        uptime.hours = (long)((currentmillis / 3600000) % 24);
        uptime.days  = (long)((currentmillis / 86400000) % 10);


        return uptime;


}


String ICACHE_FLASH_ATTR NtpClient::getDeviceUptimeString() {


        deviceUptime uptime = getDeviceUptime();


        return        String(uptime.days) + " days, " +
                String(uptime.hours) + " hours, " +
                String(uptime.mins) + " mins, " +
                String(uptime.secs) + " secs";


}


/*
* returns the current time as UTC (timezone offset removed)
*/
ICACHE_FLASH_ATTR time_t NtpClient::getUtcTimeNow() {


        return now() - timezone;


}



回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-17 10:24:45 | 显示全部楼层
akikyoua 发表于 2020-12-6 22:12
https://blog.csdn.net/xiaotuwai8/article/details/109958741

本来想改一下,后来发现有现成的,楼主试一 ...

谢谢,我也找到了其他代码,能用手 机配网的,感觉更方便些
回复 支持 反对

使用道具 举报

发表于 2021-7-9 00:07:54 来自手机浏览器 | 显示全部楼层
longjunling 发表于 2021-1-17 10:24
谢谢,我也找到了其他代码,能用手 机配网的,感觉更方便些

有编译好的文件吗?放出来玩玩
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 14:17 , Processed in 0.218401 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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