Go Down

Topic: Solved // Datum von gestern ohne Library berechnen (Read 7437 times) previous topic - next topic

jurs


Vielen Dank für den Code, jurs!!


Ich habe nochmal den fehlerhaften Wikipedia-Algorithmus für die Berechnung der Julianischen Tageszahl überprüft und dabei festgestellt: Zumindest zwischen den Jahren 1582 und 2850 rechnet der dort angegebene Algorithmus stets eine um zwei Tage zu hohe Tageszahl aus. Der Algorithmus ist daher korrekt und nur die letzte Konstante ist falsch.

Statt 1721117 muss es im Wikipedia-Algorithmus einfach nur 1721115 heißen, dann passt es.


Ja das wäre super, wenn Du die zweite Umrechnungsfunktion auch noch portieren könntest. Meine portierte Funktion gibt für heute den 09.09.-4017 aus.  =(


Wieso hast Du solche Probleme, den Algorithmus von Wikipedia nach C umzusetzen?

Meine Funktion umgesetzt nach Wikipedia:
Code: [Select]

void calDate(long JD, int &Jahr, int &Monat, int &Tag)
{
  float Z = long(JD + 0.5);
  float g = long((Z - 1867216.25) / 36524.25);
  float A = Z + 1 + g - long(g/4);
  float B = A + 1524;
  float C = long((B-122.1) / 365.25);
  float D = long(365.25 * C);
  float E = long((B-D) / 30.6001);
  Tag = B - D - long(30.6001*E);
  if (E<14)  Monat = E - 1; else Monat = E - 13;
  if (Monat>2)  Jahr = C - 4716; else Jahr = C - 4715;
}


Für einen alternativen Algorithmus ohne die Verwendung von Gleitkommazahlen müßte man mal mit Google suchen, da gibt es sicher auch etwas.

Serenifly

#16
Jul 28, 2014, 03:24 pm Last Edit: Jul 28, 2014, 03:26 pm by Serenifly Reason: 1

Irgendwie hatte ich mir die Unix Timestamp-Lösung deutlich einfacher vorgestellt. In Porgrammiersprachen wie PHP ist das alles nicht so aufwändig, das Datum von gestern auszugeben.  8)

In Standard C/C++ und anderen Sprachen ist das nur einfacher weil die Funktionen zur Konvertierung zwischen Epoche und Kalender Zeit schon implementiert sind. Vielleicht ist die Implementierung da einfacher, aber was gemacht wird, wird vor dir versteckt.

Hier ist z.B. was man alles in C++ auf dem PC machen kann:
http://en.cppreference.com/w/c/chrono

kurti

Hallo,
zwei Lösungen habe ich noch:

1. einfach aktuelles Tagesdatum -1, wenn 0 herauskommt, ist es der Vormonat. Ob machbar, hängt von der nachfolgenden Auswertung ab
2. stelle Deine RTC einfach auf das Datum von gestern. Ob machbar, hängt davon ab, ob das aktuelle Datum auch benötigt wird.

Gruss
Kurti
Zitat Jurs: falsche Verkabelung ist sowieso immer wenig förderlich für das Funktionieren der Hardware



hier könnte Ihre Werbung stehen

-Jan-

Hallo!

Okay, okay, 273 Jahre ist schon ein Wort. Aber ein Problem besteht immer noch. Der Arduino muss über die Nacht an sein, denn sonst verpennt er den Tageswechsel und das gestrige Datum fehlt. Gerade bei der Entwicklung (bei der der Arduino nicht nachts an ist) ist das nicht so gut. Da müsste ich dann jedes mal das Datum neu im EEPROM speichern.

Die Gründe, warum ich keine Library einsetzen möchte hat Rabenauge eigentlich schon genannt. Wenn man keine Library einsetzt und sich selbst eine Funktion schreibt (wenn man nicht zu blöde ist wie ich...  :) ) ist der Lerneffekt größer und man weiß auch, was genau da passiert.

Danke jurs für die zweite Funktion. Das größte Problem hatte ich bei den Variablentypen. Ich war mir nicht sicher ob ich jetzt "long", "float" oder "int" einsetzen muss.

Ja, aber dann muss ich auch Schaltjahre, Jahreswechsel, ... berücksichtigen. Die Uhr kann nicht neu gestellt werden. Die aktuelle Uhrzeit und das Datum werden nämlich auch noch gebraucht.

Das Thema kann somit als  "solved" angesehen werden. Ich möchte mich nochmals recht herzlich bei allen für ihre Hilfe und Ideen bedanken! Finde es echt schön, wie hier auch den Anfängern geholfen wird und diese nicht dumm "angemacht" werden!!

Gruß

Fluffy128

Hallo zusammen!

Ich sitze gerade an einem Projekt mit einer GPS Uhr und möchte auch den Tag berechnen. Dieser wird ja bekanntlich nicht mit dem NMEA Protokoll gesendet.
Ich habe jetzt im Int Format das Jahr, den Monat und den Tag. Nur bekomme ich die hier beschriebene Formel nicht zum laufen weil ich mit dem return Befehl nicht klar komme. Kann mir hier jemand mit meinem Problem helfen?

int Jahr=2014,Monat=8,Tag=15;

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

}

void loop()

{

}

void test()
{
  long test;
  Jahr+=8000;
 
  if(Monat<3)
{
Jahr--; Monat+=12;
}
  return (Jahr*365L) +(Jahr/4) -(Jahr/100) +(Jahr/400) -1200820 +(Monat*153+3)/5-92 +Tag-1;

}
 

Serenifly

Schau dir mal Funktionen generell an:
http://openbook.galileocomputing.de/c_von_a_bis_z/009_c_funktionen_014.htm#mjf226932554e147030a8b6a27568f5620
http://openbook.galileocomputing.de/c_von_a_bis_z/009_c_funktionen_015.htm#mj1ee1b27a557aba80141324548a5e2b65

Eine Funktion die void als Rückgabewert hat kann auch nichts zurückgeben.

Um die Formel zu testen kannst du das auch erst mal in loop() machen. Wenn das da geht, dann lagere es in eine Funktion aus der das Datum als Parameter übergeben wird und die das Ergebnis zurück liefert.

jurs


weil ich mit dem return Befehl nicht klar komme.


Nicht klar?
Du kannst nicht programmieren!

Funktionen sind das, woraus ein C-Programm besteht.
Funktionen können einen sogenannten Rückgabewert haben, oder sie haben den Rückgabewert "void", was für "kein Rückgabewert" steht.

Wenn Du eine Funktion void deklarierst:
Code: [Select]
void test()
dann kann die Funktion natürlich nicht irgendwo mit return eine Zahl als Rückgabewert zurückliefern.

Wenn Du es trotzdem versuchst, dann gibt es Mecker vom Compiler.
Und das zu Recht.

Beispielcode zum Ausrechnen einer Julianischen Tageszahl:
Code: [Select]


long julianDay(int Jahr, int Monat, int Tag) // Rückgabewert dieser Funktion ist "long"
{
  Jahr+=8000;
  if(Monat<3) { Jahr--; Monat+=12; }
  return (Jahr*365L) +(Jahr/4) -(Jahr/100) +(Jahr/400) -1200820 +(Monat*153+3)/5-92 +Tag-1;
}


void setup() {       
  Serial.begin(9600);
  int Jahr=2014, Monat=8, Tag=15; 
  long JD=julianDay(Jahr, Monat,Tag);
  Serial.print("Die Julianische Tagesnummer ist: ");
  Serial.println(JD);
}

void loop() {}


Du benötigst dringend ein wenig Grundwissen, wenn Du Dein Arduino-Board sinnvoll programmieren möchtest!

Go Up