Nachdem ich im Internet keine brauchbare Berechnung gefunden habe, frage ich mal hier.
Hat jemand von euch eine Funktion zur Berechnung der Jahreszeiten, also Frühlings-, Sommer-, Herbst- und Winteranfang?
Falls das relevant sein sollte, nur für die Zukunft. Vergangenheit brauche ich nicht.
Und hier für Deutschland (MEZ bzw. MESZ).
Welchen Zeiten willst Du denn? Ich nehme mal an astronomisch, meteorologisch wäre ja fest. Das kannst Du recht genau linear mit einer festen Steigung und 4 alternierenden Ordinatenabschnitten darstellen. Siehe Wikipediaseite.
Die 5 Werte kriegst Du aus der Datentabelle durch lineare Regression.
Oder brauchst Du es genauer als ein paar Minuten?
slartibartfast:
Nachdem ich im Internet keine brauchbare Berechnung gefunden habe, frage ich mal hier.
Hat jemand von euch eine Funktion zur Berechnung der Jahreszeiten, also Frühlings-, Sommer-, Herbst- und Winteranfang?
Falls das relevant sein sollte, nur für die Zukunft. Vergangenheit brauche ich nicht.
Und hier für Deutschland (MEZ bzw. MESZ).
Die Jahreszeiten richten sich nach dem Umlauf der Erde um die Sonne und wiederholen sich regelmäßig jedes Jahr.
Mein Google sagt, dass zwischen zwei Frühlingsanfängen eine Zeit von 365 Tagen 5 Stunden 48 Minuten und 46 Sekunden vergeht. Das wären nach meiner Rechnung 31556926 Sekunden.
Für Deine Zwecke sollte es wohl ausreichen, Dir eine exakte Zeitangabe für einen nicht weiter als 20 Jahre zurückliegenden Frühlingsanfang aus einem astronomischen Almanach herauszusuchen und dann einfach
31556926 Sekunden bis zum nächsten Frühlingsanfang draufaddieren, bzw. ein Viertel davon für Sommeranfang, die Hälfte für Herbstanfang und drei/viertel davon für Winteranfang desselben Jahres.
Dann müßtest Du nur noch berücksichtigen, dass Sommer- und Herbstanfang in die Sommerzeit fallen, also wenn Du bis dahin die Werte in Zonenzeit UTC+1 hast, dann noch eine Stunde drauflegen für UTC+2 (Sommerzeit).
Kommst Du damit klar?
Und wie genau möchtest Du die Zeiten ausrechnen? Genauer als mit einer Minute Abweichungzur genauen astronomischen Zeit?
Ja, ich meinte die astronomischen Daten und bei der Genauigkeit reicht mir eigentlich der Tag (ich möchte bei meinen Kalender ein entsprechendes Bild (PNG) anzeigen).
Vielen Dank für eure guten Ratschläge!
Damit konnte ich mir eine Funktion schreiben, die mir die aktuelle Jahreszeit zurückgibt.
Falls das noch jemand gebrauchen kann:
#include <Wire.h>
#include <Sodaq_DS3231.h>
byte GetSeason() {
const uint32_t SeasonTicks[4] = {8014464, 8091360, 7762176, 7688736}; // Sekunden pro Jahreszeit (Fruehling, Sommer, Herbst, Winter)
uint32_t startdate = 1482320640; // als Startdatum fuer die Berechnung: 2016/12/21 11:44:00 Mittwoch = Winteranfang (UnixTime = 1482320640)
byte SeasonCount = 3; // Winteranfang als Start
DateTime now = rtc.now(); // das aktuelle Datum und die Uhrzeit aus der RTC lesen
uint32_t unixtime = now.getEpoch(); // zum Vergleich die Unixzeit holen
while (startdate + SeasonTicks[SeasonCount] < unixtime) { // Schleife solange durchlaufen, wie die Unixzeit nicht ueberschritten wird
startdate += SeasonTicks[SeasonCount++]; // zum Startdatum die Sekunden pro Jahreszeit addieren und den Jahreszeiten-Zaehler erhoehen
if (SeasonCount > 3) SeasonCount = 0; // wenn der Jahreszeiten-Zaehler beim Winter (3) angekommen ist, wieder zum Fruehling (0) springen
};
return SeasonCount; // Jahreszeiten-Zaehler zurueckgeben
}
void setup() {
Serial.begin(115200);
Wire.begin();
rtc.begin();
DateTime dt(2017, 3, 20, 0, 0, 0, 0); // zum testen, das Datum verstellen
rtc.setDateTime(dt);
Serial.println(GetSeason()); // 0 = Fruehling, 1 = Sommer, 2 = Herbst, 3 = Winter
}
void loop() {
}
Wie gesgat, das sollte auch deutlich effizienter gehen. Ohne Schleifen durchlaufen zu lassen. Wenn Du Dir den Plot in Wikipedia ansiehst, dann siehst Du dort dass die Punkte vier Geraden formen und dazwischen alternieren. Du musst also nur die Geradengleichung finden und kannst einsetzen.