Ultraschallmessung per Python. Formatierung der Ausgabe aber falsch

Begonnen von Pazekal, 20 Januar 2017, 18:16:33

Vorheriges Thema - Nächstes Thema

Pazekal

Hallo zusammen,

ich habe meinen Ultraschallsensor nun am Laufen und bekomme Werte übermittelt, die ich umrechne über dieses Script:
#!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# Orginal-Script von Author : Matt Hawkins ultrasonic_2.py
# Measure distance using an ultrasonic module
#
# --------------------------------------------------------
#           Import required Python libraries
# --------------------------------------------------------
#
# Veraendert von Ollir (FHEM-Forum) fuer die Rueckgabe an
# FHEM per Telnet: Port 7072
#

import time
import RPi.GPIO as GPIO
import os
GPIO.setwarnings(False)

# --------------------------------------------------------
#                  Define some functions
# --------------------------------------------------------

def measure():
  time.sleep(0.2)
  GPIO.output(GPIO_TRIGGER, True)
  time.sleep(0.0001)
  GPIO.output(GPIO_TRIGGER, False)
  while GPIO.input(GPIO_ECHO)==0:
    start = time.time()
  while GPIO.input(GPIO_ECHO)==1:
    stop = time.time()
  elapsed = stop - start
  distance = elapsed * 17150
#  if float(distance) >= 400:
#    distance = measure()
  return distance

def measure_average():
  # This function takes 3 measurements and
  # returns the average.
  distance1 = measure()
  distance2 = measure()
  distance3 = measure()
  distance_sum = distance1 + distance2 + distance3
  distance = distance_sum / 3
  return distance

# --------------------------------------------------------
#                        Main Script
# --------------------------------------------------------
# Use BCM GPIO references
# instead of physical pin numbers

GPIO.setmode(GPIO.BCM)
GPIO_TRIGGER = 15   ####  evtl. GPIO anpassen
GPIO_ECHO    = 16   ####  evtl. GPIO anpassen
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo
GPIO.output(GPIO_TRIGGER, False)

# --------------------------------------------------------
#                Rueckgabe an FHEM
# --------------------------------------------------------

#distanceRet = "%.1f" % measure_average() # fuer Mittelwert Messung
distanceRet = "%.1f" % measure()
os.system('perl /opt/fhem/fhem.pl 7072 "setreading KlappeTV Abstand '+str(distanceRet)+'"')
print "Distanz : %.1f" % measure()
GPIO.cleanup()


Problem ist nun aber, dass ich bei meiner Test Print Ausgabe einen Wert von ca. 3000 bekomme(Das wäre korrekt) und bei mir im FHEM ein Wert von 5.8 oder 4.8 ankommt. Ich verstehe nicht, wo an dieser Stelle diese Anpassung des Wertes passiert.

Kann mir jemand von euch helfen?

Danke

VG
Pazekal

Pazekal

Hi zusammen,

habe das Problem selbst gefunden.
Der Sensor HC-SR04 produziert nicht immer ein sauberes Ergebnis. Scheinbar prallen immer mal wieder die versendeten Ultraschallwellen links am Regal ab und landen entsprechend früher beim Empfänger als sie das eigentlich sollten.

Ich habe, um solche Ausreißer nun zu kompensieren den Mittelwert noch etwas erweitert auf 7 statt 3 Werte für die Berechnung.
Das ganze wird morgen noch in eine FOR Schleife gelegt, dass es besser aussieht. Aktuell ist das noch provisorisch gelöst. :)

Hier der angepasste Code. Ich habe auch das Format noch auf zwei Nachkommastellen angepasst und die Funktion etwas leserlicher gestaltet.
Ebenfalls verändert habe ich die Berechnung des Abstands und ich habe die IFs entnommen bei denen durch Ollir hier aus dem Forum verhindert wird, dass Werte über 400 möglich sind. Die sollen ja möglich sein.

!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# Orginal-Script von Author : Matt Hawkins ultrasonic_2.py
# Measure distance using an ultrasonic module
#
# --------------------------------------------------------
#           Import required Python libraries
# --------------------------------------------------------
#
# Veraendert von Ollir (FHEM-Forum) fuer die Rueckgabe an
# FHEM per Telnet: Port 7072
#

import time
import RPi.GPIO as GPIO
import os
GPIO.setwarnings(False)

# --------------------------------------------------------
#                  Define some functions
# --------------------------------------------------------

def measure():
  time.sleep(0.2)
  GPIO.output(GPIO_TRIGGER, True)
  time.sleep(0.00001)
  GPIO.output(GPIO_TRIGGER, False)
  while GPIO.input(GPIO_ECHO)==0:
    start = time.time()
  while GPIO.input(GPIO_ECHO)==1:
    stop = time.time()
  elapsed = stop-start
  distance = (elapsed * 34300)/2
#  if float(distance) >= 400:
#    distance = measure()
  return distance

def measure_average():
  # This function takes 3 measurements and
  # returns the average.
  distance1 = measure()
  time.sleep(0.2)
  distance2 = measure()
  time.sleep(0.2)
  distance3 = measure()
  time.sleep(0.2)
  distance4 = measure()
  time.sleep(0.2)
  distance5 = measure()
  time.sleep(0.2)
  distance6 = measure()
  time.sleep(0.2)
  distance7 = measure()
  distance = distance1 + distance2 + distance3 + distance4 + distance5 + distance6 + distance7
  distance = distance/7
  return distance

# --------------------------------------------------------
#                        Main Script
# --------------------------------------------------------

# Use BCM GPIO references
# instead of physical pin numbers

GPIO.setmode(GPIO.BCM)
GPIO_TRIGGER = 15   ####  evtl. GPIO anpassen
GPIO_ECHO    = 16   ####  evtl. GPIO anpassen
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo
GPIO.output(GPIO_TRIGGER, False)

# --------------------------------------------------------
#                Rueckgabe an FHEM
# --------------------------------------------------------

# Format for two digits after the comma
two_digit_float = "{:.2f}"

distanceRet = two_digit_float.format(measure_average()) # fuer Mittelwert Messung
os.system('perl /opt/fhem/fhem.pl 7072 "setreading KlappeTV Abstand '+str(distanceRet)+'"')

# Debug Print
# print "Distanz : %.1f" % measure_average()

GPIO.cleanup()