Jump to content

Sun Tracker / Sonnennachführung


Recommended Posts

Solarmodul per Servo der Sonne nachführen.

Material: Servo-Brick, Servo, PV-Modul, Raspberry-Pi

Das Programm ist recht einfach gehalten. An Sonenauf-/untergang kann mach noch weiterentwickeln.

 

Die Zeiten im Programm sind für Tests reduziert. Das Poti ist zum manuellen Stellen, z.B. nach Sonnenuntergang ...

 

#!/usr/bin/env python

# -*- coding: utf-8 -*- 

 

HOST = "localhost"

PORT = 4223

UID_servo = "6KveiL" # Change to your UID

UID_rotary = "y5A"

servo_num = 1

 

from tinkerforge.ip_connection import IPConnection

from tinkerforge.brick_servo import Servo

from tinkerforge.bricklet_rotary_poti import RotaryPoti

from threading import *

from datetime import time, datetime, timedelta

 

ipcon = IPConnection() # Create IP connection

servo = Servo(UID_servo, ipcon) # Create device object

poti = RotaryPoti(UID_rotary, ipcon)

 

Sonnenzeit = timedelta(hours=10)

Sonnenuntergang = time(17, 0, 0).hour

Trackzeit = 10 #1800 = halbe Stunde

 

def track():

    jetzt = datetime.now().hour

    Zeit_bis_Untergang = timedelta(hours=(Sonnenuntergang-jetzt))

    print("Zeit: {0}".format(str(datetime.now())))

    print("Sonnenuntergang: {0}".format(str(Sonnenuntergang)))

    print("Verbleibende Zeit: {0} ".format(str(Zeit_bis_Untergang)) + " (Std.)")

    global akt_position

    servo.set_position(6, akt_position)

    akt_position = akt_position + 900

    t = Timer(Trackzeit, track)

    t.start()

 

 

def cb_position(position): #Poti zum manuellen Positionieren

    servo.set_position(6,60*position)

 

def cb_reached(servo_num, position): #Zielposition erreicht

    global akt_position

    print("Position: {0}".format(str(akt_position)))

    if position == 9000:

        akt_position = -9000

        t = Timer(14, track) #14*3600 Min. bis Sonnenaufgang

 

if __name__ == "__main__":

    ipcon.connect(HOST, PORT) # Connect to brickd

 

    servo.register_callback(servo.CALLBACK_POSITION_REACHED, cb_reached)

    servo.enable_position_reached_callback()

 

    servo.set_velocity(6, 4000) #Geschwindigkeit niedrig

    servo.set_acceleration(6,8000) #Beschleunigung gering

    servo.set_position(6, 0)

    servo.enable(6)

    poti.set_position_callback_period(50)

    poti.register_callback(poti.CALLBACK_POSITION, cb_position)

 

    global akt_position

    jetzt = datetime.now().hour

    if jetzt > Sonnenuntergang: # Nacht

        Stunden_bis_Start = timedelta(hours=24-jetzt+7)

        print("Start in {0} Stunden".format(str(Stunden_bis_Start)))

        t = Timer(Stunden_bis_Start.total_seconds()/3600, track)

        t.start() # bei Sonnenaufgang starten

    else:

        print("jetzt: {0}".format(str(jetzt)))

        # Startposition anfahren

        akt_position = 9000-(Sonnenuntergang-jetzt)*1800 #Endposition - Stunden * Winkel/Std.

        akt_position = -9000

        t = Timer(3, track) #

        t.start()          # sofort starten

 

    raw_input('Press key to exit\n') # Use input() in Python 3

    ipcon.disconnect()

    t.cancel()

FullSizeRender.thumb.jpg.e441c678ecf78da69efafd749d2b71d3.jpg

FullSizeRender_4.thumb.jpg.f1bafcbca489dad23faade34028489ce.jpg

Link zu diesem Kommentar
Share on other sites

Also so we ich es sehe fürst du dein Solarmodul Zeitgesteuert. Also je nach Zeit eine bestimmte Position. Richtig?

Warum fürst du dein Solarmodul nicht nach dem wirklichen Sonnenstand?

Ich habe sowas vor knapp über 20 Jahren mit einer Microsteuerung von Conrad für einen Kumpel gebaut.

Nur das ich seine Solarmodule, hatte er selber gebaut in dem er Wasser durch Rohre geführt hat um seinen Kessel zu erwärmen, über zwei kleine Solarmodule dem Sonnenstand nachgeführt habe.

Ich hab nur eine Achse gesteuert. Lässt sich aber einfach auf 2 Achsen, also Höhe und Schwenken, erweitern.

Dazu habe ich einfach 2 Minisolarzellen direkt nebeneinander gelegt und dann das ganze in ein Gehäuse eingebaut, das oben eine definierte Öffnung hatte.

Dazu habe ich die Spannung beider Solarzellen verglichen und die Solarmodule , an dem meine Solarmesseinrichtung mit befestigt waren, einfach solange in die Richtung bewegt bis beide Solarzellen den fast gleichen Wert brachten.

Die Richtung die man bewegen muss erkennt man daran, welche Solarzelle mehr Spannung liefert.

 

Ansonsten eine gute einfache Umsetzung. ;)

Link zu diesem Kommentar
Share on other sites

Funktion zum Laden des Akkus

 

def akku_spannung():

    spannung = servo.get_external_input_voltage()

    if spannung < 6500: # 6,5 V

        print("Laden")

        #Relais ein    # NiMH-Akku 7,2 V

        relais.set_state(True, False)

    elif spannung > 8500: #8,5 V

        print("Stop Laden")

        #Relais aus

        relais.set_state(False,False )

    return spannung

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...