2017-12-26 2 views
0

Erstellen eines Python-Skripts, das Daten von einem Arduino-Abstandssensor empfängt. Ich erhalte einen Wert in jeder Nanosekunde. Immer wenn dieser Wert höher als 50 ist, möchte ich den Benutzer warnen. (Wird dies mit einem Benachrichtigungsprogramm tun, aber jetzt drucke ich nur Warnung). Ich habe folgendes:if-Anweisung nur einmal in einem bestimmten Zeitraum in Python ausführen?

while 1:             # Keep receiving data 
    data = ser.readline()         # Getting data from arduino 
    value = [int(s) for s in data.split() if s.isdigit()] # Converting the Arduino ouput to only get the integer value 
    if value:            # Avoid empty values 
     distance = value[0]        # List to int 
      if distance > 50:        # If bigger than 50 cm, warn user. 
       warn_user()     

Ich möchte nur die warn_user() Funktion einmal in 30 Sekunden ausführen, danach wird die if-Anweisung sollte nicht mehr auslösen, nur wenn die Werte fallen unter 50 und dann> 50 nochmal. Ich habe versucht, mit True/False-Anweisungen zu arbeiten, Timer schläft, aber das hat nicht funktioniert. Irgendwelche Tipps? Vielen Dank.

Antwort

2

Sie müssen nur einige weitere logische Bedingungen hinzufügen, um den Programmablauf zu steuern. So etwas wie dies funktionieren würde:

from time import time 
warning_enabled = True 
time_of_warning = 0 

while 1: 
    data = ser.readline() 
    value = [int(s) for s in data.split() if s.isdigit()] 
    if value: 
     distance = value[0] 
      if distance > 50 and warning_enabled: 
       warn_user() 
       warning_enabled = False 
       time_of_warning = time() 
      if time() - time_of_warning > 30 and not warning_enabled and distance < 50: 
       warning_enabled = True 

Was dies bedeutet ist, dass es sich an das letzte Mal hält, wenn die Warnung wurde gefeuert und verwendet die warning_enable Flagge das zweite if nur Feuer, wenn möglich zu machen.

Prost

+0

Dies funktioniert perfekt. Vielen Dank. – Jesse

2

Sie brauchen nur zu verfolgen, was Sie suchen, um Ihr Ziel zu erreichen: den Zeitstempel der letzten Warnung und ob der Abstand unter dem Wert war die Sie nachverfolgen.

import time 

distance_was_safe = True # tracks if distance went below specified range 
last_warned = 0   # tracks timestamp since last warning 

safe_distance = 50 # 50 cm 
warn_interval = 30 # 30 sec, warn no more than once every interval 


while True: 
    # Get data from Arduino. 
    data = ser.readline()         

    # Convert the Arduino output to only get the integer values. 
    value = [int(s) for s in data.split() if s.isdigit()] 

    # Avoid empty output. 
    if value:            
     # Get the first integer. 
     distance = value[0] 

      # If greater than safe zone, potentially warn the user. 
      if distance > safe_distance: 

       # Warn the user if distance was below range, 
       # and it has been enough time since the last warning. 
       if distance_was_safe and time.time() - last_warned > warn_interval: 
        distance_was_safe = False 
        last_warned = time.time() 
        warn_user() 

      else: 
       # Distance was less than warning distance, reset the flag. 
       distance_was_safe = True 
Verwandte Themen