#!/usr/bin/python

import RPi.GPIO as GPIO
import time
import datetime

# GPIOs fuer den US-Sensor
TRIG = 17
ECHO = 27

# Dauer Trigger-Impuls
PULSE = 0.00001

# Anzahl Messwerte fuer Mittelwertbildung
BURST = 25

# Schallgeschwindigkeit/2
SPEED_2 = 17015

# BCM GPIO-Referenen verwenden (anstelle der Pin-Nummern)
# und GPIO-Eingang definieren
GPIO.setmode(GPIO.BCM)
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.output(TRIG, False)
time.sleep(1)                   # Setup-Zeit fuer Sensor

def measure():                  # Messung ausfuehren
  GPIO.output(TRIG, True)       # Trigger-Impuls
  time.sleep(PULSE)
  GPIO.output(TRIG, False)
  starttime = time.time()       # Zeit initialisieren
  stopp = starttime
  start = starttime
  # Warten auf steigende Flanke, max. 2 Sekunden
  while  GPIO.input(ECHO) == 0 and start < starttime + 2:
    start = time.time()         # Startzeit
  # Warten auf fallende Flanke, max. 2 Sekunden
  while  GPIO.input(ECHO) == 1 and stopp < starttime + 2:
    stopp = time.time()         # Endezeit
  delta = stopp - start         # Zeitdifferenz und Entfernung berechnen
  distance = delta * SPEED_2
  return distance

def measure_range():            # Bildet Mittelwert von BURST Messungen
  values = []
  sum = 0
  for i in range(0, BURST):
    values.append(measure())    # Messung starten
    sum = sum + values[i]       # Wert im Array speichern und aufsummieren
    print("Messwert: %1.1f" % values[i]) # Kontrollausgabe
    time.sleep(0.05)
  return sum/BURST;             # Mittelwert zurueckgeben

# do it
try:
  while True:
    Distance = measure_range()
    print("Range = %1.1f cm" % Distance)
    time.sleep(1)

# reset GPIO settings if user pressed Ctrl+C
except KeyboardInterrupt:
  print("Hasta la vista")
  GPIO.cleanup()


