Für die Ansteuerung eines Antennen-Rotors benutze ich folgenden Code (in Anlehnung an vdr-1.7.22-gotox.diff):
#define SAT_EARTH_RATIO 0.1513 // the distance from the Earth's center to the satellite, divided by the Earth's radius
#define RAD(x) ((x) * M_PI / 1800)
#define DEG(x) ((x) * 1800 / M_PI)
int CalcHourAngle(int Longitude)
{
double Delta = RAD(Longitude - Setup.SiteLon);
double Lat = RAD(Setup.SiteLat);
double Azimuth = M_PI + atan2(tan(Delta), sin(Lat));
double x = cos(Delta) * cos(Lat);
double Elevation = atan2(x - SAT_EARTH_RATIO, sin(acos(x)));
int Sign = Setup.SiteLat >= 0 ? -1 : 1; // angles to the right are positive, and angles to the left are negative
return Sign * round(DEG(atan2(-cos(Elevation) * sin(Azimuth), sin(Elevation) * cos(Lat) - cos(Elevation) * sin(Lat) * cos(Azimuth))));
}
Alles anzeigen
Alle Winkel sind in "Grad * 10", Setup.SiteLon und Setup.SiteLat sind die Länge und Breite des Antennenstandortes (Ost = positiv, West = negativ).
Die Funktion berechnet den sog. "hour angle", um den der Rotor nach links (negativ) bzw. rechts (positiv) gedreht werden muß, um die Antenne auf einen Satelliten an der Position Longitude auszurichten.
Das funktioniert soweit alles. Was ich für die Anzeige der aktuellen Antennenposition noch gerne hätte wären folgende Größen:
- die beiden Longitude -Werte, bei denen die Antenne gerade auf den Horizont ausgerichtet ist (d.h. Elevation == 0)
- den Longitude-Wert für einen vorgegebenen Wert des "hour angles" (also quasi die Umkehrung obiger Funktion)
Diese Werte würde ich gerne benutzen um in der Kanalanzeige einen Balken darzustellen, in dem der maximal sichtbare "Himmelsausschnitt", der maximale Drehbereich der Antenne, sowie die aktuelle Position der Antenne dargestellt wird.
Vielleicht gibt es ja hier den einen oder anderen, der Lust hat, dieses mathematische Problem zu lösen und etwas Code beisteuern kann
Klaus