Hallo zusammen
Ich habe mir ein python Skrypt zusammen geschrieben mit hilfe google,foren etc.
Vorne weg, meine Programier Fähigkeiten sind nicht sehr gut darum wollte ich euch fragen könntet ihr das mal anschauen und mir eventuell sagen wo der Fehler ist?
Es handelt sich um ein Motion detect für den Magic Mirror mithilfe dem HC-SR04. Das Skrypt läuft eigentlich auch aber irgendwo ist der Wurm drin und (es variert sehr 3-24h) es hängt sich auf. Der Prozessor vom Raspy geht hoch auf 100% prozent und das Skrypt macht nichts mehr.
Ich habe im Skrypt noch eine Multimessung eingebaut weil ich viele ausreiser hatte bei der messung. Das alles funktioniert eigentlich sehr gut.
Ich habe einen Raspberry pi 2. 16gb SD karte class 10. python 2.7.13
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import signal
import sys
import math
from time import sleep
import os
"""
Suchmodus = 'Hauptmodus' bei dem auf eine Person gewartet wird.
"""
#debug-mode: 0 = kein debug-output, 1 = nur wichtigstes, 2 = volle ausgabe, 3 = voll plus alle Teilmessungen
debugTreshold = 1
#debugOutput = wohin Infos geschrieben werden: 1 = Bildschirm, 2 = Datei, 3 = beides
debugOutput = 2
# Pfad oder Name der Datei in den Debuginfos geschrieben werden sollen
debugFile = "distance-log.txt"
# use Raspberry Pi board pin numbers
GPIO.setmode(GPIO.BCM)
# set GPIO Pins
pinTrigger = 17
pinEcho = 27
bildPin = 24
def close(signal, frame):
print("\nTurning off ultrasonic distance detection...\n")
GPIO.cleanup()
sys.exit(0)
signal.signal(signal.SIGINT, close)
# set GPIO input and output channels
GPIO.setup(pinTrigger, GPIO.OUT)
GPIO.setup(pinEcho, GPIO.IN)
#GPIO.setup(bildPin, GPIO.OUT)
#config section
interval = 0.7 #zeit zwischen 2 messungen
waitTime = 2 #wie lange man still vor dem ding stehen soll
distances = []
naehe = 100 #distanz vom spiegel zur Aktivierung
maxDelta = 8 #groesste schwankung die nicht als ausreisser gilt
#end config section
measureNumber = math.ceil(waitTime / interval)
def debug(message, debuglevel):
# print('debug ' + str(debug) +', '+ str(debuglevel))
if debugTreshold >= debuglevel:
if debugOutput == 1 or debugOutput == 3:
print(message)
if debugOutput == 2 or debugOutput == 3:
f = file(debugFile, 'a')
f.write(message + '\n')
f.close()
def mess():
# set Trigger to HIGH
GPIO.output(pinTrigger, True)
# set Trigger after 0.01ms to LOW
time.sleep(0.00001)
GPIO.output(pinTrigger, False)
startTime = time.time()
stopTime = time.time()
# save start time
while 0 == GPIO.input(pinEcho):
pass
startTime = time.time()
# save time of arrival
while 1 == GPIO.input(pinEcho):
pass
stopTime = time.time()
# time difference between start and arrival
TimeElapsed = stopTime - startTime
# multiply with the sonic speed (34300 cm/s)
# and divide by 2, because there and back
distance = (TimeElapsed * 34300) / 2
#print ("Distance: %.1f cm" % distance)
#time.sleep(interval)
return(distance)
def multiMess():
result = 0
list = []
list.append(mess())
list.append(mess())
list.append(mess())
list.sort()
debug("Multimessung: " + str(list), 3)
if (list[2] - list[1] > maxDelta):
list = list[:-1]
if (list[1] - list[0] > maxDelta):
result = list[1]
else:
num = 0
sum = 0
for i in list:
sum += i
num += 1
result = sum/num
debug("Messung: " + str(result), 2)
return result
def signal(pin):
"""
Schaltet den Pin 'pin' aus und wieder ein
"""
os.system("gpio -g write " + str(pin) + " 0")
sleep(0.1)
os.system("gpio -g write " + str(pin) + " 1")
def startShit():
"""
Person vor Spiegel - Zeige Bild etc.
"""
#action geht hier ab
# print("blubb")
#GPIO.output(bildPin, False)
#GPIO.output(bildPin, True)
#os.system("gpio -g write 24 0")
#os.system("gpio -g write 24 1")
debug("Person detektiert - schalte fernseher ein", 1)
signal(24)
sleep(60)
while True:
dist = multiMess()
if (dist > naehe):
debug("schalte fernseher aus",1)
# os.system("gpio -g write 25 0")
# os.system("gpio -g write 25 1")
signal(25) #schalte fernseher aus
break
sleep(10)
while True:
dist = multiMess()
#print ("distance: %.1f cm" % dist)
if (dist < naehe):
debug("Objekt gesehen - warte auf nachmessung",1)
sleep(waitTime)
b = multiMess()
if (b < naehe):
startShit()
else:
debug("Nachmessung erfolglos - gehe zurueck in suchmodus",1)
sleep(interval)
Alles anzeigen
Ich hoffe jemand kann mir helfen....