Die Berechnungen basieren auf den Formeln, welche auf http://www.geoastro.de/SME/tk/index.htm veröffentlicht sind. Diese sind auf die Rega spezifischen eigenheiten angepasst. Der Ansatz benutzt die seit einiger Zeit vorhandenen Trigonometrischen Funktionen der Rega.
Auf einer Raspberrymatik sollten die Beechnungen keine Hürde sein, der Prozessor verfügt über eine Floating Point Unit in Hardware (The SoC is a Broadcom BCM2835. This contains an ARM1176JZFS, with floating point unit, bei der CCU2 weiss ichs nicht genau)
Laut Ansatz erreicht die Berechnung eine Genauigkeit von
Höhenwinkel: mittlerer absoluter Fehler 0,22°, maximal 0,4°
Azimutwinkel: mittlerer absoluter Fehler 0,14°, maximal 0,35°
Zum Triggern der Berechnung benutze man ein Programm entweder mit Zeitmodul Zyklisch oder mittels eines CUxD Timers. Die Häufigkeit der Aufrufe richtet sich nach der gewüsnchten Auflösung, bei 24 Stunden a 60 Minuten und 360° eines Vollkreises ergibt sich alle 4 Minuten ein Winkelschritt von ~1°. EIn minütlicher Aufruf würde also theoretisch einen Auflösung von ~0.25° bringen.
Azimut
0° = N
90° = O (oder E)
180° = S
270° = W
benötigt werden: 2 Systemvariablen
Name: Sonnenstand.Azimut
Beschreibung: Himmelsrichtung Sonne
variablenTyp: zahl
Min: 0
max 360
Einheit °
-------------------------------------
Name: Sonnenstand.Elevation
Beschreibung: Winkel über Horizont
variablenTyp: zahl
Min: -90
max 90
Einheit °
Code: Alles auswählen
!- Azimut und Elevation berechnung Sonnenstand
!- Michael Thelen Februar 2018
!- Formeln von http://www.geoastro.de angepasst auf RegaScript
!- Geänderte Berechnung des Azimutüberganges aufgrund Fehlers in der Stammformel
object oAzimut= dom.GetObject(ID_SYSTEM_VARIABLES).Get ("Sonnenstand.Azimut");
real iHour= system.Date("%H").ToFloat () - ((system.Date ("%z").ToFloat ()/100.0)-1.0);
real iMin= system.Date ("%M").ToFloat ();
real pi180= M_PI/180.0;
real rLatitude = pi180*system.Latitude ();
real rJT = (-1.0+system.Date ("%j").ToFloat ()+ (-12.0+iHour+iMin/60.0)/24.0)/365.0;
real dekl = (0.006918+(-0.399912*(2.0*M_PI *rJT).Cos ())+(0.070257*(2.0*M_PI * rJT).Sin()) + (-0.006758*(2.0*M_PI* rJT).Cos ()) + (0.000907*(2.0*M_PI* rJT).Sin ()) + (-0.002697*(3.0*M_PI*rJT).Cos () ) + (0.00148*(3.0*M_PI*rJT).Sin ()))/ pi180;
real zGL= 229.18*(0.000075+(0.001868*(M_PI*2.0*rJT).Cos () ) + (-0.032077*(M_PI*2.0*rJT).Sin ()) + (-0.014615*(M_PI*4.0*rJT).Cos ()) +(-0.040849*(M_PI*4.0*rJT).Sin ()) );
real StdAncle= (((iHour*60.0)+iMin+zGL+(4.0*system.Longitude ())+ (-60.0))/4.0)+ (-180.0);
real SinElevation= (rLatitude.Sin () * (pi180*dekl).Sin () ) + (rLatitude.Cos () * (pi180*dekl).Cos () * (pi180*StdAncle).Cos () );
real Elevation= SinElevation.Asin ()/pi180;
real CosAzimut= ((rLatitude.Sin () * SinElevation)-(pi180*dekl).Sin ()) / (rLatitude.Cos () * SinElevation.Acos().Sin()) * (-1.0);
real Azimut= CosAzimut.Acos () / pi180;
if (Azimut<oAzimut.LastValue() ) {Azimut= 360.0-Azimut;}
oAzimut.State (Azimut);
dom.GetObject (ID_SYSTEM_VARIABLES).Get ("Sonnenstand.Elevation").State (Elevation);
WriteLine ("Azimut: " # Azimut);
WriteLine ("Elevation: " # Elevation);