Sonnenposition

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Moin, ich weiss grad nicht wohin mit dem Thema, also packe ich das mal hierhin.=O

    Es gibt ja schon einiges zu dem Thema, aber nicht das für mich passende, nämlich ein funktionierender Code.

    Ich bin gerade auf diese Seite gestossen, da lässt sich die Sonnenposition und Winkel Zeit- und Standortabhängig errechnen:

    http://www.volker-quaschning.de/datserv/sunpos/index.php

    Das hätte ich gerne für meinen Pi, leider finde ich keinen Quellcode dazu.

    Weiss jemand, woher ich diesen Quellcode bekommen kann ?

    Im späteren Verlauf möchte ich die Daten zum steuern eines Schrittmotors nutzen.

    :helpnew:

    MfG

  • Ja, so ungefähr. Der nette Prof. der Seite hat mir zurückgeschrieben und auf den Code verwiesen, welcher allerdings in C geschrieben ist. Den wollte ich auch schon mal zum laufen bringen, hat aber nicht geklappt:

    http://rredc.nrel.gov/solar/codesandalgorithms/solpos/

    Das Script sunposition.py läuft aber gut.

    Wenn ich es jetzt noch schaffe, die Kommastellen vom Azimut und Zenit abzuschneiden und die Zahl 90 vom Zenit zu subtrahieren, bin ich schon glücklich, aber das ist eine andere Baustelle.

    :danke_ATDE:

  • Zeile 617:

     print("Azimuth, zenith = {az} {dr}, {zen} {dr}".format(az=(int(az)-90),zen=int(zen),dr=dr))

    statt

     print("Azimuth, zenith = {az} {dr}, {zen} {dr}".format(az=az,zen=zen,dr=dr))


    Oder vorher die Variablen umwandeln/umrechnen.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Super, zum füttern einer Datenbank reicht das schon, die für mich unwichtigen Zeilen habe ich jetzt auskommentiert und nur noch die 2 Zeilen:

    Code
            print("{az}".format(az=(int(az))))
            print("{zen}".format(zen=(int(zen)-90)))

    Das negative Vorzeichen lässt sich bestimmt auch noch entfernen.

    Wobei mir gerade einfällt, dass es jetzt wohl besser wäre mit C weiterzumachen, damit ich die 2 Schrittmotoren für Zenit und Azimut auch mit einem Atmega328 steuern kann, der ja weniger Strom braucht. Jedoch bin ich mir nicht sicher, ob ein Atmega328 dafür überhaupt genug Speicher hat.

    Den hier habe ich noch daheim:

    http://www.atmel.com/Images/Atmel-4…P_Datasheet.pdf

    Angenommen ich möchte bei 16 Sonnenstunden im Juli alle 30 min. nachstellen, sind das für einen Tag schon 32 Positionen für Azimut und 32 Positionen für den Zenit, also 64 Werte pro Tag, aufs Jahr gerechnet jeweils 11680 für Azimut und 11680 für den Zenit, also 23360 Werte pro Jahr, plus Tag im Jahr.

    Dazu würde ja der Code für die Schrittmotoren auch noch dazukommen. Ob das passt ? :conf:

  • Hallo fred0815,

    warum machst Du die Stellung, in der sich Deine Solarzellen ausrichten, nicht von einer Messung der Sonnenstellung abhängig und regelst immer dann nach, wenn der Winkel eine Toleranz, die Du frei festölegen kannst, überschreitet?

    Zu dem anderen Programm: Du brauchst doch die ganzen Werte nicht zu hinterlegen und je nach Datum und Zeit abzufragen. Du hast eine simple Formel, die Dir pro Datumszeitstempel die Werte für Zenit und Azimuth berechnet. Auf den berechneten Wert richtest Du Deine Solarzelle aus. Und das machst Du z.B. jede 30 Minuten.

    Dafür brauchst Du nicht viel Speicher.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Zitat

    warum machst Du die Stellung, in der sich Deine Solarzellen ausrichten, nicht von einer Messung der Sonnenstellung abhängig und regelst immer dann nach, wenn der Winkel eine Toleranz, die Du frei festölegen kannst, überschreitet?

    Hallo Andreas.

    Ich hatte mir das so vorgestellt:

    1 kleine Solarzelle (8 x 8 cm) wird tagsüber alle 30 min. von 2 Motoren per Atmel in Richtung Sonne ausgerichtet.

    Ob Schrittmotoren oder nicht, 4 Endschalter zur Positionsbestimmung.

    Sollte es zu bewölkt sein, sollen sich die grossen Solarpanele mit den stromfressenden Motoren erst gar nicht bewegen, sondern in ihrer Standardposition verharren, bis genug Sonne scheint und es sich lohnt, die grossen Panele nachzustellen.

    Auf 1 Grad genau muss es ja nicht sein, sonst könnte der Motor je nach Übersetzung ja ständig laufen.

    Da ist der Code in C:

    http://rredc.nrel.gov/solar/codesandalgorithms/solpos/

    Bekomme ich den auf dem Atmel zum laufen ?

  • Hallo fred0815,

    ob der Code auf einem Atmel zum Laufen gebracht werden kann, bin ich skeptisch. Da braucht es meiner Meinung nach mehr Speicher. Ich habe schon von Fällen gehört, da konnte wesentlich kürzerer Code nach dem Compilieren nicht übertragen werden.

    Mal anders gedacht:

    Die Sonne geht morgens in östlicher Richtung auf. Den Winkel sowie die Uhrzeit kannst Du berechnen. Du kannst das System aber auch aufwachen lassen (wenn es hell genug ist).

    Der Lauf der Sonne lässt sich ebenso berechnen - oder eben über einen LDR verfolgen. Die Richtung, in der es am hellsten ist, zeigt in Richtung Sonne.

    Somit hast Du doch eigentlich nur Mikro-Bewegungen, die sich in berechenbarer Weise (mit den Formeln) - oder empirisch (aus welcher Richtung scheint es am hellsten?) ansteuern lassen. Letzteres ist eine simple Regelung, die nur in eine Richtung geht.Damit spielt der Stromhunger der Motoren keine Rolle. Eine entsprechende Übersetzung vorausgesetzt, braucht der Motor doch nur wenige Impulse pro Zeiteinheit, um der Sonne zu folgen. Oder willst Du die Motorenstellungen über PWM erreichen (dann wäre das in der Tat stromhungrig)?

    Ich habe schon 1997 mit Solarzellen experimentiert. U.a. hatte ich eine Solarzelle am Fahrrad, um ein Radio zu betreiben. Da spielte der Winkel zur Sonne nicht wirklich eine Rolle. Deswegen gehe ich mal davon aus, dass Abweichungen von mindestens 10 ° von der optimalen Ausrichtung kaum Auswirkungen auf den Wirkungsgrad der Stromgewinnung haben.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Läuft auf 'nem Arduino Nano, aber ob die Genauigkeit dir ausreicht ...?

    http://www.cerebralmeltdown.com/projects/ardui…sition-program/

    Das habe ich im Laufe des Tages auch gefunden, aber noch nicht probiert.

    Kommt noch, der Code sieht schon schlanker aus.

    Ich habe mal den Solpos-Code auf den Atmega kompiliert, dann sind ca. 50 % der 32 Kilo belegt, aber die globalen Variablen nehmen 98 % des dynamischen Speichers ein. =O

    Das mit den LDRs ist nichts für mich, selbst wenn gar keine Sonne zu sehen ist, soll die Solarzelle in die richtige Richtung zeigen.

  • Die Idee mit dem Atmel habe ich erst mal verworfen und mache das erst mal mit dem Pi.

    Zunächst habe ich einen crontab erstellt, welcher mir alle 10 Min. jeweils eine Datei

    Code
    sonnenhoehe.txt

    und

    Code
    azimut.txt

    in

    Code
    /dev/shm/

    erstellt.

    Die Dateien erzeuge ich mit dem Pythonscript, welches llutz gepostet hat:

    https://github.com/s-bear/sun-position

    Dann habe ich mal einen groben Ablaufplan erstellt:

    Jetzt komme ich dann zum meinem Lieblingsthema: =O

    Programmieren ;)

    Da Python so beliebt ist, dachte ich, ich fange mal damit an und stosse schon auf die ersten Probleme.

    Wenn ich das so schreibe, bekomme ich Werte ausgespuckt:

    Python
    #!/usr/bin/python3
    
    azi = open("/dev/shm/azimut.txt", "r").readline()
    print(azi)
    
    sonnenhoehe = open("/dev/shm/sonnenhoehe.txt", "r").readline()
    print(sonnenhoehe)
    Code
    176
    Code
    -27

    Möchte ich aber mit

    Code
    with

    arbeiten, bekomme ich keinen Wert zurück:

    Python
    #!/usr/bin/python3
    with open("/dev/shm/azimut.txt", "r") as azimut
            azimut.read()
    print(azimut)

    sondern nur ein:

    Code
    <>_io.TextIOWrapper name='/dev/shm/azimut.txt' mode='r' encoding='UTF-8'

    :helpnew:

  • Hallo fred0815,

    weise azimut.read() einer Variablen zu und arbeite mit dieser weiter.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo fred0815,

    gewöhne Dir diese Denkweise beim Programmieren bitte nicht an:

    Danke für den Tip, so gehts:

    Python
    #!/usr/bin/python3
    with open("/dev/shm/azimut.txt", "r") as azimut:
        azimut = azimut.read()
    print (azimut)

    Zuerst ist azimut ein Dateihandle (wird beim Öffnen zugewiesen, kann ausgelesen werden, kann geschlossen werden - ein geöffnete Datei muss immer geschlossen werden!).

    Dann ist azimut eine Variable.

    Mit dem with-Statement erzwingst Du implizit das Schließen der Datei. Du hast aber den Dateihandle verloren. Irgendwann bekommst Du mit dieser Vorgehensweise und Denkweise Probleme, die Du bei großem Code kaum noch überblicken kannst.

    Nimm eine andere Variable...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Ja das kann ich später noch machen. Im Moment hänge ich an einer Fehlermeldung von Python, die wohl auf deutsch soviel heisst, wie: str() und int() lassen sich nicht vergleichen, wenn ich das richtig verstehe:

    Code
    TypeError: unorderable types: str() < int()

    Schon gelöst, indem ich

    Code
    sonnenhoehe = int(sonnenhoehe.read())

    geschrieben habe.

    Jetzt kommt schon die nächste Fehlermeldung. Schreibe ich folgendes, gehts weiter:

    Code
    if sonnenhoehe < 0:
        print("Sonne ist schon aufgegangen")

    Schreibe ich jedoch so, dass er nur im Bereich -1 und -70 sagen soll, dass die Sonne aufgegangen ist, bekomme ich einen Syntex Error:

    Code
    if sonnenhoehe < 0 and < -70:
    
        print("Sonne ist da")

    Auch gelöst, einfach noch mal mit

    Code
    or sonnenhoehe

    dazwischen:

    Code
    if sonnenhoehe < 0 or sonnenhoehe < -70:
    
        print("Sonne ist da")

    Da habe ich mich ja auf was eingelassen, aber ich habe ja den ganzen Winter Zeit.


  • Hallo fred0815,

    gehe nochmal in Dich.

    Die Bedingung ist auch erfüllt wenn sonnenhöhe einen Wert von -75 hätte - was aber außerhalb Deines Bereiches liegt.

    Denke mal an AND...

    Bei "besseren" Programmiersprachen geht sogar

    if -70 < sonnenhoehe < 0 ...

    oder gleichwertig

    if 0 > sonnenhoehe > -70 ...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo fred0815,

    jetzt stell Dir mal vor, Du würdest in Nordnorwegen leben. Es ist Hochsommer... Und Dir fällt irgendwas erst nach dem nächsten Sonnenuntergang - also 2 Monate - später auf... ;)

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!