Hallo,
sorry das ich hier so reinplatsche, habe mir paar Beiträge durchgelesen, mir ist aufgefallen das Ihr die Nachführung mit Lichtmessung und einer RTC macht. Das ist korrekt nur woher weist ihr wo zu zeit die Sonne steht bei bedecktem Himmel?
Ich wurde dazu nutzen den berechneten Sonnenaufgang plus Zeitkorrektur zum Standort = einmal schauen wann die Sonne „kommt“ auf Paneel, LDR oder ähnliches, danach zeitgesteuert das Modul drehen, Vorteil kommt die Sonne aus den Wolken Steht das Modul fast richtig.
Das Programm für Sonnen Auf und Untergang hat im Jahr 2012 @Jurs im Arduino CC Forum umgeschrieben für Arduino.
es at zwei Teile
Vorberechnung (vor Setup)
Berechnung in Loop
Damit diese Rechnung stimmt muss der Standort geändert werden (eingetragen ist mein Standort = Köln)
double B = 50.941278 * RAD; // geographische Breite
double GeographischeLaenge = 6.958281;
In dieser Zeile JD = JulianischesDatum(jahr, mon, tag, 12, 0, 0);
kann man direkt die Werte aus der RTC eintragen (jahr, mon, tag) die 12,0,0 bleit wie es ist.
Vorberechnung;
Code: Alles auswählen
//*****************************************************//
// C-Programm von http://lexikon.astronomie.info/zeitgleichung/neu.html
// umgeschrieben auf Arduino by 'jurs' for German Arduino forum
//**** angepasst an meine Bedürfnisse*****
//*******************************************************//
double pi2 = 6.283185307179586476925286766559;// ;)
double pi = 3.1415926535897932384626433832795;
double RAD = 0.017453292519943295769236907684886;
double JulianischesDatum ( int Jahr, int Monat, int Tag, int Stunde, int Minuten, double Sekunden )
// Gregorianischer Kalender
{
int Gregor;
if (Monat <= 2)
{
Monat = Monat + 12;
Jahr = Jahr - 1;
}
Gregor = (Jahr / 400) - (Jahr / 100) + (Jahr / 4); // Gregorianischer Kalender
return 2400000.5 + 365.0 * Jahr - 679004.0 + Gregor
+ int(30.6001 * (Monat + 1)) + Tag + Stunde / 24.0
+ Minuten / 1440.0 + Sekunden / 86400.0;
}
double InPi(double z)
{
int n = (int)(z / pi2);
z = z - n * pi2;
if (z < 0) z += pi2;
return z;
}
double eps(double T) // Neigung der Erdachse
{
return RAD * (23.43929111 + (-46.8150 * T - 0.00059 * T * T + 0.001813 * T * T * T) / 3600.0);
}
double BerechneZeitgleichung(double &DK, double T)
{
double RA_Mittel = 18.71506921
+ 2400.0513369 * T + (2.5862e-5 - 1.72e-9 * T) * T * T;
double M = InPi(pi2 * (0.993133 + 99.997361 * T));
double L = InPi(pi2 * ( 0.7859453 + M / pi2
+ (6893.0 * sin(M) + 72.0 * sin(2.0 * M) + 6191.2 * T) / 1296.0e3));
double e = eps(T);
double RA = atan(tan(L) * cos(e));
if (RA < 0.0) RA += pi;
if (L > pi) RA += pi;
RA = 24.0 * RA / pi2;
DK = asin(sin(e) * sin(L));
// Damit 0<=RA_Mittel<24
RA_Mittel = 24.0 * InPi(pi2 * RA_Mittel / 24.0) / pi2;
double dRA = RA_Mittel - RA;
if (dRA < -12.0) dRA += 24.0;
if (dRA > 12.0) dRA -= 24.0;
dRA = dRA * 1.0027379;
return dRA ;
}
///**** Ende Sonnen auf/unter Vorberechnung
Der für die Berechnung :
Code: Alles auswählen
double JD2000 = 2451545.0;
double JD;
double JD1; //**********Ales mit 1 am ende = gestern
JD = JulianischesDatum(jahr, mon, tag, 12, 0, 0); // Heutiges Datum
JD1 = JulianischesDatum(jahr, mon, tag - 1, 12, 0, 0); //******
double T = (JD - JD2000) / 36525.0;
double DK;
double h = -50.0 / 60.0 * RAD;
double B = 50.941278 * RAD; // geographische Breite
double GeographischeLaenge = 6.958281;
//double Zeitzone = 1; //Winterzeit
double Zeitzone = 1.0; //Sommerzeit 2
double Zeitgleichung = BerechneZeitgleichung(DK, T);
double Minuten = Zeitgleichung * 60.0;
double Zeitdifferenz = 12.0 * acos((sin(h) - sin(B) * sin(DK)) / (cos(B) * cos(DK))) / pi;
double AufgangOrtszeit = 12.0 - Zeitdifferenz - Zeitgleichung;
double UntergangOrtszeit = 12.0 + Zeitdifferenz - Zeitgleichung;
double AufgangWeltzeit = AufgangOrtszeit - GeographischeLaenge / 15.0;
double UntergangWeltzeit = UntergangOrtszeit - GeographischeLaenge / 15.0;
double Aufgang = AufgangWeltzeit + Zeitzone; // In Stunden
if (Aufgang < 0.0) Aufgang += 24.0;
else if (Aufgang >= 24.0) Aufgang -= 24.0;
double Untergang = UntergangWeltzeit + Zeitzone;
if (Untergang < 0.0) Untergang += 24.0;
else if (Untergang >= 24.0) Untergang -= 24.0;
int aufgangMinuten = int(60.0 * (Aufgang - (int)Aufgang) + 0.5);
int aufgangStunden = (int)Aufgang;
if (aufgangMinuten >= 60.0) {
aufgangMinuten -= 60.0;
aufgangStunden++;
}
else if (aufgangMinuten < 0.0) {
aufgangMinuten += 60.0; aufgangStunden--;
if (aufgangStunden < 0.0) aufgangStunden += 24.0;
}
int untergangMinuten = int(60.0 * (Untergang - (int)Untergang) + 0.5);
int untergangStunden = (int)Untergang;
if (untergangMinuten >= 60.0) {
untergangMinuten -= 60.0;
untergangStunden++;
}
else if (untergangMinuten < 0) {
untergangMinuten += 60.0; untergangStunden--;
if (untergangStunden < 0.0) untergangStunden += 24.0;
}
byte laengeStunden = untergangStunden - aufgangStunden; //
byte laengeMinuten = untergangMinuten - aufgangMinuten;
Gruß Bernhard