Forum: Mikrocontroller und Digitale Elektronik Python Programm - komme nicht weiter


von H. C. (sunshine)


Lesenswert?

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!!

von Oliver R. (Gast)


Lesenswert?

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.

von Dennis X. (Gast)


Lesenswert?

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.

von Sheeva P. (sheevaplug)


Lesenswert?

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.

von H. C. (sunshine)


Lesenswert?

DANKE!! Jetzt hab ich es verstanden! Python ist halt doch anders...
auch und sorry für den Rechtschreibfehler, bei mir wird nichts erbrochen 
und natürlich auch nicht verbrochen ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.