INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Sonnenaufgang/untergang für Steuerungen berechnen
20.08.2014, 13:07
Beitrag #1
Sonnenaufgang/untergang für Steuerungen berechnen
ich habe für eine Rollladensteuerung mittels Arduino u.a. die Sonnenaufgangs- und Untergangszeiten benötigt. Dies lässt sich mittels der Formeln auf http://lexikon.astronomie.info/zeitgleichung/ relativ leicht berechnen. Das folgende sind die benötigten Funktionen aus meinem Projekt:

Code:
// die folgenden Formeln wurden der Seite http://lexikon.astronomie.info/zeitgleichung/ entnommen
#define PI  3.1415926536

// subfunction to compute Sonnendeklination
float sonnendeklination(int T) {
    // Deklination der Sonne in Radians
    // Formula 2008 by Arnold(at)Barmettler.com, fit to 20 years of average declinations (2008-2017)
    return 0.409526325277017*sin(0.0169060504029192*(T-80.0856919827619));
}

// subfunction to compute Zeitdifferenz    
float zeitdifferenz(float Deklination, float B) {
    // Dauer des halben Tagbogens in Stunden: Zeit von Sonnenaufgang (Hoehe h) bis zum hoechsten Stand im Sueden
    return 12.0*acos((sin(-(50.0/60.0)*PI/180.0) - sin(B)*sin(Deklination)) / (cos(B)*cos(Deklination)))/PI;
}

// subfunction to compute Zeitgleichung
float zeitgleichung(int T) {
    return -0.170869921174742*sin(0.0336997028793971 * T + 0.465419984181394) - 0.129890681040717*sin(0.0178674832556871*T - 0.167936777524864);
}

// subfunction to compute sunrise
float aufgang(int T, float B) {
    float DK = sonnendeklination(T);
    return 12 - zeitdifferenz(DK, B) - zeitgleichung(T);
}

// subfunction to compute sunset
float untergang(int T, float B) {
    float DK = sonnendeklination(T);
    return 12 + zeitdifferenz(DK, B) - zeitgleichung(T);
}

// subfunction to compute it all  
void compute(int T) {
    float Laenge     = 10.98;
    float Breite     = 48.25;
    int   Zone       = 2;       // Unterschied zu UTC-Zeit ( = 2 in der Sommerzeit, 1 in der Winterzeit )
    float B = Breite*PI/180.0;  // geogr. Breite in Radians
    
    // Berechnung von Sonnenauf- und -Untergang
    float Aufgang    = aufgang(T, B);    // Sonnenaufgang bei 0 Grad Laenge
    float Untergang  = untergang(T, B);  // Sonnenuntergang bei 0 Grad Laenge
    
    Aufgang    = Aufgang   - Laenge /15.0 + Zone; // Sonnenaufgang bei gesuchter Laenge und Zeitzone in Stunden
    Untergang  = Untergang - Laenge /15.0 + Zone; // Sonnenuntergang bei gesuchter Laenge und Zeitzone in Stunden
    Serial.print("Tag: ");Serial.print(T);
        Serial.print(" Aufgang: ");Serial.print(Aufgang);Serial.print(" Untergang: ");Serial.println(Untergang);
}
Die Funktion "compute(int T) ist ein beispiel wie man die Daten für einen bestimmten Tag des Jahres (z.B. den 300.sten Tag) berechnet. Vielleicht kann der Code für ähnliche Fragestellungen hilfreich sein.

Gruss Jürgen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2014, 15:11
Beitrag #2
RE: Sonnenaufgang/untergang für Steuerungen berechnen
(20.08.2014 13:07)JStein schrieb:  ich habe für eine Rollladensteuerung mittels Arduino u.a. die Sonnenaufgangs- und Untergangszeiten benötigt. Dies lässt sich mittels der Formeln auf http://lexikon.astronomie.info/zeitgleichung/ relativ leicht berechnen. Das folgende sind die benötigten Funktionen aus meinem Projekt:

Code:
// die folgenden Formeln wurden der Seite http://lexikon.astronomie.info/zeitgleichung/ entnommen
#define PI  3.1415926536

// subfunction to compute Sonnendeklination
float sonnendeklination(int T) {
    // Deklination der Sonne in Radians
    // Formula 2008 by Arnold(at)Barmettler.com, fit to 20 years of average declinations (2008-2017)
    return 0.409526325277017*sin(0.0169060504029192*(T-80.0856919827619));
}

// subfunction to compute Zeitdifferenz    
float zeitdifferenz(float Deklination, float B) {
    // Dauer des halben Tagbogens in Stunden: Zeit von Sonnenaufgang (Hoehe h) bis zum hoechsten Stand im Sueden
    return 12.0*acos((sin(-(50.0/60.0)*PI/180.0) - sin(B)*sin(Deklination)) / (cos(B)*cos(Deklination)))/PI;
}

// subfunction to compute Zeitgleichung
float zeitgleichung(int T) {
    return -0.170869921174742*sin(0.0336997028793971 * T + 0.465419984181394) - 0.129890681040717*sin(0.0178674832556871*T - 0.167936777524864);
}

// subfunction to compute sunrise
float aufgang(int T, float B) {
    float DK = sonnendeklination(T);
    return 12 - zeitdifferenz(DK, B) - zeitgleichung(T);
}

// subfunction to compute sunset
float untergang(int T, float B) {
    float DK = sonnendeklination(T);
    return 12 + zeitdifferenz(DK, B) - zeitgleichung(T);
}

// subfunction to compute it all  
void compute(int T) {
    float Laenge     = 10.98;
    float Breite     = 48.25;
    int   Zone       = 2;       // Unterschied zu UTC-Zeit ( = 2 in der Sommerzeit, 1 in der Winterzeit )
    float B = Breite*PI/180.0;  // geogr. Breite in Radians
    
    // Berechnung von Sonnenauf- und -Untergang
    float Aufgang    = aufgang(T, B);    // Sonnenaufgang bei 0 Grad Laenge
    float Untergang  = untergang(T, B);  // Sonnenuntergang bei 0 Grad Laenge
    
    Aufgang    = Aufgang   - Laenge /15.0 + Zone; // Sonnenaufgang bei gesuchter Laenge und Zeitzone in Stunden
    Untergang  = Untergang - Laenge /15.0 + Zone; // Sonnenuntergang bei gesuchter Laenge und Zeitzone in Stunden
    Serial.print("Tag: ");Serial.print(T);
        Serial.print(" Aufgang: ");Serial.print(Aufgang);Serial.print(" Untergang: ");Serial.println(Untergang);
}
Die Funktion "compute(int T) ist ein beispiel wie man die Daten für einen bestimmten Tag des Jahres (z.B. den 300.sten Tag) berechnet. Vielleicht kann der Code für ähnliche Fragestellungen hilfreich sein.

Gruss Jürgen

Übrigens, den Tag des Jahres findet ihr mit folgendem Codefragment:

Code:
tmElements_t tm;          // a variable of time elements
  time_t       myTime;      // variable for holding time as Seconds
  int          dayOfYear;   // number of actual day


    breakTime(now(), tm);   // get actual time-values in tm-format
    tm.Day = 1; tm.Month = 1; tm.Hour = 0; tm.Minute = 0; tm.Second = 0;
    myTime = makeTime(tm);
    dayOfYear = (now() - myTime)/SECS_PER_DAY;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste