Und läuft's jetzt?
Sonnenposition
-
fred0815 -
2. November 2017 um 09:19 -
Unerledigt
-
-
Sonnenposition? Schau mal ob du hier fündig wirst!
-
Nein, egal, ob hell oder dunkel, es wird immer angezeigt:
CodeSonne sollte ueberm Horizon sein. azimut sieht gut aus, gute Nacht...zzzZZZzzz... Sonne sollte ueberm Horizon sein. azimut sieht gut aus, gute Nacht...zzzZZZzzz...
Ich bin gerade dabei, die Richtung für die Schrittmotoren festzulegen und den Startschalter zu basteln.
-
Hallo fred0815,
Die Datei sonnenposition.py liegt auf der SD-Karte?
Oder auf eine gemounteten Festplatte? (Wo du von mehreren Rechnern auf die gleiche Datei zugreifen könntest?)
ich bin per ssh auf dem Pi, aber normalerweise klappt das mit den Zeilenumbrüchen, wenn ich den Text kopiere und mit putty per rechtsklick einfüge.
Auf dem Raspi müssen die Dateien unix-Zeilenende (<LF>) haben. Wenn du Python auf dem Windows-PC hast und die Datei auf den PC soll, braucht sie Window-Zeilenende (<CR><LF>). Genauso wie du schilderst, mache ich es auch. Als Editor verwende ich nano oder vi.
Woran kann es liegen?
Wenn du von der Webseite mit 'raw' in den Notepad++ hereinkopierst (rechte Maustaste + Einfügen), was zeigt notepad++ an (mit Ansicht => Nicht druckbare Zeichen => Alle Zeichen anzeigen"). Es sollten unix-Zeilenenden zu sehen sein.
Sogar in Notepad++ zerreisst es mir plötzlich die Zeilenumbrüche, obwohl ich auf Unix gestellt habe.
Was bedeutet : "zerreisst es mir plötzlich die Zeilenumbrüche"?
Was genau machst du, wenn das passiert?
Ich habe die Python-Dateien mit unix-Zeilenende auf meinem Win7-Notebook gespeichert, bearbeite sie evtl. mit Notepad++ und kopiere sie per WinSCP auf den Raspi.
Gruß kle
-
Nein, egal, ob hell oder dunkel, es wird immer angezeigt:
Merkwürdig. Zumal die Zeile so gar nicht im Skript vorkommt.
Setz doch mal ein "print azimut,sonnenhoehe" ins Skript (zwischen Zeile 13 und 14) und schau, ob die gleichen Werte rauskommen wir beim Aufruf von Hand. Die Koordinaten hast Du korrigiert, ja? -
-
Zitat
Merkwürdig. Zumal die Zeile so gar nicht im Skript vorkommt.
In diesem Script von dir schon.
Das Print gibt auch Aufschluss darüber, vom Zenit werden keine 90 subtrahiert, deshalb nie im Bereich des Sonnenwinkels und beim Azimut ist es einfach nur verdreht.
-
so sieht es aus.
(Azimut: Nord = 0 deg, Ost = 90 deg, Süd = 180 deg, west = 270 deg)
(Zenith: senkrecht nach oben in den Himmel= 0 deg, Sonnenaufgang bzw Sonnenuntergang = 90 deg, Sonnenhöchststand heute in München = 65,22 deg)
Sonnenhöchststand seltsamerweise um 11:57:25 Uhr. Kommt das durch den Algorithmus zustande oder ist das 'normal'?
-
In diesem Script von dir schon.
Nö, "azimut sieht gut aus" wirst Du darin nicht finden.
Das Print gibt auch Aufschluss darüber, vom Zenit werden keine 90 subtrahiert, deshalb nie im Bereich des Sonnenwinkels und beim Azimut ist es einfach nur verdreht.
Ich schrieb ja, ich sei nicht ganz sicher, ob ich die richtigen Elemente der Rückgabe der Funktion ausgewählt habe. Aber 90 subtrahieren und irgendwas umdrehen sollte nicht so kompliziert sein, oder?
-
Zitat
Sonnenhöchststand heute in München = 65,22 deg
Wohl kaum, nicht mal 30 Grad überm Horizont.
ZitatSonnenhöchststand seltsamerweise um 11:57:25 Uhr. Kommt das durch den Algorithmus zustande oder ist das 'normal'?
Das liegt an der Winterzeit.
ZitatNö, "azimut sieht gut aus" wirst Du darin nicht finden.
Aber:
ZitatAber 90 subtrahieren und irgendwas umdrehen sollte nicht so kompliziert sein, oder?
Nö, aber jetzt zock ich erst mal was zur entspannung
-
Wohl kaum, nicht mal 30 Grad überm Horizont
~30 Grad ist doch plausibel, südlicher Wendekreis ~ -23Grad. 2/3 davon ist -16Grad (da steht die Sonne im Moment mittags senkrecht) und 48Grad (München) also -16Grad + 48 Grad = 64 Grad.
Diese Sonne kannst Du mit der Maus über den Himmel schieben. Am Meridian ist sie heute unter 30Grad über dem Horizont.
Das liegt an der Winterzeit
In den Sonne-Link steht auch 11:57 für Meridian, Weist Du einen Link wie das mit der Winterzeit zusammenhängt?
Gruß kle
-
Kolläschn,
Weist Du einen Link wie das mit der Winterzeit zusammenhängt?
Die Sommerzeit ist MESZ, die Winterzeit ist MEZ (Mitteleuropäische Zeit), also Normalzeit.
Die beiden unterscheiden sich um eine Stunde, um die vor- oder zurückgestellt wird.
Jetzt (MEZ) steht die Sonne um ca. 12:00 im Zenit. Also passt die Rechnung. Die paar Minuten Abweichung liegen in der Abweichung vom 0. Längengrad begründet. Also passt alles...
Ach, was war das früher noch schön. Da lief die Zeit einfach so von dannen. Die Uhren musste man nicht alle naselang umstellen. Es gab nur MEZ.
Beste Grüße
Andreas
-
Die Zeit des Sonnenhöchststandes ist 12:00 Uhr WOZ (Wahre Ortszeit). Wie weit diese von MEZ/MESZ abweicht, kann man berechnen. Es hängt von der geografischen Postition ab.
-
Jetzt stehe ich natürlich vor dem nächsten Problem.
In diesem Script dreht sich der Schrittmotor ja unendlich nach links.
Wo und wie im Script muss ich jetzt ansetzen, dass sich der Motor nur soweit dreht, bis er den Kontaktschalter erreicht hat, oder in einen Timeout läuft und dann mein Bashscript zum zurücksetzen der GPIOs auf 0 ausführt ?
Wobei letzteres bestimmt auch mit Python geht, aber mit der shell kenne ich mich besser aus und bekomme ohne Hilfe mehr gebacken.
Das ist nochmal der Code, welcher den Schrittmotor nach links drehen lässt:
Python
Alles anzeigen#!/usr/bin/python3 # Importiere Bibliotheken import sys import time import RPi.GPIO as GPIO # Nutze BCM-GPIO-Belegung # statt physikalischer Pin-Nummern GPIO.setmode(GPIO.BCM) # Definiere 4 Pins für Stepper # Physische Pins 37,35,33,31 # BCM 26,19,13,6 StepPins = [26,19,13,6] # Pins als Ausgang festlegen for pin in StepPins: print("Setze GPIOs") GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) # Definiere erweiterte Sequenz # aus dem Datenblatt des Motors Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) # 1 = 8-Schrittsequenz, langsamer mit mehr Kraft im Uhrzeigersinn # 2 = 4-Schrittsequenz, schneller mit weniger Kraft im Uhrzeigersinn # -1 = 8-Schrittsequenz, langsamer mit mehr Kraft gegen den Uhrzeigersinn # -2 = 4-Schrittsequenz, schneller mit weniger Kraft gegen den Uhrzeigersinn StepDir = -1 #Lese Wartezeit aus der Kommandozeile if len(sys.argv)>1: WaitTime = int(sys.argv[1])/float(1000) else: WaitTime = 10/float(1000) # Variable initialisieren StepCounter = 0 # Starte Hauptschleife while True: print (StepCounter,) print (Seq[StepCounter]) for pin in range(0,4): xpin=StepPins[pin]# GPIO abarbeiten if Seq[StepCounter][pin]!=0: print ((" Enable GPIO %i") %(xpin)) GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir # Am Ende der Sequenz # erneut starten if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir # Wartezeit time.sleep(WaitTime)
P.S.: Mit der alten Forensoftware konnte ich per copy&paste den Code direkt zw. manuell geschriebenem [ code ] und [ / code ] packen,ohne dass es mir die Einrückungen zerrissen hat, das geht mit der neuen Forensoftware nicht mehr, da muss ich immer auf das Code-Zeichen klicken und dort den Code einfügen. Nun ja.
Im übrigen habe ich hier noch eine interessante Seite zur Sonnenberechnung mit dem Arduino gefunden, die ich niemandem vorenthalten möchte:
Doofe Umlaute in Links, wenn der Link nicht geht, dann nehmt den englischen, oder geht einfach auf wiki.happylab.at und sucht nach Sonnenstandsberechner.
http://wiki.happylab.at/w/Sonnenstandsberechner_(für_sun_tracker_devices)
-
Hm, ich bin schon die ganze Zeit am rumprobieren und jetzt bewegt sich der Schrittmotor gar nicht mehr, obwohl in der Konsole steht, dass der Motor gedreht wird. Das Testscript läuft, aber mein vermurkster Code nicht:
Python
Alles anzeigen#!/usr/bin/python3 #Benötigte Imports import sunposition import datetime import time import os import sys import RPi.GPIO as GPIO from subprocess import call #GPIOs als BCM GPIO.setmode(GPIO.BCM) #Pins für den Azimut-Schrittmotor StepPins = [26,19,13,6] #Endpositionsschalter Schalter = [5,1,7,8] #Ortsbestimmung lat = -61.00 #lat = 48.01 lon = 7.83 elevation = 240 #Bequemlichkeit sekundenueberpruefungsintervall = 600 minutenueberpruefungsintervall = (sekundenueberpruefungsintervall/60) for pin in StepPins: print("Setze GPIOs {0} für Sonnenazimut-Schrittmotor".format(StepPins)) GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) for Endschalter in Schalter: print("Setze Schalter an Pin {0} als Eingang".format(Endschalter)) GPIO.setup(Endschalter,GPIO.IN) def main(): while True: azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] # print (sonnenhoehe,azimut) if sonnenhoehe > 90 and 65 < sonnenhoehe: print("Sonnenzenit {0:.0f} Grad, also unterm Horizont, prüfe in {1:.0f} Minuten nochmal.".format(sonnenhoehe, minutenueberpruefungsintervall)) else: print("Sonnenzenit {0:.0f} Grad, also überm Horizont, nächste Prüfung in {1:.0f} Minuten.".format(sonnenhoehe, minutenueberpruefungsintervall)) if azimut > 60 and azimut < 300: print("Sonnenazimut {0:.0f} Grad, also zw. Ost und West, nächste Prüfung in {1:.0f} Minuten.".format(azimut, minutenueberpruefungsintervall)) #Wenn Schrittmotor ganz links, fahre nach rechts print("Ich versuche den Azimut-Schrittmotor ganz nach links nach Osten an den Startschalter zu fahren.") if GPIO.input(5) == GPIO.HIGH: print("Der Azimut-Schrittmotor ist schon ganz links bzw. östlich,") print("also beim Sonnenaufgang, ich bereite mich darauf vor,") print("der Sonne zu folgen, die kann sich jetzt nur noch nach rechts bewegen.") time.sleep(0.5) Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = 1 WaitTime = 100/float(1000) StepCounter = 0 while True: print (StepCounter,) print (Seq[StepCounter]) for pin in range(0,4): xpin=StepPins[pin]# GPIO abarbeiten if Seq[StepCounter][pin]!=0: print ((" Enable GPIO %i") %(xpin)) GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) else: print("Fahre jetzt mit Azimut-Schrittmotor nach links bzw. Osten") Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = -1 WaitTime = 100/float(1000) StepCounter = 0 while True: print (StepCounter,) print (Seq[StepCounter]) for pin in range(0,4): xpin=StepPins[pin]# GPIO abarbeiten if Seq[StepCounter][pin]!=0: print ((" Enable GPIO %i") %(xpin)) GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) ###### else: print("Sonnenazimut {0:.0f} Grad, also zu weit im Westen oder noch nicht im Osten, prüfe in {1:.0f} Minuten nochmal".format(azimut, minutenueberpruefungsintervall)) time.sleep(sekundenueberpruefungsintervall) if __name__ == "__main__": main()
EDIT: War natürlich mein Fehler, falsche Einrückung...
Python
Alles anzeigen#!/usr/bin/python3 #Benötigte Imports import sunposition import datetime import time import os import sys import RPi.GPIO as GPIO from subprocess import call #GPIOs als BCM GPIO.setmode(GPIO.BCM) #Pins für den Azimut-Schrittmotor StepPins = [26,19,13,6] #Endpositionsschalter Schalter = [5,1,7,8] #Ortsbestimmung lat = -61.00 #lat = 48.01 lon = 7.83 elevation = 240 #Bequemlichkeit sekundenueberpruefungsintervall = 600 minutenueberpruefungsintervall = (sekundenueberpruefungsintervall/60) for pin in StepPins: print("Setze GPIOs {0} für Sonnenazimut-Schrittmotor".format(StepPins)) GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) for Endschalter in Schalter: print("Setze Schalter an Pin {0} als Eingang".format(Endschalter)) GPIO.setup(Endschalter,GPIO.IN) def main(): while True: azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print (sonnenhoehe,azimut) if sonnenhoehe > 90 and 65 < sonnenhoehe: print("Sonnenzenit {0:.0f} Grad, also unterm Horizont, prüfe in {1:.0f} Minuten nochmal.".format(sonnenhoehe, minutenueberpruefungsintervall)) else: print("Sonnenzenit {0:.0f} Grad, also überm Horizont, nächste Prüfung in {1:.0f} Minuten.".format(sonnenhoehe, minutenueberpruefungsintervall)) if azimut > 60 and azimut < 300: print("Sonnenazimut {0:.0f} Grad, also zw. Ost und West, nächste Prüfung in {1:.0f} Minuten.".format(azimut, minutenueberpruefungsintervall)) #Wenn Schrittmotor ganz links, fahre nach rechts print("Ich versuche den Azimut-Schrittmotor ganz nach links nach Osten an den Startschalter zu fahren.") if GPIO.input(5) == GPIO.HIGH: print("Der Azimut-Schrittmotor ist schon ganz links bzw. östlich,") print("also beim Sonnenaufgang, ich bereite mich darauf vor,") print("der Sonne zu folgen, die kann sich jetzt nur noch nach rechts bewegen.") time.sleep(0.5) Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = 1 WaitTime = 100/float(1000) StepCounter = 0 while True: print (StepCounter,) print (Seq[StepCounter]) for pin in range(0,4): xpin=StepPins[pin]# GPIO abarbeiten if Seq[StepCounter][pin]!=0: print ((" Enable GPIO %i") %(xpin)) GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) else: print("Fahre jetzt mit Azimut-Schrittmotor nach links bzw. Osten") Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = -1 WaitTime = 100/float(1000) StepCounter = 0 while True: print (StepCounter,) print (Seq[StepCounter]) for pin in range(0,4): xpin=StepPins[pin]# GPIO abarbeiten if Seq[StepCounter][pin]!=0: print ((" Enable GPIO %i") %(xpin)) GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) ###### else: print("Sonnenazimut {0:.0f} Grad, also zu weit im Westen oder noch nicht im Osten, prüfe in {1:.0f} Minuten nochmal".format(azimut, minutenueberpruefungsintervall)) time.sleep(sekundenueberpruefungsintervall) if __name__ == "__main__": main()
-
So, hier mal die vorläufig letzte Version des Python-Scripts für den Azimut-Schrittmotor.
Es fehlt noch sehr viel, der Code ist bestimmt total wirr etc. Wer möchte, kann ihn ja verändern und verbessern, wie er möchte.
Insbesondere fehlt die Funktion die 4 GPIOs für den Azimut-Schrittmotor wieder auf 0 zu setzen, wenn das Programm beendet wird, in dem Fall erwärmt sich der Schrittmotor, aber ich bekomme es einfach nicht hin.
Aber als Workaround lässt sich überprüfen, ob das Python-Script läuft. Wenn das Python-Script nicht läuft, wird ein Bashscript ausgeführt, welches die 4 GPIOs auf 0 setzt. Per crontab wird das Python-Script morgens wieder gestartet.
Im Einsatz ist so ein Schrittmotor mit ULN2003, ohne Zahnräder, lässt sich auch mit 12 Volt betreiben.
Für eine Umdrehung sind ca. 4096 Schritte nötig.
sunstepper_azimut.py
Python
Alles anzeigen#!/usr/bin/python3 #Benötigte Imports import sunposition import datetime import time import os import sys import RPi.GPIO as GPIO from subprocess import call GPIO.setmode(GPIO.BCM) #Pins für den Azimut-Schrittmotor StepPins = [26,19,13,6] #Endpositionsschalter AzimutSchalter = [5,1] #Ortsbestimmung #lat = positiv = nördliche Hemisphäre #lon = positiv = östlich von London #elevation = Höhe #Bsp.: Flugplatz Freiburg #lat = 48.02 #lon = 7.83 #elevation = 237 lat = 48.01 lon = 7.83 elevation = 249 #Umrechnung Sekunden in Minuten sekundenueberpruefungsintervall = 600 minutenueberpruefungsintervall = (sekundenueberpruefungsintervall/60) for pin in StepPins: print("Setze GPIOs {0} für Azimut-Schrittmotor".format(StepPins)) GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) for Endschalter in AzimutSchalter: print("Setze Endpositions-Schalter an Pin {0} als Eingang".format(Endschalter)) GPIO.setup(Endschalter,GPIO.IN) def main(): while True: azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] # print (sonnenhoehe,azimut) if sonnenhoehe > 90 and 65 < sonnenhoehe: print("Sonnenzenit {0:.0f} Grad, also unterm Horizont, prüfe in {1:.0f} Minuten nochmal.".format(sonnenhoehe, minutenueberpruefungsintervall)) time.sleep(sekundenueberpruefungsintervall) else: print("Sonnenzenit {0:.0f} Grad, also überm Horizont, nächste Prüfung in {1:.0f} Minuten.".format(sonnenhoehe, minutenueberpruefungsintervall)) if azimut > 60 and azimut < 300: print("Sonnenazimut {0:.0f} Grad, also zw. Ost und West, nächste Prüfung in {1:.0f} Minuten.".format(azimut, minutenueberpruefungsintervall)) #Wenn Schrittmotor ganz links, fahre nach rechts print("Ich prüfe, ob der Azimut-Schrittmotor ganz links bzw. im Osten am Startschalter ist.") while True: while GPIO.input(5) == GPIO.LOW: print("Nein, der Azimut-Schrittmotor hat den linker Kontaktschalter") print("noch nicht erreicht, fahre nach links bzw. Osten.") time.sleep(0.1) Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = -1 #Geschwindigkeit mind. 10/float(1000) empfohlen, darunter wirds eng WaitTime = 10/float(1000) StepCounter = 0 linksschritte = 0 while linksschritte < 199999: print("{0} Linksschritte".format(linksschritte)) print("Sequenz {0}".format(StepCounter)) print (Seq[StepCounter]) for pin in range(0,4): xpin=StepPins[pin]# GPIO abarbeiten if Seq[StepCounter][pin]!=0: print ((" Enable GPIO %i") %(xpin)) GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir linksschritte = linksschritte + 1 if GPIO.input(5) == GPIO.HIGH: print("Azimut-Schrittmotor hat den linker Kontaktschalter erreicht.") linksschritte = 200000 if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) else: time.sleep(0.1) print("Der Azimut-Schrittmotor ist ganz links bzw. Osten.") while GPIO.input(1) == GPIO.LOW: print("Bewege Azimut-Schrittmotor jetzt nach rechts bzw. Westen.") Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = 1 #Geschwindigkeit mind. 10/float(1000) empfohlen, darunter wirds eng WaitTime = 1000/float(1000) StepCounter = 0 rechtsschritte = 0 while rechtsschritte < 199999: print(" {0} Rechtsschritte".format(rechtsschritte)) print("Sequenz {0}".format(StepCounter)) print (Seq[StepCounter]) for pin in range(0,4): xpin=StepPins[pin]# GPIO abarbeiten if Seq[StepCounter][pin]!=0: print ((" Enable GPIO %i") %(xpin)) GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir rechtsschritte = rechtsschritte + 1 if GPIO.input(1) == GPIO.HIGH: rechtsschritte = 200000 if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) else: print("der Azimut-Schrittmotor ist ganz rechts bzw. im Westen.") else: print("Sonnenazimut {0:.0f} Grad, also zu weit im Westen oder noch nicht im Osten, prüfe in {1:.0f} Minuten nochmal".format(azimut, minutenueberpruefungsintervall)) time.sleep(sekundenueberpruefungsintervall) if __name__ == "__main__": main()
Aber das Python-Script macht immerhin folgendes:
Es wartet auf den Sonnenaufgang, prüft, ob der Azimut-Schrittmotor links am Schalter ist, wenn nicht fährt er nach links bis zum Schalter und von dort aus langsam nach rechts, bis zum rechten Schalter, dann wieder zurück.
-
Bevor das Thema noch Moos ansetzt, hier mal ein zwischenzeitliches Update, nicht, dass jemand auf die Idee kommt, der Thread sei erledigt.
Python
Alles anzeigen#!/usr/bin/python3 ################################################################################### # Achtung, das Programm geht falsch, # # wenn es nach Sonnenaufgang gestartet wird # # und erst am nächsten Tag richtig # # nachdem es sich kalibriert hat # ################################################################################### # ToDo-Liste: # # Code vernünftig schreiben und Zenit implementieren # # Nach dem kalibrieren direkt den Azimut anfahren und von dort aus weiter # ################################################################################### # Für bunte Schrift mit "pip3 install termcolor" termcolor installieren # # sonst gibts eine Fehlermeldung, also installieren, oder Code ändern (cprint) # ################################################################################### from termcolor import colored, cprint import sunposition import datetime from datetime import date import time import os import sys import RPi.GPIO as GPIO from subprocess import call # Pins für den Azimut-Schrittmotor StepPins = [18,23,24,25] # Azimutschalter links und rechts AzimutSchalter = [17,21] # Zenitschalter, noch nicht implementiert ZenitSchalter = [22,5] ################################################################################### # Ortsbestimmung und Höhe über Meeresspiegel # # lat = positiv = nördliche Hemisphäre # # lon = positiv = östlich von London # # elevation = Höhe über NN (nicht Mittelmeer) # # Bsp.: Flugplatz Freiburg # # lat = 48.02 # # lon = 7.83 # # elevation = 237 # ################################################################################### lat = 48.01 lon = 7.83 elevation = 249 pruefintervall = 600 #Wartezeit für den Schrittmotor mind. 10/float(1000), sonst stottert der Motor WaitTime = 10/float(1000) #################################################################################### # Der Schrittmotor macht bei WaitTime 10/float(1000) ca. 70000 Schritte pro Stunde # # also 1680000 Schritte in 24 Stunden # # Kreiselfickermodus für Polarregionen 1680000 # #################################################################################### SchritteproStd = 70000 max_sonnenstd = 16 min_sonnenstd = 8 max_linksschritte = SchritteproStd*max_sonnenstd max_Kalibrierungsschritte = SchritteproStd*max_sonnenstd max_schritte_jan = SchritteproStd*9 max_schritte_feb = SchritteproStd*10 max_schritte_märz = SchritteproStd*11 max_schritte_april = SchritteproStd*14 max_schritte_mai = SchritteproStd*max_sonnenstd max_schritte_juni = SchritteproStd*max_sonnenstd max_schritte_juli = SchritteproStd*max_sonnenstd max_schritte_august = SchritteproStd*15 max_schritte_sep = SchritteproStd*13 max_schritte_okt = SchritteproStd*11 max_schritte_nov = SchritteproStd*10 max_schritte_dez = SchritteproStd*min_sonnenstd #################################################################################### # Nachtmodus je Monat in Sekunden # # Die Werte sind an die geographische Lage anzupassen # #################################################################################### jan_nacht = int(50400) feb_nacht = int(46800) märz_nacht = int(39600) april_nacht = int(36000) mai_nacht = int(32400) juni_nacht = int(28800) juli_nacht = int(32400) aug_nacht = int(36000) sep_nacht = int(46800) okt_nacht = int(50400) nov_nacht = int(54000) dez_nacht = int(54000) for pin in StepPins: cprint("Setze GPIOs für Azimut-Schrittmotor", "green") GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) for pin in AzimutSchalter: cprint("Setze GPIOs für Azimut-Schalter", "green") GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.IN) GPIO.input(pin) for pin in ZenitSchalter: cprint("Setze GPIOs für Zenit-Schalter", "green") GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.IN) GPIO.input(pin) def Pinsaus(): for pin in StepPins: GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) def Kalibrierung(): Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = -1 StepCounter = 0 linksschritte = 0 azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print(sonnenhoehe,azimut) while GPIO.input(17) == GPIO.LOW and linksschritte < max_Kalibrierungsschritte: for pin in range(0,4): xpin=StepPins[pin] if Seq[StepCounter][pin]!=0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir linksschritte = linksschritte + 1 if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) if GPIO.input(17) == GPIO.HIGH: if GPIO.input(17) == GPIO.HIGH: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) cprint("Kalibrierung abgeschlossen", "green") Globalcounter = int(linksschritte) print("{} Schritte benötigt".format(Globalcounter)) Pinsaus() break if linksschritte > max_Kalibrierungsschritte-1 and GPIO.input(17) == GPIO.LOW: cprint("Maximale Schritte erreicht, entweder Zahl (max_Kalibrierungsschritte) zu niedrig eingestellt,", "red") cprint("Verkabelung falsch oder defekt, oder Schalter nicht richtig angeschlossen oder defekt", "red") Pinsaus() break else: cprint("Fehler beim lesen des GPIO für linken Kontaktschalter.", "red") Pinsaus() def Schritte(): cprint("Starte das Programm", "green") azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] while True: azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] if sonnenhoehe > 80 and 65 < sonnenhoehe or azimut > 240 and azimut < 95: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) print(sonnenhoehe,azimut) cprint("Sonne unterm Horizont, oder zu weit im Westen oder Osten.", "green") print("Prüfe in {} Minuten nochmal.".format(pruefintervall/60)) time.sleep(pruefintervall) break Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = 1 StepCounter = 0 schritte = 0 while True: now = datetime.datetime.now() if now.month == 1: max_schritte = max_schritte_jan if now.month == 2: max_schritte = max_schritte_feb if now.month == 3: max_schritte = max_schritte_märz if now.month == 4: max_schritte = max_schritte_april if now.month == 5: max_schritte = max_schritte_mai if now.month == 6: max_schritte = max_schritte_juni if now.month == 7: max_schritte = max_schritte_juli if now.month == 8: max_schritte = max_schritte_aug if now.month == 9: max_schritte = max_schritte_sep if now.month == 10: max_schritte = max_schritte_okt if now.month == 11: max_schritte = max_schritte_nov if now.month == 12: max_schritte = max_schritte_dez for pin in range(0,4): xpin=StepPins[pin] if Seq[StepCounter][pin]!=0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir schritte = schritte + 1 if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] if GPIO.input(21) == GPIO.HIGH or schritte > max_schritte-1 or sonnenhoehe > 80 and 65 < sonnenhoehe or azimut > 240 and azimut < 95: print(sonnenhoehe, azimut, GPIO.input(21)) cprint("Sonne zu tief oder zu weit im Westen oder Osten, oder", "green") cprint("Kontaktschalter erreicht oder maximale Schritte für heute erreicht", "green") Globalcounter = int(schritte) print("{} Schritte gemacht, als Maximum waren {} Schritte vorgesehen.".format(Globalcounter, max_schritte)) Pinsaus() if now.month == 1: print("Gute Nacht am {}. Januar, mache jetzt {} Stunden Pause".format(now.day, int(jan_nacht/3600))) time.sleep(int(jan_nacht)) break if now.month == 2: print("Gute Nacht am {}. Februar, mache jetzt {} Stunden Pause".format(now.day, int(feb_nacht/3600))) time.sleep(int(feb_nacht)) break if now.month == 3: print("Gute Nacht am {}. März, mache jetzt {} Stunden Pause".format(now.day, int(märz_nacht/3600))) time.sleep(int(märz_nacht)) break if now.month == 4: print("Gute Nacht am {}. April, mache jetzt {} Stunden Pause".format(now.day, int(april_nacht/3600))) time.sleep(int(april_nacht)) break if now.month == 5: print("Gute Nacht am {}. Mai, mache jetzt {} Stunden Pause".format(now.day, int(mai_nacht/3600))) time.sleep(int(mai_nacht)) break if now.month == 6: print("Gute Nacht am {}. Juni, mache jetzt {} Stunden Pause".format(now.day, int(juni_nacht/3600))) time.sleep(int(juni_nacht)) break if now.month == 7: print("Gute Nacht am {}. Juli, mache jetzt {} Stunden Pause".format(now.day, int(juli_nacht/3600))) time.sleep(int(juli_nacht)) break if now.month == 8: print("Gute Nacht am {}. August, mache jetzt {} Stunden Pause".format(now.day, int(aug_nacht/3600))) time.sleep(int(aug_nacht)) break if now.month == 9: print("Gute Nacht am {}. September, mache jetzt {} Stunden Pause".format(now.day, int(sep_nacht/3600))) time.sleep(int(sep_nacht)) break if now.month == 10: print("Gute Nacht am {}. Oktober, mache jetzt {} Stunden Pause".format(now.day, int(okt_nacht/3600))) time.sleep(int(okt_nacht)) break if now.month == 11: print("Gute Nacht am {}. November, mache jetzt {} Stunden Pause".format(now.day, int(nov_nacht/3600))) time.sleep(int(nov_nacht)) break if now.month == 12: print("Gute Nacht am {}. Dezember, mache jetzt {} Stunden Pause".format(now.day, int(dez_nacht/3600))) time.sleep(int(dez_nacht)) break else: cprint("Fehler in Schritte !", "red") Pinsaus() def main(): while True: try: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print(sonnenhoehe,azimut) if GPIO.input(17) == GPIO.HIGH: cprint("Ist schon kalibriert", "green") else: cprint("Kalibrierung nötig", "green") Kalibrierung() if sonnenhoehe > 80 and 65 < sonnenhoehe or azimut > 240 and azimut < 95: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) print("Sonnenhöhe {} \nAzimut {}".format(sonnenhoehe,azimut)) cprint("Sonne unterm Horizont, oder zu weit im Westen oder Osten.", "green") print("Prüfe in {} Minuten nochmal.".format(pruefintervall/60)) time.sleep(pruefintervall) now = datetime.datetime.now() if now.month == 1: print("Es ist der {}. Januar".format(now.day)) if now.month == 2: print("Es ist der {}. Februar".format(now.day)) if now.month == 3: print("Es ist der {}. März".format(now.day)) if now.month == 4: print("Es ist der {}. April".format(now.day)) if now.month == 5: print("Es ist der {}. Mai".format(now.day)) if now.month == 6: print("Es ist der {}. Juni".format(now.day)) if now.month == 7: print("Es ist der {}. Juli".format(now.day)) if now.month == 8: print("Es ist der {}. August".format(now.day)) if now.month == 9: print("Es ist der {}. September".format(now.day)) if now.month == 10: print("Es ist der {}. Oktober".format(now.day)) if now.month == 11: print("Es ist der {}. November".format(now.day)) if now.month == 12: print("Es ist der {}. Dezember".format(now.day)) Schritte() azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print(sonnenhoehe,azimut) except KeyboardInterrupt: GPIO.cleanup() else: cprint("Fehler in main !", "red") GPIO.cleanup() if __name__ == "__main__": main()
-
Hier mal die vorläufig finale Version, falls noch jemand Fehler findet, oder Verbesserungsvorschläge hat, nur her damit.
Python
Alles anzeigen#!/usr/bin/python3 ########################################################################################### # Achtung, das Programm geht falsch, # # wenn es nach Sonnenaufgang gestartet wird # # und erst am nächsten Tag richtig # # nachdem es sich kalibriert hat # ########################################################################################### # ToDo-Liste: # # Code vernünftig schreiben und Zenit implementieren # # Nach dem kalibrieren direkt den Azimut anfahren und von dort aus weiter # ########################################################################################### # Für bunte Schrift mit "pip3 install termcolor" termcolor installieren # # sonst gibts eine Fehlermeldung, also installieren, oder Code ändern (cprint) # ########################################################################################### from termcolor import colored, cprint import sunposition import datetime from datetime import date import time import os import sys from RPi import GPIO from subprocess import call # Pins für den Azimut-Schrittmotor StepPins = [18,23,24,25] # Azimutschalter links und rechts AzimutSchalter = [17,21] # Zenitschalter, noch nicht implementiert ZenitSchalter = [22,5] ########################################################################################### # Ortsbestimmung und Höhe über Meeresspiegel # # lat = positiv = nördliche Hemisphäre # # lon = positiv = östlich von Greenwich # # elevation = Höhe über NN (nicht Mittelmeer) # # Bsp.: Flugplatz Freiburg # # lat = 48.02 # # lon = 7.83 # # elevation = 237 # ########################################################################################### lat = 48.01 lon = 7.83 elevation = 249 ########################################################################################### # Prüfintervall in Sekunden. Prüft alle X Sekunden, ob die Sonne über dem Horizont ist, # # nach einem Tagesdurchgang wird sie erst nach dem Nachtschlafmodus wieder relevant. # ########################################################################################### Prüfintervall = 600 #Wartezeit für den Schrittmotor sollte mind. 10/float(1000) sein, sonst stottert der Motor# WaitTime = 10/float(1000) ########################################################################################### # Maximale Sonnenhöhe ab der die Sonne am Horizont auftaucht. In unbebauten Gegenden oder # # auf dem Ozean 90, kann in dicht bebauten Gegenden deutlich niedriger sein, z.B. 78 # # Das gleiche gilt für Mindest- und Maximalazimut, z.B. 90 (Osten) bis 270 (Westen) # # Höchste und niedrigste Sonnenstundenanzahl des Jahres: Polarregionen 24 und 0, sonst # # Ortsabhängig z.B. max. 16 im Sommer, min. 5 im Winter, also selbst anpassen. # ########################################################################################### Max_Sonnenhöhe = 80 Min_Azimut = 95 Max_Azimut = 240 Max_SonnenStd = 16 Min_SonnenStd = 8 ########################################################################################### # Wieviele Stunden soll nach einem Tagesdurchgang geschlafen werden, damit der # # Prüfintervall nach Sonnenuntergang und nachts nicht ständig abfragt ? # # Auch diese Werte sind an die geographische Lage anzupassen. # ########################################################################################### NachtStd_Jan = 14 NachtStd_Feb = 13 NachtStd_März = 11 NachtStd_April = 10 NachtStd_Mai = 9 NachtStd_Juni = 8 NachtStd_Juli = 7 NachtStd_Aug = 10 NachtStd_Sep = 13 NachtStd_Okt = 14 NachtStd_Nov = 15 NachtStd_Dez = 15 ########################################################################################### # Abhängig vom verwendeten Schrittmotor und Getriebeübersetzung. # # Der Schrittmotor macht in der Kalibierungsschleife bei WaitTime 10/float(1000) # # ca. 70000 Schritte pro Stunde, in der Schritteschleife ca 21000 Schritte pro Stunde # # Für genauere Ergebnisse 24 Stunden in der Kalibrierungschleife und 24 Stunden in der # # Schritteschleife laufen lassen. Die Kalibrierungsschleife läuft schneller durch, also # # von der Schritteschleife trennen. Maximale Kalibrierungsschritte: Wieviele Schritte # # dürfen gemacht werden, ohne dass ein defekter Kontaktschalter den Schrittmotor stoppt ? # ########################################################################################### KalibrierungsschritteproStd = 70000 Max_Kalibrierungsschritte = KalibrierungsschritteproStd*Max_SonnenStd SchritteproStd = 21000 ########################################################################################### # Maximale Schritte: Wieviele Schritte dürfen gemacht werden, ohne dass ein eventuell # # defekter, oder fehlender Kontaktschalter sicherheitshalber den Schrittmotor stoppt ? # ########################################################################################### Max_Linksschritte = SchritteproStd*Max_SonnenStd Max_Schritte_Jan = SchritteproStd*9 Max_Schritte_Feb = SchritteproStd*10 Max_Schritte_März = SchritteproStd*11 Max_Schritte_April = SchritteproStd*14 Max_Schritte_Mai = SchritteproStd*Max_SonnenStd Max_Schritte_Juni = SchritteproStd*Max_SonnenStd Max_Schritte_Juli = SchritteproStd*Max_SonnenStd Max_Schritte_Aug = SchritteproStd*15 Max_Schritte_Sep = SchritteproStd*13 Max_Schritte_Okt = SchritteproStd*11 Max_Schritte_Nov = SchritteproStd*10 Max_Schritte_Dez = SchritteproStd*Min_SonnenStd ########################################################################################### # Nachtschlafmodus in Stunden, im Winter länger als im Sommer # # Die Werte sind an die geographische Lage anzupassen # ########################################################################################### Jan_Nacht = int(NachtStd_Jan*3600) Feb_Nacht = int(NachtStd_Feb*3600) März_Nacht = int(NachtStd_März*3600) April_Nacht = int(NachtStd_April*3600) Mai_Nacht = int(NachtStd_Mai*3600) Juni_Nacht = int(NachtStd_Juni*3600) Juli_Nacht = int(NachtStd_Juli*3600) Aug_Nacht = int(NachtStd_Aug*3600) Sep_Nacht = int(NachtStd_Sep*3600) Okt_Nacht = int(NachtStd_Okt*3600) Nov_Nacht = int(NachtStd_Nov*3600) Dez_Nacht = int(NachtStd_Dez*3600) ########################################################################################### # GPIO.BCM GPIOs für den östlichen und westlichen Kontaktschalter. # ########################################################################################### Östlicher_Kontaktschalter = 17 Westlicher_Kontaktschalter = 21 ########################################################################################### # Ab hier sollten keine Änderungen mehr nötig sein. @fred0815 # # Vielen Dank an alle, die im forum-raspberrypi.de unermüdlich geholfen haben ! 6.1.2021 # ########################################################################################### for pin in StepPins: cprint("Setze GPIOs für Azimut-Schrittmotor", "green") GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) for pin in AzimutSchalter: cprint("Setze GPIOs für Azimut-Schalter", "green") GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.IN) GPIO.input(pin) for pin in ZenitSchalter: cprint("Setze GPIOs für Zenit-Schalter", "green") GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.IN) GPIO.input(pin) def Pinsaus(): for pin in StepPins: GPIO.setmode(GPIO.BCM) GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) def Kalibrierung(): Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = -1 StepCounter = 0 linksschritte = 0 azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print("Sonnenhöhe {:.0f} \nAzimut {:.0f}".format(sonnenhoehe,azimut)) while GPIO.input(Östlicher_Kontaktschalter) == GPIO.LOW and linksschritte < Max_Kalibrierungsschritte: for pin in range(0,4): xpin=StepPins[pin] if Seq[StepCounter][pin]!=0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir linksschritte = linksschritte + 1 if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) if GPIO.input(Östlicher_Kontaktschalter) == GPIO.HIGH: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) cprint("Kalibrierung abgeschlossen", "green") Globalcounter = int(linksschritte) print("{} Schritte benötigt".format(Globalcounter)) Pinsaus() break if linksschritte > Max_Kalibrierungsschritte-1 and GPIO.input(Östlicher_Kontaktschalter) == GPIO.LOW: cprint("Maximale Schritte erreicht, entweder Zahl (max_Kalibrierungsschritte) zu niedrig eingestellt,", "red") cprint("Verkabelung falsch oder defekt, oder Schalter nicht richtig angeschlossen oder defekt", "red") Pinsaus() break else: cprint("Fehler beim lesen des GPIO für linken Kontaktschalter.", "red") Pinsaus() def Schritte(): cprint("Starte das Programm", "green") print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print("Sonnenhöhe {:.0f} \nAzimut {:.0f}".format(sonnenhoehe,azimut)) while True: azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] if sonnenhoehe > Max_Sonnenhöhe or azimut > Max_Azimut and azimut < Min_Azimut: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) print("Sonnenhöhe {:.0f} \nAzimut {:.0f}".format(sonnenhoehe,azimut)) cprint("Sonne unterm Horizont, oder zu weit im Westen oder Osten.", "green") print("Prüfe in {} Minuten nochmal.".format(int(Prüfintervall/60))) time.sleep(Prüfintervall) break Seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]] StepCount = len(Seq) StepDir = 1 StepCounter = 0 schritte = 0 while True: now = datetime.datetime.now() if now.month == 1: max_schritte = Max_Schritte_Jan if now.month == 2: max_schritte = Max_Schritte_Feb if now.month == 3: max_schritte = Max_Schritte_März if now.month == 4: max_schritte = Max_Schritte_April if now.month == 5: max_schritte = Max_Schritte_Mai if now.month == 6: max_schritte = Max_Schritte_Juni if now.month == 7: max_schritte = Max_Schritte_Juli if now.month == 8: max_schritte = Max_Schritte_Aug if now.month == 9: max_schritte = Max_Schritte_Sep if now.month == 10: max_schritte = Max_Schritte_Okt if now.month == 11: max_schritte = Max_Schritte_Nov if now.month == 12: max_schritte = Max_Schritte_Dez for pin in range(0,4): xpin=StepPins[pin] if Seq[StepCounter][pin]!=0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += StepDir schritte = schritte + 1 if (StepCounter>=StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount+StepDir time.sleep(WaitTime) azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] if GPIO.input(Westlicher_Kontaktschalter) == GPIO.HIGH or schritte > max_schritte-1 or sonnenhoehe > Max_Sonnenhöhe or azimut > Max_Azimut and azimut < Min_Azimut: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) print("Sonnenhöhe {:.0f} \nAzimut {:.0f}\nKontaktschalter rechts {}".format(sonnenhoehe,azimut, GPIO.input(21))) cprint("Sonne zu tief oder zu weit im Westen oder Osten, oder", "green") cprint("Kontaktschalter erreicht oder maximale Schritte für heute erreicht", "green") Globalcounter = int(schritte) print("{} Schritte gemacht, als Maximum waren {} Schritte vorgesehen.".format(Globalcounter, max_schritte)) print("Es wurden {} Umdrehungen gemacht, maximal vorgesehen waren {} Umdrehungen".format(Globalcounter/4096, max_schritte/4096)) Pinsaus() if now.month == 1: print("Gute Nacht am {}. Januar, mache jetzt {} Stunden Pause".format(now.day, int(Jan_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Jan_Nacht)) break if now.month == 2: print("Gute Nacht am {}. Februar, mache jetzt {} Stunden Pause".format(now.day, int(Feb_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Feb_Nacht)) break if now.month == 3: print("Gute Nacht am {}. März, mache jetzt {} Stunden Pause".format(now.day, int(März_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(März_Nacht)) break if now.month == 4: print("Gute Nacht am {}. April, mache jetzt {} Stunden Pause".format(now.day, int(April_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(April_Nacht)) break if now.month == 5: print("Gute Nacht am {}. Mai, mache jetzt {} Stunden Pause".format(now.day, int(Mai_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Mai_Nacht)) break if now.month == 6: print("Gute Nacht am {}. Juni, mache jetzt {} Stunden Pause".format(now.day, int(Juni_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Juni_Nacht)) break if now.month == 7: print("Gute Nacht am {}. Juli, mache jetzt {} Stunden Pause".format(now.day, int(Juli_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Juli_Nacht)) break if now.month == 8: print("Gute Nacht am {}. August, mache jetzt {} Stunden Pause".format(now.day, int(Aug_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Aug_Nacht)) break if now.month == 9: print("Gute Nacht am {}. September, mache jetzt {} Stunden Pause".format(now.day, int(Sep_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Sep_Nacht)) break if now.month == 10: print("Gute Nacht am {}. Oktober, mache jetzt {} Stunden Pause".format(now.day, int(Okt_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Okt_Nacht)) break if now.month == 11: print("Gute Nacht am {}. November, mache jetzt {} Stunden Pause".format(now.day, int(Nov_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Nov_Nacht)) break if now.month == 12: print("Gute Nacht am {}. Dezember, mache jetzt {} Stunden Pause".format(now.day, int(Dez_Nacht/3600))) print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) time.sleep(int(Dez_Nacht)) break else: cprint("Fehler in Schritte !", "red") Pinsaus() def main(): while True: try: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print("Sonnenhöhe {:.0f} \nAzimut {:.0f}".format(sonnenhoehe,azimut)) if GPIO.input(Östlicher_Kontaktschalter) == GPIO.HIGH: cprint("Bin in Startposition", "green") else: cprint("Kalibrierung nötig", "green") Kalibrierung() if sonnenhoehe > Max_Sonnenhöhe or azimut > Max_Azimut and azimut < Min_Azimut: print(time.strftime('%Y-%m-%d %H:%M', time.localtime())) print("Sonnenhöhe {:.0f} \nAzimut {:.0f}".format(sonnenhoehe,azimut)) cprint("Sonne unterm Horizont, oder zu weit im Westen oder Osten.", "green") print("Prüfe in {} Minuten nochmal.".format(int(Prüfintervall/60))) time.sleep(Prüfintervall) now = datetime.datetime.now() if now.month == 1: print("Es ist der {}. Januar".format(now.day)) if now.month == 2: print("Es ist der {}. Februar".format(now.day)) if now.month == 3: print("Es ist der {}. März".format(now.day)) if now.month == 4: print("Es ist der {}. April".format(now.day)) if now.month == 5: print("Es ist der {}. Mai".format(now.day)) if now.month == 6: print("Es ist der {}. Juni".format(now.day)) if now.month == 7: print("Es ist der {}. Juli".format(now.day)) if now.month == 8: print("Es ist der {}. August".format(now.day)) if now.month == 9: print("Es ist der {}. September".format(now.day)) if now.month == 10: print("Es ist der {}. Oktober".format(now.day)) if now.month == 11: print("Es ist der {}. November".format(now.day)) if now.month == 12: print("Es ist der {}. Dezember".format(now.day)) Schritte() azimut,sonnenhoehe = sunposition.sunpos(datetime.datetime.utcnow(),lat,lon,elevation)[0:2] print("Sonnenhöhe {:.0f} \nAzimut {:.0f}".format(sonnenhoehe,azimut)) except KeyboardInterrupt: GPIO.cleanup() else: cprint("Fehler in main !", "red") GPIO.cleanup() if __name__ == "__main__": main()
Und die erforderliche sunposition.py als Anhang:
-
- Offizieller Beitrag
-
Hm, was für einen Unterschied macht das ?
-
- Offizieller Beitrag
Du willst RPi.GPIO ja nicht in GPIO umbenennen, denn dafür wäre das as da, z.B.
um dann mit z.B.
weiterzumachen.
Du willst die Klasse oder Funktion (habs mir nich genauer angesehen) GPIO vom Modul RPi importieren.
-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!