Sonnenstandsberechner (für sun tracker devices): Unterschied zwischen den Versionen

Aus Happylab
Zur Navigation springen Zur Suche springen
 
(29 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
For the english version go to [[solar Arduino tracker]]
 
=Allgemeines=
 
=Allgemeines=
 
Für die Bestimmung des Sonnenstandes auf einem (ortsfesten) Microcontroller  
 
Für die Bestimmung des Sonnenstandes auf einem (ortsfesten) Microcontroller  
Zeile 8: Zeile 9:
 
Microcontrollers Rücksicht nehmen und entsprechend adaptiert werden.
 
Microcontrollers Rücksicht nehmen und entsprechend adaptiert werden.
 
Bei Arduino gibt es beispielsweise das Problem, dass der Datentyp double  
 
Bei Arduino gibt es beispielsweise das Problem, dass der Datentyp double  
in Wirklichkeit nur mit Präzision von float rechnet (also 23 Bit Mantisse).
+
in Wirklichkeit nur mit Präzision float rechnet (also 23 Bit Mantisse).
  
 
==Die Zeit==
 
==Die Zeit==
[[Image:Arduino_DS1307.jpg|thumb|Zeitgeberbaustein DS1307]]
+
[[Image:Arduino_DS1307_FritzingExport.jpg|thumb|Zeitgeberbaustein DS1307 mit Arduino]]
 
Die Zeit (Greenwich Time aka UT) bestimme ich mit den DS1307 Baustein.
 
Die Zeit (Greenwich Time aka UT) bestimme ich mit den DS1307 Baustein.
 
Nach der Beschreibung von http://www.glacialwanderer.com/hobbyrobotics/?p=12
 
Nach der Beschreibung von http://www.glacialwanderer.com/hobbyrobotics/?p=12
Zeile 28: Zeile 29:
 
Für Arduino sind allerdings Anpassungen notwendig. Insbesondere müssen die Formeln  
 
Für Arduino sind allerdings Anpassungen notwendig. Insbesondere müssen die Formeln  
 
zur Berechnung des  
 
zur Berechnung des  
[http://de.wikipedia.org/wiki/Julianisches_Datum Julianischen Datums] modifiziert werden, sodass
+
[http://de.wikipedia.org/wiki/Julianisches_Datum Julianischen Datums] modifiziert werden, damit
dieser Tag trotz ''Arduinopräzision'' richtig heraus kommt.
+
dieser Tag trotz ''Arduinopräzision'' richtig heraus kommt.
 +
 
 +
Für ältere Arduino IDE (0023 und früher) sollte folgendes Programm plus Libraries verwendet werden:
 +
{{zip|SolarTracker4Arduino.zip|14KB|Version from 09.03.2011}}
 +
 
 +
Für neuere Arduino IDE (1.0.1 und höher) dagegen folgendes Package:
 +
{{zip|SolarTracker4Arduino1.0.1.zip|17KB|Version from 16.01.2015}}
 +
 
 +
Sobald man das alles zum Laufen gebracht hat, sollte man verifizieren,
 +
dass die Berechnungen stimmen, zum Beispiel
 +
mit dem [http://www.sunearthtools.com/dp/tools/pos_sun.php solar position calculator] von
 +
sun earth tools. (Achtung: SolarTracker4Arduino berücksichtigt keine Sommerzeit, UT muss eingestellt
 +
sein (beim Einstellen des Timer chips), als ob es sie nicht gäbe. Anderseits kann bei sun earth tools Sommerzeit
 +
berücksichtigt werden (Option DST ist defaultmäßig ausgewählt).
  
 
==Alternative Sonnenstandsberechnungen==
 
==Alternative Sonnenstandsberechnungen==
 +
===SPA Algorithmus===
 +
Ein wesentlich genauerer aber auch entsprechend komplizierterer Algorithmus
 +
ist die Methode nach Reda, I.; Andreas, A. (2003):
 +
''Solar Position Algorithm for Solar Radiation Applications. NREL Report No. TP-560-34302,
 +
''Revised January 2008. The algorithm is supposed to work for the years -2000 to 6000,
 +
''with uncertainties of +/-0.0003 degrees.''
 +
Ich habe Referenzen und Code bei [http://klaus.e175.net/solarpositioning Klaus Brunner] gefunden.
 +
Dank dieser Sourcen bin ich auch auf PSA aufmerksam geworden.
 
===Wikipedia Sonnenstand===
 
===Wikipedia Sonnenstand===
 
Die Berechnung nach den Formeln im Wikipediaartikel [http://de.wikipedia.org/wiki/Sonnenstand Sonnenstand]
 
Die Berechnung nach den Formeln im Wikipediaartikel [http://de.wikipedia.org/wiki/Sonnenstand Sonnenstand]
scheint fehlerhaft zu sein. (Stand Februar 2011)  
+
konnte ich nicht verifizieren. (Stand Februar 2011).  
Einige (Diskussions)Autoren haben kritische Anmerkungen hinterlassen, die zum Teil unbeantwortet und
+
Ich habe die Formeln im hier vorliegenden Javaprogramm nachvollzogen, alle Zwischenergebnisse
-bearbeitet geblieben sind.  
+
und auch das Endergebnis des Wikiartikels kommt richtig raus; allerdings eben nur für das eine
[[Image:SonnenstandberechnerGUI.png|thumb|GUI zur Sonnenstandberechnung]]
+
angegebene Beispiel, bei anderem Datum, Tageszeit oder Ort kommen Werte raus, die
Ich habe das Programm Sonnenstandsberechner nach diesen Formeln entwickelt,
+
nicht mehr mit [http://www.sunearthtools.com/dp/tools/pos_sun.php?lang=de sunearthtools]
es kann (theoretisch) der jeweilige
+
zusammen stimmen.
Sonnenstand (Azimut und Höhe) aus aktuellem Datum, Zeit und
 
[http://de.wikipedia.org/wiki/Geographische_Koordinaten geographischen Koordinaten] berechnet werden.  
 
  
Als ich aber die Ergebnisse mit den Daten auf
+
Zur Kontrolle belasse ich das Programm online.
[http://www.sunearthtools.com/dp/tools/pos_sun.php?lang=de sunearthtools]
 
verglichen habe, kommt es ''nur für das eine Beispiel'' im Wikipediaartikel richtig raus.
 
Zur Kontrolle belasse ich das Programm aber vorläufig online.
 
 
{{zip|Sonnenstandsberechner.zip|27KB|Version vom 06.02.2011}}
 
{{zip|Sonnenstandsberechner.zip|27KB|Version vom 06.02.2011}}
Sourcecode inkludiert, der wichtige Kern ist die Java-Klasse
+
Sourcecode inkludiert, der Kern ist die Java-Klasse
SunCalculations, nützlich als Library beziehungsweise zum Nachschlagen
+
SunCalculations. Die (ebenfalls inkludierten) Junit-Tests sind mit den Beispieldaten
der Formeln, wenn man ein sun-tracker device bauen will
 
(zum Beispiel einen Heliostat oder einen Fresnelreflektor)
 
Der Sourcecode und Versionsgeschichte steht auch auf
 
http://code.google.com/p/solar-position zur Verfügung.
 
 
 
Die (ebenfalls inkludierten) Junit-Tests sind mit den Beispieldaten
 
 
ausgearbeitet die auf dieser Page angegeben sind, Gleitkomma-Berechnungen
 
ausgearbeitet die auf dieser Page angegeben sind, Gleitkomma-Berechnungen
 
sind generell mit double implementiert.
 
sind generell mit double implementiert.
Zeile 61: Zeile 72:
 
nehme ich den Algorithmus aus http://en.wikipedia.org/wiki/Julian_day.
 
nehme ich den Algorithmus aus http://en.wikipedia.org/wiki/Julian_day.
  
===SPA Algorithmus===
+
[[Category:Projekte]]
Ein wesentlich genauerer aber auch entsprechend komplizierterer Algorithmus
 
ist die Methode nach Reda, I.; Andreas, A. (2003):
 
''Solar Position Algorithm for Solar Radiation Applications. NREL Report No. TP-560-34302,
 
Revised January 2008. The algorithm is supposed to work for the years -2000 to 6000,
 
with uncertainties of +/-0.0003 degrees.''
 
Ich habe Referenzen und Code bei [http://klaus.e175.net/solarpositioning Klaus Brunner] gefunden.
 
Dank dieser Sourcen bin ich auch erst auf PSA aufmerksam geworden.
 

Aktuelle Version vom 9. März 2015, 14:03 Uhr

For the english version go to solar Arduino tracker

Allgemeines

Für die Bestimmung des Sonnenstandes auf einem (ortsfesten) Microcontroller müssen vor allem zwei Probleme gelöst werden: Der Microcontroller muss die Zeit batteriegepuffert bestimmen können, und er muss mit einem hinreichend einfachen Algorithmus aus Datum, Zeit und Ort daraus den Sonnenstand berechnen können. Der Algorithmus muss ggf. noch auf die Einschränkungen des verwendeten Microcontrollers Rücksicht nehmen und entsprechend adaptiert werden. Bei Arduino gibt es beispielsweise das Problem, dass der Datentyp double in Wirklichkeit nur mit Präzision float rechnet (also 23 Bit Mantisse).

Die Zeit

Zeitgeberbaustein DS1307 mit Arduino

Die Zeit (Greenwich Time aka UT) bestimme ich mit den DS1307 Baustein. Nach der Beschreibung von http://www.glacialwanderer.com/hobbyrobotics/?p=12 hat das auf Anhieb funktioniert. Ich hatte keine 2.2K Widerstände, mit 4.7K war es auch kein Problem.

Berechnung von Azimut und Elevation

Zur exakten Berechnung von Azimut und Elevation braucht man relativ komplizierte Formeln, für praktische Zwecke wie sun tracking eines Heliostaten genügen aber auch einfachere. Für Solaranlagen hat sich der PSA-Algorithmus vermutlich am besten bewährt. Er wird von der Plataforma Solar de Almeria (Spanien) hier als C++ Code zur Verfügung gestellt. Für Arduino sind allerdings Anpassungen notwendig. Insbesondere müssen die Formeln zur Berechnung des Julianischen Datums modifiziert werden, damit dieser Tag trotz Arduinopräzision richtig heraus kommt.

Für ältere Arduino IDE (0023 und früher) sollte folgendes Programm plus Libraries verwendet werden:

Filezip.gif SolarTracker4Arduino.zip (14KB)
Version from 09.03.2011

Für neuere Arduino IDE (1.0.1 und höher) dagegen folgendes Package:

Filezip.gif SolarTracker4Arduino1.0.1.zip (17KB)
Version from 16.01.2015

Sobald man das alles zum Laufen gebracht hat, sollte man verifizieren, dass die Berechnungen stimmen, zum Beispiel mit dem solar position calculator von sun earth tools. (Achtung: SolarTracker4Arduino berücksichtigt keine Sommerzeit, UT muss eingestellt sein (beim Einstellen des Timer chips), als ob es sie nicht gäbe. Anderseits kann bei sun earth tools Sommerzeit berücksichtigt werden (Option DST ist defaultmäßig ausgewählt).

Alternative Sonnenstandsberechnungen

SPA Algorithmus

Ein wesentlich genauerer aber auch entsprechend komplizierterer Algorithmus ist die Methode nach Reda, I.; Andreas, A. (2003): Solar Position Algorithm for Solar Radiation Applications. NREL Report No. TP-560-34302, Revised January 2008. The algorithm is supposed to work for the years -2000 to 6000, with uncertainties of +/-0.0003 degrees. Ich habe Referenzen und Code bei Klaus Brunner gefunden. Dank dieser Sourcen bin ich auch auf PSA aufmerksam geworden.

Wikipedia Sonnenstand

Die Berechnung nach den Formeln im Wikipediaartikel Sonnenstand konnte ich nicht verifizieren. (Stand Februar 2011). Ich habe die Formeln im hier vorliegenden Javaprogramm nachvollzogen, alle Zwischenergebnisse und auch das Endergebnis des Wikiartikels kommt richtig raus; allerdings eben nur für das eine angegebene Beispiel, bei anderem Datum, Tageszeit oder Ort kommen Werte raus, die nicht mehr mit sunearthtools zusammen stimmen.

Zur Kontrolle belasse ich das Programm online.

Filezip.gif Sonnenstandsberechner.zip (27KB)
Version vom 06.02.2011

Sourcecode inkludiert, der Kern ist die Java-Klasse SunCalculations. Die (ebenfalls inkludierten) Junit-Tests sind mit den Beispieldaten ausgearbeitet die auf dieser Page angegeben sind, Gleitkomma-Berechnungen sind generell mit double implementiert. Für die Berechnung der Julianischen Tageszeit nehme ich den Algorithmus aus http://en.wikipedia.org/wiki/Julian_day.