Python Programm - komme nicht weiter

OP #4880301
Hi,

ich komme einfach nicht weiter mit meinem 1.Python Programm. Ich möchte 
bei Interrupt (Unterbrechung der Lichtschranke) eine Mail bekommen und 
eine Benachrichtigung, den der Pin 600 Sekunden lang unerbrochen ist.
Hier ein Ausschnitt von meinem Code:
1
TimeOut_Alert_sec = 90
2
TimeOut_Disconnected_sec = 600
3

4
lastdetect = 0
5
Counter = 0
6

7
def setup():
8
        ...
9
        GPIO.add_event_detect(BtnPin, GPIO.BOTH, callback=detect, bouncetime=1000)
10
        global lastdetect       
11
        global Counter
12

13

14
def detect(channel):
15
        now = time.time()
16
        if now - lastdetect < TimeOut_Alert_sec:
17
                return
18
        if Counter == TimeOut_Disconnected_sec:
19
                SendMail("disconnected")
20
                return;
21
        SendMail("detected")
22
        lastdetect = now
23

24
def loop():
25
        while True:
26
                time.sleep(1)
27
                if GPIO.input(BtnPin) == GPIO.HIGH:     # Lichtschranke wieder frei          
28
                        Counter = 0
29
                if GPIO.input(BtnPin) == GPIO.LOW:     # Lichtschranke unterbrochen
30
                        Counter += 1

Bei Unterbrechnung der Lichtschranke erhalte ich folgende Meldung:

"...in detect
if now - lastdetect < TimeOut_Alert_sec:
Unbound LocalError: local variable 'lastdetect' referenced before 
assignment"

Ich weiß einfach nicht wo ich die beiden Variablen Counter und 
lastdetect hinstecken soll, damit ich in den beiden Funktionen detect 
und loop darauf zugreifen kann.

Ich wollte sie erst übergeben, doch das geht wohl auch nicht.

Ich wäre über jeden Tipp sehr dankbar!!
Gast #4880316
Das Problem ist, dass du versuchst der globalen Variablen lastdetect 
innerhalb von detect() einen Wert zuzuweisen. Das ist nur erlaubt, wenn 
du sie vorher mit "global lastdetect" deklariert hast.

Also:
1
def detect(channel):
2
        global lastdetect
3
        now = time.time()
4
        if now - lastdetect < TimeOut_Alert_sec:
5
                return
6
        if Counter == TimeOut_Disconnected_sec:
7
                SendMail("disconnected")
8
                return;
9
        SendMail("detected")
10
        lastdetect = now

Ohne diese Deklaration kannst du nur lesend zugreifen.
Gast #4880318
H. C. schrieb:
> "...in detect
> if now - lastdetect < TimeOut_Alert_sec:
> Unbound LocalError: local variable 'lastdetect' referenced before
> assignment"

Du greifst innerhalb einer Funktion auf eine globale Variable 
schreibend zu. Wenn das der Fall ist musst du das der Funktion auch 
mitteilen, bzw. die Variable bekannt machen:
1
def detect(channel):
2
        global lastdetect 
3
        now = time.time()
4
        if now - lastdetect < TimeOut_Alert_sec:
5
                return
6
        if Counter == TimeOut_Disconnected_sec:
7
                SendMail("disconnected")
8
                return;
9
        SendMail("detected")
10
        lastdetect = now

Falls du eine Variable innerhalb einer Funtkion nur lesen möchtest ist 
das nicht notwenig.
#4880332
H. C. schrieb:
> ich komme einfach nicht weiter mit meinem 1.Python Programm. Ich möchte
> bei Interrupt (Unterbrechung der Lichtschranke) eine Mail bekommen und
> eine Benachrichtigung, den der Pin 600 Sekunden lang unerbrochen ist.

Was passiert denn, wenn der Pin erbrechen muß?

> Hier ein Ausschnitt von meinem Code:
>
>
1
> def setup():
2
> def loop():
3
>         while True:
4
>

Das ist kein Arduino, sondern Python. Was das "setup()"- und 
"loop()"-Zeug da soll, ist mir daher einigermaßen schleierhaft. Das 
"global" in "setup()" kannst Du Dir ebenfalls sparen, ist da überflüssig 
und nur dann nötig, wenn Du auf eine Variable des äußeren Blocks 
schreiben willst wie in "detect()" -- und genau da solltest Du dann 
"global lastdetect" auch hineinschreiben.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.