Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Sonnenauf- und untergang Kategorie: Programmierung (von Thomas - 15.12.2004 17:14)


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 Hansi - 22.12.2004 22:30)
    Re: Sonnenauf- und untergang (von Michael - 15.01.2005 19:26)