Arduino闰秒钟

时间:2012-02-06 23:37:13

标签: c arduino

基本上我正在编写一段简单的代码来每秒递增一次并显示时间和日期,这让我感到很沮丧,而且我确信我忽略了一些显而易见的事情。

所以我将时间显示为MJD(修改过的朱利安日期)HH:MM:SS但也允许硬编码的MJD表示闰秒事件,然后正确显示闰秒。

它有点奏效,但它跳过了23:59:59。

我最终计划移植到普通的旧AVR,所以我真的不想乱用arduino库。

int second = 0, minute = 0, hour = 0;
long mjd = 55000;
long leap = 55964;

void setup()
{
    Serial.begin(9600);
    Serial.print("MDJ ");
    Serial.print(mjd);
    Serial.print(" ");
    Serial.print(hour);
    Serial.print(":");
    Serial.print(minute);
    Serial.print(":");
    Serial.println(second);

}

void loop()
{
    second++;
    if (mjd == leap && hour == 23 && minute == 59 && second == 59) {
        second++;
    } else {
        if (second > 59) {
            minute++;
            second = 0; // reset seconds to zero
        }
    }
    if (minute > 59) {
        hour++;
        minute = 0;
    }

    if (hour > 23) {
        mjd++;
        hour = 0;
    }

    Serial.print("MDJ ");
    Serial.print(mjd);
    Serial.print(" ");
    if (hour < 10)
        Serial.print("0");
    Serial.print(hour);
    Serial.print(":");
    if (minute < 10)
        Serial.print("0");
    Serial.print(minute);
    Serial.print(":");
    if (second < 10)
        Serial.print("0");
    Serial.println(second);
    delay(1000);
}

2 个答案:

答案 0 :(得分:5)

我认为你可能只需要一个很小的改变:

if (mjd == leap && hour == 23 && minute == 59 && second == 60) {
    // allow 23:59:60
} else {
    ...

问题似乎是你增加到 next 秒,然后如果它是23:59:59并且指示了闰秒,你再次增加到60(跳过59)。< / p>

您可能想要做的就是滚动第二个,除非是闰秒。

答案 1 :(得分:0)

当时间领先时,你将第二个增加太多次:23:59:58。您输入函数,增加秒数,然后 second == 59测试为真 - 然后再次增加second

second++;
if (mjd == leap && hour == 23 && minute == 59 && second == 59) {
    second++;

我不知道什么是最干净的重新工作,但你只想在每次循环迭代时增加second 一次