Sonnenstandsberechner (für sun tracker devices): Unterschied zwischen den Versionen
Zeile 51: | Zeile 51: | ||
====Die Formeln in Java für die alte Version==== | ====Die Formeln in Java für die alte Version==== | ||
− | |||
Falls trotzdem jemand Berufener die Formeln nachprüfen und/oder korrigieren will (und Java verwendet), | Falls trotzdem jemand Berufener die Formeln nachprüfen und/oder korrigieren will (und Java verwendet), | ||
so kann er/sie sich hier die Sourcen holen. | so kann er/sie sich hier die Sourcen holen. |
Version vom 25. März 2011, 10:48 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
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.
SolarTracker4Arduino.zip (14KB) [info] Version from 09.03.2011 |
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 (ursprünglichen) Wikipediaartikel Sonnenstand scheint fehlerhaft zu sein, worauf in in den Diskussionen hingewiesen habe. (Stand Februar 2011). Inzwischen wurde dort aber der betreffende Teil gelöscht (Stand März 2011), aus meiner Sicht eine richtige Maßnahme, solange es keine abgesicherte und wissenschaftlich publizierte Bestätigung dieser Formeln gibt.
Die Formeln in Java für die alte Version
Falls trotzdem jemand Berufener die Formeln nachprüfen und/oder korrigieren will (und Java verwendet), so kann er/sie sich hier die Sourcen holen. Das Programm wurde nach den Formeln des Artikels entwickelt (nur mehr in den älteren Versionen sichtbar), es kann (theoretisch) der jeweilige Sonnenstand (Azimut und Höhe) aus aktuellem Datum, Zeit und geographischen Koordinaten berechnet werden.
Als ich aber die Ergebnisse mit den Daten auf 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.
Sonnenstandsberechner.zip (27KB) [info] 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.