Ultraschallsensor steuert LED

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Hallo zusammen.

Vor ca. 2 Monaten habe ich mir einen Raspberry Pi zugelegt und habe schon einige Versuche mit Temperaturfühler, LCD etc. durchgeführt. Es hat mich immer schon brennend interessiert Elektronik mit Software zu kombinieren und die Möglichkeiten sind wirklich unendlich.

Mit der Zeit wünscht man sich aber ein konkretes Projekt und da habe ich mir einen Abstandswarner für meine Garage ausgewählt. Mit einem Ultraschallsensor und ein paar LED überwache ich den Abstand meines Autos von der Wand. Je nach Abstand leuchten drei LED (ok - Achtung - stopp) Nun funktioniert alles soweit ganz ok nur möchte ich, wenn ich den Stoppunkt erreicht habe, dass die LED auch löscht. Leider funktioniert mein Code nicht wie ich es möchte. Könnte nicht jemand mal einen Blick darauf werfen und mir einen Tipp geben. Meinen Code kopiere ich hier einmal hinein. Ich weiß leider nicht was euch noch für eine Lösung an Infos fehlen. Seid bitte nachsichtig mit einem Greenhorn das aber bereit ist zu lernen.

Vielen Dank im Voraus für eure Gedanken
leafboy

Code:
#!/user/bin/python3
#Datei ultraschall-abstand-led.py

import time
import RPi.GPIO as GPIO

# Pin Nummern vom Board
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# Referenz zu Pin Nummer
trig = 29 #GPIO-pin-nummer
echo = 31
ok = 36
achtung = 38
stop = 32

# Definition von Referenz
GPIO.setup(echo, GPIO.IN)
GPIO.setup(trig, GPIO.OUT)
GPIO.setup(ok, GPIO.OUT)
GPIO.setup(achtung, GPIO.OUT)
GPIO.setup(stop, GPIO.OUT)

# Ultraschall Sensor
while True:
GPIO.output(trig, True)
time.sleep(0.00001) # 10 millisekunden
GPIO.output(trig, False)
while GPIO.input(echo) == 0:
pass
start = time.time()
while GPIO.input(echo) == 1:
pass
ende = time.time()
entfernung = ((ende - start) * 34300) / 2

# Entfernung ausgeben - Kontrolle ob Messung laeuft
print("Entfernung: %.f" % entfernung)
time.sleep(1)

# Anzeige Abstand erreicht Achtung
if entfernung <= 15:
GPIO.output(ok,False)
GPIO.output(achtung,False)
GPIO.output(stop,True)
# Anzeige Abstand erreicht Stopp
if entfernung <= 9:
GPIO.output(ok,True)
GPIO.output(achtung,True)
GPIO.output(stop,False)
# Anzeige System ok
if entfernung >= 16:
GPIO.output(ok,False)
GPIO.output(achtung,True)
GPIO.output(stop,True)
# Anzeige alle LED aus
if entfernung >= 20:
GPIO.output(ok,True)
GPIO.output(achtung,True)
GPIO.output(stop,True)

GPIO.cleanup()
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte Beitrag wenn moeglich bearbeiten & den Code in Code-Tags setzen. Ansonsten bitte noch mal posten. Sonst ist der nicht nachvollziehbar.
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Oh - sorry hoffe das passt so besser.

Vielen Dank für den Tipp
leafboy

Code: Alles auswählen

#!/user/bin/python3
#Datei ultraschall-abstand-led.py

import time
import RPi.GPIO as GPIO

# Pin Nummern vom Board
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

# Referenz zu Pin Nummer
trig = 29 #GPIO-pin-nummer
echo = 31
ok = 36
achtung = 38
stop = 32

# Definition von Referenz
GPIO.setup(echo, GPIO.IN)
GPIO.setup(trig, GPIO.OUT)
GPIO.setup(ok, GPIO.OUT)
GPIO.setup(achtung, GPIO.OUT)
GPIO.setup(stop, GPIO.OUT)

# Ultraschall Sensor
while True:
        GPIO.output(trig, True)
        time.sleep(0.00001) # 10 millisekunden
        GPIO.output(trig, False)
        while GPIO.input(echo) == 0:
                pass
        start = time.time()
        while GPIO.input(echo) == 1:
                pass
        ende = time.time()
        entfernung = ((ende - start) * 34300) / 2
        
# Entfernung ausgeben - Kontrolle ob Messung laeuft
        print("Entfernung: %.f" % entfernung)
        time.sleep(1)
        
# Anzeige  Abstand erreicht Achtung
        if entfernung <= 15:
                GPIO.output(ok,False)
                GPIO.output(achtung,False)
                GPIO.output(stop,True)   
# Anzeige  Abstand erreicht Stopp
        if entfernung <= 9:
                GPIO.output(ok,True)
                GPIO.output(achtung,True)
                GPIO.output(stop,False) 
# Anzeige  System ok
        if entfernung >= 16:
                GPIO.output(ok,False)
                GPIO.output(achtung,True)
                GPIO.output(stop,True)
# Anzeige  alle LED aus
        if entfernung >= 20:
                GPIO.output(ok,True)
                GPIO.output(achtung,True)
                GPIO.output(stop,True)

GPIO.cleanup()
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir ist nicht so ganz klar, was da jetzt genau das Problem ist. Fuer welchen Entfernungswert passt es denn nicht, und was *soll* passieren?
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Hallo __deets__

Die Stop led leuchtet auf wenn ich mit dem Auto an den Endpunkt ankomme. Nun leuchtet die LED aber die ganze Zeit. Die LED ist bei mir ein RGB LED Band welches ich über FET ansteuere. Diese sollte nach ca. 60 s abschalten. Wenn ich nun eine Verzögerung einbaue wird zwar die LED auch dunkel aber der Sensor somit auch unterbrochen und es findet keine Messung mehr statt oder je nach Zeitverzögerung. An was ich gedacht hätte wäre die Messung auszulagern und den Wert "entfernung" auszuwerten ohne in einer Schleife stecken zu bleiben oder den Prozess zu verlangsamen. Leider habe ich da noch zuwenig Progammiererfahrung.

Hoffe, dass ich mich besser ausgedrückt habe.
Vielen Dank
leafboy
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah. Verstehen tu ich’s jetzt. Schwierig ist trotzdem. Ich würde das mit einem Zustandsautomaten lösen. Eine Implementierung habe ich mal hier gemacht:

https://github.com/deets/brombeerquark/ ... gpio-utils

Das ist aber keine leichte Kost.

Generell solltest du auf RPI.GPIO verzichten, und pigpio benuzten. Das ist performanter und zuverlässiger. Dann solltest du eine haupschleife mit einer Queue haben, in der du aus Ereignis-Rückruffunktionen die Entfernung bestimmst & in die Queue schreibst.
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Hallo __deets__

Vielen Dank für die Rückmeldung. Ich dachte ursprünglich an eine Flip-Flop Steuerung aus der Digitaltechnik. In diesem Fall werde ich das mit 20mm LED lösen. Die begnügen sich mit einigen wenigen Watt. Da ist es nicht so tragisch wenn die immer leuchten. Jetzt hätte ich eine RGB LED Balken mit ca. 20W vorgesehen. Vielleicht gehe ich das Projekt nochmals an wenn ich mehr Erfahrung gesammelt habe. Wie gesagt meine Programmierkenntnisse sind noch sehr rudimentär aber das Thema hat mich schon gefesselt. Trotzdem vielen Dank für deine Hilfe.

lg
leafboy
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem ist halt die Logik ist komplizierter als man das erstmal so denkt. Denn wenn die LEDs aus sind, müssen die ja wieder angehen, wenn das Fahrzeug sich doch wieder bewegt. Sonst krachst du einfach in die Wand. Das bedeutet dann schon ein bisschen Mehraufwand.
Antworten