Re: Sonnenauf- und untergang Kategorie: Programmierung (von Hansi - 22.12.2004 22:30) | ||
Als Antwort auf Sonnenauf- und untergang von Thomas - 15.12.2004 17:14 | ||
| ||
Hallo Thomas, ich habe zwar Formel noch nicht kontrolliert, aber eine Genauigkeit von +/- 5 Minuten sollte jedem reichen, ich werde Deinen Source bei mir zur Steuerung meiner Rolladaden verwenden. Danke! Gru� Hansi > Hallo zusammen, > > für die eigene Haussteuerung mussten, damit die Rolladen bei Abwesenheit auf- und abfahren, die > Zeitpunkte der Morgen- und Abenddämmerung bestimmt werden. > > Angeregt durch das Programm zu Jalusie-Steuerung von Axel Rathey sowie der Formeldarstellung > unter http://lexikon.astronomie.info/zeitgleichung/ habe ich die Funktionen zur Berechnung von > Sonnenauf und -untergang sowie der verschiedenen Dämmerungszeitpunkte in ein Modul zusammen- > gefasst. > > sun.c2 > > Aufruf: sun.rise_set (int day, float breitengrad, float laengengrad) > > day ist eine Zahl von 1 (1.Januar) bis 365 (31.Dezember) - wir als day Null übergeben, so werden > die Werte für den aktuellen Tag berechnet. > > Da in c2 keine komlexen Type als Return-Wert möglich sind, werden die Ergebnisse in sun.rs[] > gespeichert. > > Vielleicht kann es jemand gebrauchen. > > Beste Grü�e > Thomas > > Hier ein Testprogramm und nachfolgend das Modul: > > thread main { > float Laenge, Breite; > int Tage; > > // Berechnung fuer heute > Tage = 0; > > // Koordinaten fuer Dortmund > Laenge = 7.45; > Breite = 51.53; > > // Aufruf der Berechnung > sun.rise_set (Tage, Breite, Laenge); > > float auf, ab; > int aufStd, aufMin, abStd, abMin; > int i; > > > // Die Ergebnisse stehen in sun.rs[i] für > // i=sun.tranit = Transit, > // i=civil = bürgerliche Dämmerung > // i=nautical = nautische Dämmerung > // i=astronomical = astronomische Dämmerung > > for i = sun.transit ... sun.astronomical { > auf = sun.rs[i].riseTime; > ab = sun.rs[i].setTime; > aufStd = sun.rs[i].riseHour; > aufMin = sun.rs[i].riseMinute; > abStd = sun.rs[i].setHour; > abMin = sun.rs[i].setMinute; > } > } > > > Hier nur das Modul sun.c2: > > /******************************************************************** > > sun.c2 > > release : 2004/12/15 > author : Thomas Wahle > based on : Axel Rathey, Dr. Roland Brobeck) > requires : math.c2, system.c2, myconst.c2 > version : 0.1 > contents : routine to calculate transit and twilight > > input: day 1 = 01.01 ... 356 = 31.12 > current date is used if day is eq. 0 > latitude (grad) > longitude (grad) > > output: sun.rs[i].riseTime = sunrise as float > sun.rs[i].setTime = sunset as float > sun.rs[i].riseHour = sunrise hour as int > sun.rs[i].riseMinute = sunrise minute as int > sun.rs[i].setHour = sunset hour as int > sun.rs[i].setMinute = sunset minute as int > > where i may be: > sun.transit to get the transit > sun.civil to get the civil twilight > sun.nautical to get the nautical twilight > sun.astronomical to get the astronomical twilight > ********************************************************************/ > > // Constants for transit and twilight definitions > const transit = 0; > const civil = 1; > const nautical = 2; > const astronomical = 3; > const h[] = -0.0145444, // transit > -0.1047197, // civil twilight > -0.2094395, // nautical twilight > -0.3141592; // astronomical twilight > > // Type to return sunset and sunrise > type stimeType { > float riseTime; > int riseHour; > int riseMinute; > float setTime; > int setHour; > int setMinute; > } > > stimeType rs[4]; > > function rise_set (int day, float latitude, float longitude){ > > if day == 0 { > int mcnt; > for mcnt = 1 ... system.month()-1 > day = day + myconst.DOM[mcnt]; > day = day + system.day()+1; > } > // convert latizude from grad into rad > latitude = latitude * constant.PI/180.0; > float decl, eqTime, deltaTime; > decl = 0.40954*math.sin(0.0172*(day-79.35)); > eqTime = -0.1752*math.sin(0.033430*day+0.5474)-0.1340*math.sin(0.018234*day-0.1939); > > int time2utc; > if system.dst() == 0 > time2utc = 1; > else > time2utc = 2; > > int i; > for i = transit ... astronomical { > deltaTime = 12*math.acos((math.sin(h[i])-math.sin(latitude)*math.sin(decl))/(math.cos(latitude) > *math.cos(decl)))/constant.PI; > rs[i].riseTime = 12 - deltaTime - eqTime - longitude /15 + time2utc; > rs[i].setTime = 12 + deltaTime - eqTime - longitude /15 + time2utc; > rs[i].riseHour = rs[i].riseTime; > rs[i].riseMinute = (rs[i].riseTime-rs[i].riseHour)*60; > rs[i].setHour = rs[i].setTime; > rs[i].setMinute = (rs[i].setTime-rs[i].setHour)*60; > } > } > > | ||
Antwort schreiben Antworten: Re: Sonnenauf- und untergang (von Michael - 15.01.2005 19:26) |