Jump to content
Sign in to follow this  
heinz_a

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

Share this post


Link to post
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. ;)

Share this post


Link to post
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

Share this post


Link to post
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...