"Timer"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
brown78
User
Beiträge: 8
Registriert: Samstag 21. Oktober 2017, 13:43

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)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
brown78
User
Beiträge: 8
Registriert: Samstag 21. Oktober 2017, 13:43

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
brown78
User
Beiträge: 8
Registriert: Samstag 21. Oktober 2017, 13:43

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()
Antworten