/ / Arduino przeskakuje drugi zegar - c, arduino

Arduino przeskakuje drugi zegar - c, arduino

Zasadniczo piszę prosty fragment kodu, który zwiększam co sekundę i wyświetlam godzinę i datę, co mnie frustruje i jestem pewien, że przeoczyłem coś oczywistego.

Tak więc wyświetlam czas jako MJD (zmodyfikowana data juliańska) HH: MM: SS, ale także pozwalam na zakodowanie MJD na drugim etapie, a następnie poprawne wyświetlenie sekundy przestępnej.

To rodzaj utworów, ale pomija 23:59:59.

W końcu planuję przeniesienie do zwykłego starego AVR, więc naprawdę nie chcę mieć problemów z bibliotekami 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);
}

Odpowiedzi:

4 dla odpowiedzi № 1

Myślę, że możesz potrzebować tylko bardzo małej zmiany:

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

Problem polega na tym, że zwiększasz wartość do Kolejny po drugie, a następnie, jeśli jest 23:59:59 i wskazana sekunda kroku, zwiększasz ponownie do 60 (pomijając 59).

To, co prawdopodobnie chcesz zrobić, to przenieść na drugą chyba że to sekunda przestępna.


0 dla odpowiedzi nr 2

Inkrementujesz drugi zbyt wiele razy, gdy czas jest prowadzony: 23: 59: 58. Wchodzisz w funkcję, zwiększasz sekundy i następnie temu second == 59 test jest również true - tak więc przyrost second jeszcze raz:

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

Don "t znać co najczystszych ponownie działać będzie wyglądać, ale tylko kiedykolwiek chcesz zwiększyć second po raz na iteracji pętli.