===== Sonnenstraglen-Verteiler ======
Ich wollte meiner Pflanze in der dunklen Ecke mehr Licht von der Sonne spendieren.
Idee: ESP8266 D1 mini steuert die Steppermotoren mit einem kleinen Spiegel, der die Sonne zur Pflanze umlenkt.
Anschluß des Steppermotors war einfach, Steuerung in 0-180 Grad auch. Aber wie muss ich den Spiegel ausrichten?
a) Habe einen LDR, der seine Info an MQTT schickt abgefragt und die Stepper-Motoren von 0-180 laufen lassen. Ergebnis: Dauert ewig, und 10 Grad ist viel zu viel. Dann habe ich einen Joystick anschliessen wollen. Mist, der D1 mini hat nur einen A/D-Wandler. Steuere jetzt mit'nach oben' den einen Steppermotor hoch/runter und wieder zurück. Mit 'nach unten' wird der andere Steppermotor von 0-180 Grad und dann zurück bewegt. Man muss nur rechtzeitig stoppen :) Dann drückt man den Joystick nach links und das Programm versucht den Spiegel anhand der Helligkeit am LDR auszurichten. Erst in 2 Grad, dann in 1 Grad Intervallen.
Ergebnis: Funktioniert nicht. Stepper ist nicht genau genug, ein Grad auch nicht. Eine neue Idee muss her.
b) Sonnenstand berechnen. Habe für den ESP nicht wirklich was gefunden. Versuche es jetzt mit '[[https://pysolar.readthedocs.io/en/latest/#|Pysolar]]' und '[[https://github.com/SolarFlower-Vikasa/SunFlower|SolarFlower-Vikasa/SunFlower]]'.
sudo pip install pysolar
sudo pip3 install pytz
Das Beispiel auf der Pysolar-Seite ging nicht wegen UTC. weil man bei now() wohl eine Zeitzone mit angeben muss. Daher geht der zweite Teil des Beispiels.
Python 3.4.2 (default, Sep 16 2019, 19:58:00)
from pysolar.solar import *
from pytz import timezone
import datetime
localtz = timezone('Europe/Berlin')
date = datetime.datetime.now()
aware = localtz.localize(date)
print(date)
print(aware)
print(get_altitude(48.098648,11.535505,aware))
2020-04-08 17:44:38.315531
2020-04-08 17:44:38.315531+02:00
20.7330361657
das ist dann der Winkel (Höhe) überm Horizont.
Der Azimuth, also der Winkel von Nord aus gezählt (90 Grad ist Ost, 270 Grad ist West):
get_azimuth(48.098648,11.535505,aware)
257.8259073106135
Wenn ich mir jetzt die Daten aus der api.darksky.net hole, und Sonnenaufgang/Untergang einsetze, kommt folgendes bei raus:
"latitude":48.098648,"longitude":11.535505,"timezone":"Europe/Berlin","sunriseTime":1586320680,"sunsetTime":1586368500
Sonnenaufgang:
dt_object = datetime.datetime.fromtimestamp(1586320680)
aware = localtz.localize(dt_object)
print(aware)
print(get_altitude(48.098648,11.535505,aware))
get_azimuth(48.098648,11.535505,aware)
2020-04-08 06:38:00+02:00
-0.143065700875
78.093284635398589
Sonnenuntergang:
dt_object = datetime.datetime.fromtimestamp(1586368500)
aware = localtz.localize(dt_object)
print(aware)
print(get_altitude(48.098648,11.535505,aware))
get_azimuth(48.098648,11.535505,aware)
2020-04-08 19:55:00+02:00
-0.890173425482
282.39631019775555
Mittags sieht es dann so aus:
>>> date = datetime.datetime(2020, 4, 8, 13, 15, 35, 0)
>>> aware = localtz.localize(date)
>>> print(date)
2020-04-08 13:15:35
>>> print(aware)
2020-04-08 13:15:35+02:00
>>> print(get_altitude(48.098648,11.535505,aware))
49.3856527964
>>> get_azimuth(48.098648,11.535505,aware)
180.01206147298223
>>>
Sonnenverlauf: https://www.sonnenverlauf.de