/ / Arduino saute deuxième horloge - c, arduino

Arduino saute deuxième horloge - c, arduino

Fondamentalement, j'écris un simple code pour incrémenter toutes les secondes et afficher l'heure et la date, ce qui me frustre, et je suis sûr que j'oublie quelque chose d'évident.

Donc, je vais afficher l'heure sous la forme MJD (Modified Julian Date) HH: MM: SS mais aussi permettre à un MJD codé en dur de représenter un second événement bissextile, puis d'afficher correctement la seconde du saut.

Ça marche un peu, mais ça passe 23:59:59.

Je planifie éventuellement de porter sur les vieux AVR, donc je ne veux pas vraiment gâcher les bibliothèques 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);
}

Réponses:

4 pour la réponse № 1

Je pense que vous pourriez avoir besoin d'un très petit changement:

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

Le problème semble être que vous augmentez à la prochain deuxièmement, et ensuite, si 23:59:59 et une seconde bissextile est indiquée, vous augmentez à nouveau à 60 (en sautant 59).

Ce que vous voulez probablement faire, c'est survoler le second sauf si c'est une seconde de saut.


0 pour la réponse № 2

Vous incrémentez le second trop souvent lorsque le temps est écoulé: 23: 59: 58. Vous entrez la fonction, incrémentez les secondes, et puis la second == 59 le test est aussi vrai - alors vous incrémentez second encore:

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

Je ne sais pas à quoi ressemblerait le remaniement le plus propre, mais vous ne voulez jamais augmenter second une fois que par itération de boucle.