GPIO mit mehreren Programmen aufrufen

  • Hi,

    ich hab mir kürzlich auch einen Raspi gekauft und hab gleich mal eine Frage :D
    Mein Ziel ist es, eine Bewässerung für meinen Balkon zu bauen.
    Ein Relais steuert eine eine Pumpe, die entweder über ein Programm automatisch gestartet werden soll, oder über einen Kippschalter.
    Außerdem gibt es in meinem Tank noch einen Schwimmschalter, der mir sagt, ob noch Wasser in dem Tank ist.

    Aufgebaut sein soll das Programm so sein, dass ich in einem Unterordner alle Inputs (z.B. Schalter) habe, und in einem weiteren alle Outputs (z.B. Relais).

    Ich hab nun folgendes Problem:
    Das Relais für die Pumpe hängt am GPIO 18. Über Crontab wird beim Start ein Programm geöffnet, dass überprüft, ob der Schalter an oder aus ist.
    Das ganze funktioniert auch schon. Nur wenn ich jetzt ein zweites Programm starte, welches automatisch für 10 sec das Relais schalten soll, dann passiert nichts.

    Folgendes Script benutze ich für die Relais:

    [font="Monaco"]#!/usr/bin/env python[/font]

    [font="Monaco"]import RPi.GPIO as GPIO[/font]
    [font="Monaco"]import time[/font]

    [font="Monaco"]import sys[/font]
    [font="Monaco"]sys.path.append('/home/pi/bewaesserung')[/font]
    [font="Monaco"]from inputs import schalter as strom[/font]

    [font="Monaco"]relais1 = 18[/font]
    [font="Monaco"]relais2 = 23[/font]

    [font="Monaco"]GPIO.setmode(GPIO.BCM)[/font]
    [font="Monaco"]GPIO.setwarnings(False)[/font]

    [font="Monaco"]GPIO.setup(relais1, GPIO.OUT)[/font]
    [font="Monaco"]GPIO.setup(relais2, GPIO.OUT)[/font]


    [font="Monaco"]#___________________________________________________________________#[/font]
    [font="Monaco"]# Relais 1: Pumpensteuerung[/font]


    [font="Monaco"]def pumpeauto(x, y):[/font]
    [font="Monaco"] if strom.schwimmschalter2() == "off":[/font]
    [font="Monaco"] print "Wasser vorhanden"[/font]
    [font="Monaco"] if x == "on":[/font]
    [font="Monaco"] print "bewaessern..."[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.LOW)[/font]
    [font="Monaco"] time.sleep(y)[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.HIGH)[/font]
    [font="Monaco"] print "bewaesserung beendet"[/font]
    [font="Monaco"] return "ok"[/font]
    [font="Monaco"] else:[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.HIGH)[/font]
    [font="Monaco"] print "bewaesserung ausgelassen"[/font]
    [font="Monaco"] return "ok"[/font]
    [font="Monaco"] else:[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.HIGH)[/font]
    [font="Monaco"] print "kein Wasser"[/font]
    [font="Monaco"] return "kein Wasser"[/font]


    [font="Monaco"]def pumpeman(x):[/font]
    [font="Monaco"] if strom.schwimmschalter2() == "off":[/font]
    [font="Monaco"] if x == "on":[/font]
    [font="Monaco"]# print "bewaessern..."[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.LOW)[/font]
    [font="Monaco"] time.sleep(0.1)[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.HIGH)[/font]
    [font="Monaco"] # print "bewaesserung beendet"[/font]
    [font="Monaco"] return "ok"[/font]
    [font="Monaco"] else:[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.HIGH)[/font]
    [font="Monaco"]# print "bewaesserung ausgelassen"[/font]
    [font="Monaco"] return "ok"[/font]
    [font="Monaco"] else:[/font]
    [font="Monaco"] GPIO.output(relais1, GPIO.HIGH)[/font]
    [font="Monaco"] return "kein Wasser"[/font]

    Ich habe mir gedacht, dass ich in jeder Funktion ein GPIO.cleanup() vor den returns einbauen kann. Sobald aber von meinen Hauptscript wieder ein Parameter abgefragt wird oder das Relais erneut geschalten werden soll, kommt eine Fehlermeldung, dass der GPIO nicht definiert ist.
    Ich dachte eigentlich, dass man bei einem Return aus dem Funktion raus geht und wenn man sie erneut aufruft, dass dass Programm dann nocheinmal von vorne los geht.
    Wo ist da mein Denkfehler?

    Vielen Dank schon mal :)

  • Ich empfehle dir den "GPIO Server" zu aktivieren und zu nutzen. Siehe dazu FAQ => Nützliche Links / Linksammlung => GPIO Server (raspi-config)

    Darüber können dann mehrere Scripts zu dem pigpiod connecten und die GPIO's schalten.

    Deine Programme solltest du aber derart anpassen das auch die aktuellen Zustände abgefragt werden


    PS: Bitte CODE entsprechend posten, nicht durch Schriftformat ändern. Hab keine Lupe zur Hand um deinen winzigen Code zu entziffern....
    Siehe dazu FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten

  • Danke schon mal für die schnelle Antwort!
    Werd mir das ganze später einmal anschauen.
    Hab jedoch den Fehler in einem anderen Script gefunden. Das fragt die ganze Zeit ab, ob der Schalter für die manuelle Bewässerung an oder aus ist und schaltet bei ausgeschaltetem Schalter auch das Relais wieder aus. Somit schaltet zwar der Automatik Modus das Relais an, wird jedoch direkt danach durch das andere Script wieder abgeschalten :blush:

Jetzt mitmachen!

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