Re: Sonnenauf- und untergang Kategorie: Programmierung (von Michael - 15.01.2005 19:26) | ||
Als Antwort auf Re: Sonnenauf- und untergang von Hansi - 22.12.2004 22:30 | ||
| ||
Danke. Das nimmt mir mal wieder einige Arbeit ab. Gru� Michael > 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: |