Hallo Zusammen,
nach dem wir hier: http://forum.fhem.de/index.php/topic,16519.msg130790.html#msg130790 (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
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.
Schau mal hier: http://www.mikrocontroller.net/articles/Pegelwandler (http://www.mikrocontroller.net/articles/Pegelwandler)
Dort sind einige Infos
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.
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.
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.
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) (http://www.raspberrypi.org/forums/viewtopic.php?f=45&t=22841) gelesen das ein 1k Ohm Widerstand in Serie reicht. Hab es bei mir jetzt so im Einsatz.
Zitat von: mahjonggZitat 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!
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.
Das Thema ist zwar schon alt, aber vielleicht hilft es jemandem.
Siehe hier:
http://forum.fhem.de/index.php/topic,12611.msg78089.html#msg78089 (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?
Hi Rippi46,
ich habe das gleiche Prozessproblem wie du. Hast du inzwischen eine schöne Lösung dafür gefunden?
VG
Pazekal
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.
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