Variablen Übergeben

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
BarSen
User
Beiträge: 5
Registriert: Montag 9. April 2018, 13:55

Hallo Zusammen,

ich bin neu im Forum und habe erst seit einiger Zeit angefangen mich mit Python zu beschäftigen. Ich hoffe, hier kann mir jemand bei meinem Vorhaben weiterhelfen, da ich seit einigen Tage durch verschiedene Quellen gegangen bin, um eine Lösung für mein Problem zu finden.

Kurz zu meinem Vorhaben. Ich möchte mit einem Regler, welches über die GPIO verbunden ist, die Lautstärke von einem Lautsprecher steuern, welches über Netzwerk gebunden ist.

Ich habe an meinem Raspberry Pi3 einen Inkrementalgeber KY040 angeschlossen und einen Skript erstellt, welches einen Wert zwischen 0 und 120 erzeugen kann.

Dateiname: Skript_1

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
 
# Hier werden die GPIO deklariert
PIN_CLK = 5         #Pin 29
PIN_DT = 6          #Pin 31
BUTTON_PIN = 13     #Pin 33
 
GPIO.setup(PIN_CLK, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(PIN_DT, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 
# Benötigte Variablen werden initialisiert

Counter = 0
test=56

Richtung = True
PIN_CLK_LETZTER = 0
PIN_CLK_AKTUELL = 0
delayTime = 0.01 
 
# Initiales Auslesen des Pin_CLK
PIN_CLK_LETZTER = GPIO.input(PIN_CLK)

   
    # Diese AusgabeFunktion wird bei Signaldetektion ausgefuehrt
def ausgabeFunktion(null):
    global Counter
     
    PIN_CLK_AKTUELL = GPIO.input(PIN_CLK)  
     
    if PIN_CLK_AKTUELL != PIN_CLK_LETZTER:
        
        if GPIO.input(PIN_DT) != PIN_CLK_AKTUELL:  
            Counter += 5 #Zählschritte
            
            if Counter < 0: #Zählbereich zwischen 0 und 120 eingrenzen
                Counter = 0
            if Counter >120:
                Counter = 120
            Richtung = True
                
        else:
            Richtung = False
            Counter = Counter - 5

            if Counter < 0: #Zählbereich zwischen 0 und 120 eingrenzen
                Counter = 0
            if Counter >120:
                Counter = 120
            Richtung = True
     
        print ("Volume: ", Counter)

     
def CounterReset(null):
    
    print ("Mute")
    Counter = 0
               

# Um einen Debounce direkt zu integrieren, werden die Funktionen zur Ausgabe mittels
# CallBack-Option vom GPIO Python Modul initialisiert
GPIO.add_event_detect(PIN_CLK, GPIO.BOTH, callback=ausgabeFunktion, bouncetime=50)
GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=CounterReset, bouncetime=50)

 # Hauptprogrammschleife
try:
        while True:
            time.sleep(delayTime)
            break #um es im Hauptskript anzubinden      
          
    # Aufraeumarbeiten nachdem das Programm beendet wurde
except KeyboardInterrupt:
            GPIO.cleanup()

Die Variable Counter kann somit einen Wert zwischen 0 und 120 annehmen. Diesen Wert möchte ich in einen anderen Skript übertragen.

Dateiname Skript 2:

Code: Alles auswählen

import Drehregler


class test():

	def setValue():

Wie schaffe ich den Wert von Counter in den Skript2 zu übertragen? Da ich in Skript1 Counter = 0 geschrieben habe, bekomme ich in Skript2 auch nur die 0 ausgegeben. Aber ich möchte auf den Wert von def ausgabeFunktion-> Counter zugreifen. Wie würde man es machen?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@BarSen: leider ist 90% des Codes, was man im Internet zu Raspis findet, Schrott. Und aus unerfindlichen Gründen verbreitet sich dieser Schrott auch noch schneller, als die guten Quellen.

Lies Dir besser diesen Artikel durch.
BarSen
User
Beiträge: 5
Registriert: Montag 9. April 2018, 13:55

@Sirius3: Danke für deine Antwort.

Leider sind, wie Du schon sagtest, vieles im Internet geschriebene Codes nicht ganz nachvollziehbar. Auch viele Tutorials sind nicht wirklich hilfreich. Aber leider ist es für mich als Neueinsteiger in Python nicht immer sofort ersichtlich was richtig und was falsch ist. So passiert es leider auch, dass ich nicht so korrekt die Codes schreibe, wie es evtl eigentlich sein müsste.

Die Seite, die du mir gegeben hast kenne ich schon. Habe es auch schon mal ausprobiert und funktioniert soweit. Leider löst es dennoch nicht mein Problem. Zumindest ich komme nicht mit mein Projekt mithilfe dieser Beschreibung weiter.

Kannst du mir sagen, wie man Variablen von einen Skript in den anderen übergibt anhand meines Beispiel? habe da jetzt schon unzählige Tutorials durchgeschaut und durchgelesen, wie die Klassen funktionieren und lokale und globale Variablen definiert werden. Aber dennoch verstehe ich die Variablenübergabe nicht. Evtl. kannst du mir eine gute Quelle dafür nennen.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Wie kommst du auf die Idee, dass du eine Variable in ein anderes Skript übergeben willst?

Der Pi kann ja immer nur ein Skript gleichzeitig ausführen (ok, da kann man auch basteln)

Das Beispiel von Sirius zeigt, wie ein einziges Skript gleichzeitig den Regler überwacht und bei Aktivität die daraus gewünschte Reaktion ausführt.

Das Konzept passt doch auch zu deinem Vorhaben? Mehrere Skripte gleichzeitig machen das nur unnötig kompliziert.

Bei deinem Beispiel wird der Wert einfach ausgegeben. Du könntest problemlos weitere Funktionen ergänzen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@BarSen: ein passenderen Artikel als den von mir verlinkten, kann es kaum geben. Dort wird gezeigt, wie man einen KY040 korrekt ansteuert, das ganze ist in einer Klasse gekapselt (so wie Du das auch versuchst), es wird ein Beispiel gegeben, wie man einen Lautsprecher ansteuert.
Nimm bitte dieses Beispiel, versuche es an Dein Problem anzupassen und falls Du nicht mehr weiter kommst, kannst Du gerne fragen.

Das Stück Code, das Du herausgekramt hast, sieht nicht vor, dass man es modular benutzt und Zustände an ein Hauptprogramm übergibt.
BarSen
User
Beiträge: 5
Registriert: Montag 9. April 2018, 13:55

Sirius3 hat geschrieben: Das Stück Code, das Du herausgekramt hast, sieht nicht vor, dass man es modular benutzt und Zustände an ein Hauptprogramm übergibt.
Ok verstehe. Ich glaube ich habe mich zu sehr auf mein zusammengebastelten Skript festgefahren und wollte damit versuchen mein Regler zum laufen zu bringen. Bin davon ausgegangen, dass es gehen muss, weil das Programm alleine für sich auch gut funktioniert. Habe diesen Artikel am Anfang meiner Suche auch gefunden und getestet. Ich fand es nur für mich etwas zu komplex wie der Code geschrieben wurde, da ich feststellen muss, dass mir doch etwas Vorkenntnisse fehlen. Ich werde dann dein verlinkten Artikel nehmen und nochmal probieren. Danke!

@Kebap: Ich glaube, dass ich mich mit Skript etwas falsch ausgedrückt habe. Ich wollte der übersichtshalber mehrere Dateien für mein Programm erstellen mit jeweils einer Klasse und mit der import Funktion arbeiten. Habe das so in mehreren Tutorials so verstanden, dass es besser wäre, wegen der Übersicht. Aber Du hast recht. Evtl ist es für mich einfacher, alles in einer Datei zu machen.
Kebap hat geschrieben:Bei deinem Beispiel wird der Wert einfach ausgegeben. Du könntest problemlos weitere Funktionen ergänzen.

Genau das ist gerade mein Problem. Ich möchte den Wert von Counter in einer anderen Klasse nutzten. Aber das bekomme ich einfach nicht hin. Ich würde gerne den Wert von der Def ausgabeFunktion() der Variablen Counter in einer anderen class importieren, um damit weiterzuarbeiten.

Den anderen Teil des Codes habe ich am Anfang meiner Frage nicht geschrieben, da ich dachte, es wird zu kompliziert. Was ich gerade mache, ist ein kleiner Teil eines Praktikumsporjektes. Ein Vorgänger von mir, der mehr Ahnung von Python hatte als ich, hat ein Skript geschrieben, um die Lautstärke über ein Schieberegler per Software einzustellen. Dabei öffnet sich beim Programmstart ein Fenster, um es per Mauszeiger einzustellen. Ich möchte das ganze auch gerne Hardwareseitig über ein Drehregler machen. Aus diesem Grund habe ich ein Raspberry genommen.

Hier der Teil des Codes, wo die Lautstärke eingestellt wird:

Code: Alles auswählen

 class Lautststaerkenregler:
   
    def setVal(self,value):
        self.b.sld.setValueF(value)         

    
    
    def initSpecificGuiElements(self):
        newTabName = "Devices"
        self.b=SscGuiElementNumber('{"audio":{"out":{"level":', True, True, 0, 120, 1, '', 'dB')
        self.addGuiElement(newTabName, self.b)
        self.setVal(value)	#stelle, wo ich dachte, man kann die Lautstärke Regeln
        
        self.setGeometry(300, 300, 500, 100)
Mit meinem laienhaften denken bin ich davon ausgegangen, das ich einfach die Variable value=Counter sage. das klappt natürlich nicht so einfach. Wenn ich aber zum Beispiel value=24 eintrage, befindet sich beim Programmstart der Regler bei 24.

Hoffe, jetzt versteht ich mehr, was ich versuche zu machen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@BarSen: die Kombination Hardware-Regler und GUI macht die Sache nochmal eine Stufe komplizierter. Aus dem Code-Abschnitt kann ich auch nicht ablesen, um welches GUI-Framework es sich handelt. `value` kommt dort auch aus dem Nichts; das macht es unmöglich komplexere Dinge zu programmieren, oder auch nur einfache Erweiterungen, weil man nicht abschätzen kann, was kleine Änderungen an unbekannten Nebeneffekten haben.

Ohne, dass Du Python von den Grundlagen aus lernst und Dich langsam an Dein Problem herantastest, wirst Du wahrscheinlich nicht zu einem Ergebnis kommen.
BarSen
User
Beiträge: 5
Registriert: Montag 9. April 2018, 13:55

@Sirius3: Mir wurde gesagt, dass ich "nur" an der stelle self.setVal(value) den Wert value ändern muss. Zum Beispiel: self.setVal(value=24).
Wenn ich dass mache, ändert sich der Schieberegler auch dementsprechend, bzw. er ist beim Programmstart an der Stelle 24. Aus diesem Grund hatte ich ein Skript, wo ich durch den Drehregler einen Wert zwischen 0 und 120 einstellen kann. Bin davon ausgegangen, dass ich dann einfach diese Variable durch meins ersetzen kann. Aber so einfach war das nicht, wie ich es mir vorgestellt habe.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@BarSen: an der Stelle wird halt EINMAL am Start des Programms ein Wert gesetzt. Der ändert sich nicht einfach so, wenn Du später am Drehregler drehst.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn man GUIs machen moechte, wird die Situation grundsaetzlich deutlich komplizierter - das liegt in deren Natur. Da kommt fuer deinen Fall mindestens mal Nebenlaeufigkeit ins Spiel. Und die Synchronisation von zwei parallel laufenden Ausfuehrungsstraengen ist alles andere als leichte Kost. Es hat sich da leider noch keiner die Muehe gemacht, das irgendwie einfacher zu verpacken. Wenn du das wirklich brauchst, heisst es viel lernen. Oder jemanden finden, der's fuer dich macht.
BarSen
User
Beiträge: 5
Registriert: Montag 9. April 2018, 13:55

@Sirius3: ok. Dachte, dass es Programm beim drehen des Reglers auch aktualisiert wird.

@__deets__: scheint so als müsste ich mich mit der Materie noch tiefer beschäftigen. Leider kenne ich sonst keinen, der sich mit python Programmierung auskennt. Aus diesem Grund hatte ich mich hier angemeldet um tipps zu bekommen. Das hat mir auch gut geholfen, um bestimmte Dinge etwas besser zu verstehen. Da es ein unbezahltes Praktikum ist, kann ich mir keinen leisten, der es für mich gegen Bezahlung programmiert, auch wenn ich es gerne wollte. Ich studiere Elektrotechnik und das ist nur ein kleines Projekt, um mich mit der Programmierung zu beschäftigen. Ich wollte nur gerne für mich selber dabei ein kleines Erfolgserlebnis haben, da ich daran schon ca. 8 Wochen sitze und mit Python von null angefangen habe.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

Nur mal so nebenbei: Wie man im Video (https://youtu.be/MEWtM6QQZIY) gut erkennen kann, der Pi hat mit Python irgendwie Probleme einen Rotaryencoder in Bewegung gut zu erkennen. Hin und wieder springt der Balken unerklärlich hin und her.
Eine wirklich Lösung habe ich noch nicht finden können.
empty Sig
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@harryberlin: Deutlich stabiler als das RPI.GPIO läuft pigpio.
Antworten