Seite 1 von 1

"Timer"

Verfasst: Freitag 24. November 2017, 16:23
von brown78
Hallo zusammen,

ich habe ein kleines Raspi Projekt bei dem ich eine Signalquelle einlesen möchte. Wenn in einer bestimmten Zeit, die Quelle bzw. der GPIO mehr als X mal auf on geht soll etwas getan werden. Nach einer gewissen Zeit soll der Zähler aber zurück gesetzt werden. Also quasi soll, sobald der GPIO auf on schaltet, eine Zeit ablaufen, wenn innerhalb dieser Zeit, der GPIO wieder auf on schaltet, wird i inkrementiert, schaltet der GPIO nicht auf on, soll i auf 0 gesetzt werden.
Das Einlesen des GPIO und inkrementieren funktioniert bereits, allerdings habe ich momentan keine Ahnung wie ich das mit der Zeit machen soll. Ich hoffe Ihr helft mir dabei etwas.

Code: Alles auswählen

def lauscher():
        i = 0
        while True:
                if (GPIO.input(21) == 1):
                        print "Signal gehoert"
                        i = i +1
                        if (  i > 2):
                                tueEtwas()
                                i = 0
                        time.sleep(0.25)

Re: "Timer"

Verfasst: Freitag 24. November 2017, 16:45
von __deets__
Du hast zwei Variablen hier: den Zähler, und den Zeitpunkt zu dem alles wieder auf 0 soll.

Damit ist das Vorgehen ungefähr so (pseudocode!)

Code: Alles auswählen

i = 0
ts = now()
while True:
      if gpio:
         i += 1
         ts = now() + zeitraum 
       if now() >= ts:
           i = 0
       if i >= schwelle:
            tuwas()
            i = 0

Re: "Timer"

Verfasst: Freitag 24. November 2017, 16:48
von noisefloor
Hallo,
allerdings habe ich momentan keine Ahnung wie ich das mit der Zeit machen soll
Du speicherst einen Zeitstempel bzw. ein datetime-Objekt. Das bekommst du ganz einfach mit dem datetime Modul.

Beim nächsten Input ziehst die gespeicherte Zeit von der aktuellen ab. Bei datetime Objekten bekommst du eine timedelta-Objekt, was die Zeitdifferenz erhält. Damit kannst du dann was auch immer machen bzw. auswerten.

Gruß, noisefloor

Re: "Timer"

Verfasst: Freitag 24. November 2017, 17:27
von brown78
Vielen Dank schon mal für eure schnellen Antworten. Ich werde mich durchprobieren und dann Rückmeldung geben, ob mein Babyphone funktioniert wie es soll :D

Re: "Timer"

Verfasst: Samstag 25. November 2017, 10:56
von brown78
So, mit etwas ausprobieren habe ich es jetzt, glaube ich ganz gut hinbekommen.
Sollte ein Signal am GPIO anliegen, wird eine Schleife gestartet, welche 5 Sekunden läuft. Liegt das Signal innerhalb dieser Zeit mehr als 3 mal an, wird eine Aktion ausgelöst. In meinem Fall hängt ein Schallsensor am GPIO, mit dessen Hilfe schalte ich einen zweiten GPIO, dieser wird in fhem überwacht und sendet mir eine Nachricht. Später soll dann auch noch ein Livestream gestartet werden und IR LEDs aktiviert....
Hier mal mein Code:

Code: Alles auswählen

#!/usr/bin/python
import time
import RPi.GPIO as GPIO
from datetime import datetime
from datetime import timedelta

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(21, GPIO.IN)

def trigger():
        print "mehr als 3x hintereinander"
        GPIO.output(16, True)
        print "Signalgeber an"
        print "warte 2 Sekunden"
        time.sleep(2)
        print "Signalgeber aus"
        GPIO.output(16, False)

def listener():
        i = 0
        while True:
                if (GPIO.input(21) == 1):
                        t = datetime.now()
                        print "Signal gehoert"
                        time.sleep(0.25)
                        i = 0
                        while datetime.now() < t + timedelta(seconds=5):
                                if GPIO.input(21) == 1:
                                        print "im 5 Sekunden timer"
                                        i += 1
                                        time.sleep(0.25)
                                if i > 3:
                                        trigger()
                                        i = 0


listener()