Ultraschall Entfernungsmessung mit Raspberry, FHEM und dem HC-SR04 Modul

Begonnen von ollir, 05 Februar 2014, 21:27:46

Vorheriges Thema - Nächstes Thema

ollir

Hallo Zusammen,

nach dem wir hier: http://forum.fhem.de/index.php/topic,16519.msg130790.html#msg130790 nicht weiter gekommen sind wollte ich kurz meine Lösung vorstellen.

Es geht um das Ultaschallmodul HC-SR04 und seine Einbindung in FHEM.
Füllstandsmessung, Näherungsschalter ............

Zuerst einen Dummy mit Attributen anlegen (Hier UC1)
Zitatdefine UC1 dummy
attr UC1 stateFormat Abstand
attr UC1 userReadings Abstand
Dann einen AT-Job anlegen (nicht unter 3Sek. sonst kommt es zu Problemem)
Zitatdefine at_UC1 at +*00:00:03 {system 'sudo /usr/bin/python /opt/fhem/FHEM/UC1.sh &'}
attr at_UC1 verbose 0 
Ein Script mit entspechenden Berechtigungen erstellen
Zitat/opt/fhem/FHEM/UC1.sh
Dieses Script mit folgenden Python-Script füllen
Zitat#!/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

# --------------------------------------------------------
#                  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 = 22   ####  evtl. GPIO anpassen
GPIO_ECHO    = 23   ####  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()        # fuer einmalige Messung
if float(distanceRet) <= 400:
  os.system('perl /opt/fhem/fhem.pl 7072 "setreading UC1 Abstand '+str(distanceRet)+'"')
GPIO.cleanup()

Hardwareanschluss:

Der ECHO Ausgang gibt 5V heraus! Spannungsteiler vor den GPIO-IN des RPi's schalten um auf 3V zu kommen.
Der TRIGGER Eingang des HC-SR04 funktioniert auch mit den 3V des RPi GPIO'S


Viel Grüße
Olaf

P.S. Falls jemand Verbesserungen im Script oder eine Modullösung hat, bitte her damit.  :P

Freibeuter

Hallo, ich möchte das gerne nachbauen um den Wasserstand in einem Schacht zu messen.
Bei den Spannungsteilern bin ich mir unsicher, würde das hier passen ?
http://www.pollin.de/shop/dt/NDY4OTI4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Spannungsregler/Spannungsregler_ST_L78L33ACZ.html
Gruß
Peter F.


Freibeuter

Hoppla, das sind wirklich einige Infos.
Ich fürchte etwas zu viele für mich, könntest du mir einen Produktlink schicken oder beschreiben wie Du es gelöst hast?
Gruß
Peter F.

Freibeuter

Habe da gerade was gefunden :
http://www.gtkdb.de/index_36_2272.html
Sehe ich das richtig, das ich ein 330 und ein 470 Ohm Widerstand benötig ?
Danke für Tips
Gruß
Peter F.

inesa394

Richtig wird benötigt,habe den bei mir auch allerdings nicht in Verbindung mit Fhem
Ist bei mir so eine  Alarmanlage mit PIR Sensor und diesen hier.




fhainz

Hallo!

Bin mir klappt das aufrufen der .sh Datei via FHEM nicht.
Wenn ich zb
{system 'sudo /usr/bin/python /opt/fhem/FHEM/hc-sr04.sh &'}
direkt in die befehlszeile eingebe, steht am nächsten screen -1.
Das selbe passiert im at Aufruf und wenn ich das attr verbose 0 weglasse steht auch im Log

2014.06.20 14:58:06 3: at_raspiVT_Ultraschall: -1

Der direkte Aufruf der sh Datei am pi klappt via ssh problemlos.

sudo /usr/bin/python /opt/fhem/FHEM/hc-sr04.sh

Ich hab ein Raspi 512MB Rev 2.

Jemand eine Idee?

Grüße

Edit2:
Hab es hinbekommen. Siehe hier: http://forum.fhem.de/index.php/topic,12611.msg78089.html#msg78089


Edit:
Ich hab hier (5. Post) gelesen das ein 1k Ohm Widerstand in Serie reicht. Hab es bei mir jetzt so im Einsatz.

Zitat von: mahjongg
Zitat von: Metatronin
So any 5v signal to the GPIO's need just a 1k resistor...is level shifting overkill(like in attached pic)?

Yes level shifting is generally overkill!

Freibeuter

Hallo!
ich komme  leider nicht weiter,
wenn ich folgendes in FHEM eingebe: {system 'sudo /usr/bin/python /opt/fhem/FHEM/UC1.sh &'}
bekomme ich immer -1.
Wenn ich per SSH dieses sende: sudo /usr/bin/python /opt/fhem/FHEM/UC1.sh &
bekomme ich :
~ $ /opt/fhem/FHEM/UC1.sh:59: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger

Die GPIO sollten aber frei sein, ich habe sie beide zum Test in FHEM mit define GPIO_0 RPI_GPIO 17 define GPIO_1 RPI_GPIO 18 angelegt und darauf geschrieben / sie gelesen, klappt problemlos.

Auch habe ich das Echo Signal nur mit 10k in Reihe angeschlossen, klappte mit RPI_GPIO mit GRND / 5V.
In der UC1.sh habe ich auch:
   GPIO_TRIGGER = 17   ####  evtl. GPIO anpassen
   GPIO_ECHO    = 18   ####  evtl. GPIO anpassen


Hat einer von Euch eine Idee?
Gruß
Peter F.

rippi46

Das Thema ist zwar schon alt, aber vielleicht hilft es jemandem.

Siehe hier:
http://forum.fhem.de/index.php/topic,12611.msg78089.html#msg78089

Post 16 hat bei mir geholfen!!

Ich habe nur das Problem, dass bei jedem Aufruf ein neuer Prozess gestartet wird. Nach ein paar Minuten kann man das System nicht mehr bedienen.

Habe als Quicklösung einen 2. Timer definiert:

define at_UC1kill at +*00:00:10 {system 'sudo pkill UC1.sh >/dev/null >/dev/null'}
attr at_UC1kill verbose 0


Vieleicht hat ja jemand eine bessere Lösung?
FHEM, LMS, VDR ,Dell 9010 Ubuntu 20.04,Raspimatic, HM/HMIP, Max, Elro, Brennenstuhl u. Intertechno mit Connair.
Picoreplayer, Raspi IR-Lanadapter, Firmata(wifi), LaCrosse,
nanocul433, nanocul868, Signalduino, Connexoon,
MySensor-GW+Sensoren, RGBWW, Zigbee2mqtt,Xiaomi,Nextion,LEDMatrix,Alexa

Pazekal

Hi Rippi46,

ich habe das gleiche Prozessproblem wie du. Hast du inzwischen eine schöne Lösung dafür gefunden?

VG
Pazekal

Pit@Jura

Hi Rippi46 und Pazekal,
gerade baue ich eine automatische Pelletsbefüllung mit 2 Lichtschranken. Optimal wäre zusätzlich den Füllstand des Behälters per Ultraschall auszuwerten. Hier habe ich sie bei Euch gefunden.
--> Gibt es schon eine echte Lösung zum automatischen Beenden der Prozesse?
Danke für Eure Antwort.

Pit@Jura

Hi,
sollte jemand dieses Script noch benutzen: Die Anzahl der nicht geschlossenen Python-Prozesse kann man deutlich reduzieren, wenn man in dem Python Script die letzte Zeile um zwei Zeichen einrückt oder vor die letzte Zeile einen Zeilenumbruch setzt. Ich bin Python-Anfänger - ich habe aber verstanden, dass der Compiler sehr streng mit Einrückungen umgeht.
LG