gpiozero und motion sensor

  • mit dem folgenden Script regiert der PIR nach jedem Auslösen jeweils 2 mal,
    unabhängig von der Stellung der Potentiometer:


    #!/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')


    hingegen wenn ich die add_event_detect und callbacl Funktion in RPi.GPIO benutze
    eine korrekte 1:1 Reaktion auf jedes Auslösen erfolgt.
    ????

  • Moin
    1) Code-Tags verwenden
    2) Der PIR reagiert nicht 2x. Der PIR ist hardwareseitig ca. 2 Sekunden nach Bewegungserkennung auf True gestellt. D.h. ``pir.wait_for_motion()`` ist True für diese Zeit. Deine Endlosschleife rattert durch und erhöht den Wert von ``count`` jedesmal um eins. Nimm mal das ``time.sleep()`` raus um zu erkennen, was ich meine.


    Das Programm ist sowieso nicht gut.


    Auf Modulebene haben nur Konstante, Klassen, Funktionen/Methoden zu stehen. global ist scheiße. Programmierer sind faul und zählen daher nicht selber, sie lassen zählen.



    Edit:
    Mein und auch dein PIR sind hier 5.8 Sekunden auf True. D.h. dein Counter wächst in dieser Zeit auf 72760 an. Darum kommst du auch auf 2 Zähler. 5.8 Sekunden, 5 Sekunden sleep, Rest 0.8. Dadurch wird nochmals um 1 erhöht. Hoffe, es ist nun klar, dass nicht ``gpiozero`` das Problem ist, sondern dein(e) Programm/Überlegung

  • Hallo bootsmann,
    vielen dank für die Rasche Antwort. Bin neu auf dem Gebiet.
    Wenn ich den PIR mit Deinem Script oben (keine Fehler) auslöse bekomme ich folgenden traceback:


    Exception in thread Thread-1:
    Traceback (most recent call last):
    File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
    self.run()
    File "/usr/lib/python3.4/threading.py", line 868, in run
    self._target(*self._args, **self._kwargs)
    File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 496, in fill
    self.parent._fire_events()
    File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 311, in _fire_events
    self._fire_activated()
    File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 289, in _fire_activated
    self.when_activated()
    File "./PIRex3.py", line 14, in <lambda>
    pir.when_motion = lambda: counting(counter)
    File "./PIRex3.py", line 8, in counting
    print(counter.next())
    AttributeError: 'itertools.count' object has no attribute 'next'


    wie korrigieren ?
    Danke, luemar