Forum
raspberry pi und PIR (Computertechnik)
» » Nach jeder 3. Aktivierungen bekomme zwar die unter dem if statement
» » eingetragene Textnachricht '3 mal aktiviert',
» » jedoch wird der time.sleep(30) Befehl nicht ausgeführt.
» »
» » Wo liegt der Fehler ?
» Ich würde das nicht direkt Fehler nennen. Die sleep-Methode wird ausgeführt
» aber nicht in deinem Hauptprogramm, sondern in einem eigen Thread.
»
» "RPi.GPIO runs a second thread for callback functions. This means that
» callback functions can be run at the same time as your main program, in
» immediate response to an edge."
»
» Von der Doku her würde ich sagen, dass es einen eigenen Thread für die
» callbacks gibt, es könnte aber auch sein, dass jedes mal ein eigener Thread
» für ein Event gestartet wird. Falls das interessant ist, müsste man sich
» mal die Implementierung anschaun.
»
» Man sollte aber Event-Behandlung eh möglichst kurz halten, also keine sleep
» und keine langwierigen Operationen ausführen. Besser wäre es, wenn du
» deinen if-Block in dein Hauptprogramm ziehst und im Callback nur den
» counter hochzählst.
» Dann könntest du das ganze auch noch so umschreiben, dass du kein sleep
» brauchst, z.B. indem du dir beim ausgeben der Nachricht die aktuelle Zeit
» (last_time = time.time()) in eine Variable schreibst und dein if
» erweiterest ( if count%3 == 0 and time.time() > (last_time + 30): )
»
» Oh und falls du die Frage in mehreren Foren stellst, fände ich es höflich,
» wenn du darauf auch hinweist (z.B. einfach Habe ich hier auch gefragt:
» LINK)
Bind da noch nicht sattelfest genug, musste erst mal 'Tread' nachsehen.
Habe Deinen letzte Hinweis mal so getestet:
>#!/usr/bin/python3
>import sys, time
>import RPi.GPIO as gpio
>gpio.setmode(gpio.BOARD)
>gpio.setup(23, gpio.IN)
>count = 0
>def mein_callback(pin):
> > global count
>> count += 1
>> last_time = time.time()
>> print('PIR 1 aktiviert am',(time.strftime('%d.%m.%Y %H:%M:%S')), count)
>> print (last_time)
>> if count > 3 and time.time() > (last_time + 3):
>>> print('yes')
>> return
>try:
>> gpio.add_event_detect(23, gpio.RISING, callback = mein_callback)
>> if count > 2 and time.time() > (last_time + 2):
>>> print('yes')
>> while True:
>>> time.sleep(1)
>except KeyboardInterrupt:
>> print('PIR deaktiviert')
>gpio.cleanup()
hat aber nicht funktioniert, obwohl ich den if Block an 2 verschiedenen Stellen einfügte(ohne Fehlermeldung)
Funktioniert hat der Test mit einem Script mit gpiozero:
>#!/usr/bin/python3
>import time
>from gpiozero import MotionSensor
>pir = MotionSensor(11)
>global count
>count = 0
>while 1:
>> pir.wait_for_motion()
>> count += 1
>> last_time = time.time()
>> print('PIR 1 aktiviert', count, last_time)
>> time.sleep(5)
>> if count > 5 and time.time() > (last_time + 3):
> > print('yes')
Damit reagiert aber der PIR nach jedem Auslösen 2 mal, unabhängig von der Stellung der Potentiometer.
Dieses Poblem poste ich auf www.forum-raspberrypi.de.
Mein Test entsprich aber nicht dem, was ich brauche: Mein PIR-Script sollte in den Schlafmodus versetzt werden
wenn count > x und time.time() < (last_time + y) ist, d.h. erst nachdem diese Konditionen erfüllt sind wieder ansprechen können.
Gesamter Thread: