Seite 1 von 1
Unterbrechung einer Lichtschranke
Verfasst: Montag 29. Oktober 2018, 21:49
von therealgherkhin
Hallo zusammen,
ich möchte die Unterbrechung einer Lichtschranke erkennen und anschließend die Anzahl der Unterbrechungen in eine Variable speichern.
Ich bin allerdings mit den ganzen GPIO Pins des Pi´s nicht komplett vertraut und kann daher den folgenden Code nicht ganz verstehen.
Code: Alles auswählen
import RPi.GPIO as GPIO
import os, time
RECEIVER_PIN = 23
def callback_func(channel):
if GPIO.input(channel):
print("Lichtschranke wurde unterbrochen")
# alternativ kann ein Script / Shell Befehl gestartet werden
# os.system("ls")
if __name__ == '__main__':
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(RECEIVER_PIN, GPIO.IN)
GPIO.add_event_detect(RECEIVER_PIN, GPIO.RISING, callback=callback_func, bouncetime=200)
try:
while True:
time.sleep(0.5)
except:
# Event wieder entfernen mittels:
GPIO.remove_event_detect(RECEIVER_PIN)
Den Code habe ich von der Seite
https://tutorials-raspberrypi.de/raspbe ... distanzen/, da ich alleine komplett verloren wäre.
Könnte mir jemand die Funktion des "if" Abschnittes und der Funktion erklären?
Vielen Dank

Re: Unterbrechung einer Lichtschranke
Verfasst: Montag 29. Oktober 2018, 22:28
von Sirius3
Das ist das Problem mit Code, den man irgendwo findet, er ist meist furchtbar schlecht. Die if-Abfrage hat keine Funktion. Schon das `import RPi.GPIO as GPIO` ist blöd, da man as zum Umbennenen benutzt, GPIO aber gar nicht umbenannt wird, sollte also `from RPi import GPIO heißen. Aber Module schreibt man nach Konvention klein, so dass es `from RPi import GPIO as gpio` heißen müßte. `os` wird nicht benutzt. In `callbacks` sollte so wenig Code wie möglich stehen, vor allem keine aufwendigen IO-Operationen. Warnings sind dazu da, dass sie behoben werden, nicht, dass sie ignoriert werden. Nakte excepts sollte man nicht benutzten, weil dadurch alle Fehler verschleiert werden, auch Programmierfehler.
Code: Alles auswählen
from RPi import GPIO as gpio
from functools import partial
from queue import Queue
RECEIVER_PIN = 23
def main():
try:
gpio.setmode(gpio.BCM)
gpio.setup(RECEIVER_PIN, gpio.IN)
queue = Queue()
gpio.add_event_detect(RECEIVER_PIN, gpio.RISING, callback=queue.put, bouncetime=200)
while True:
channel = queue.get()
print("Lichtschranke wurde unterbrochen")
exception KeyboardInterrupt:
pass
finally:
gpio.cleanup()
if __name__ == '__main__':
main()
Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 08:50
von therealgherkhin
So weit, so gut.
Code: Alles auswählen
from RPi import GPIO as gpio
from functools import partial
from queue import Queue
RECEIVER_PIN = 23
def main():
try:
gpio.setmode(gpio.BCM) #initialisiert das GPIO Board
gpio.setup(RECEIVER_PIN, gpio.IN) # initialisiert den PIN 23 als Input
queue = Queue() # queue als Funktion
gpio.add_event_detect(RECEIVER_PIN, gpio.RISING, callback=queue.put, bouncetime=200) # queue = Pausierung der Abfrage zum Entlasten des CPU`s
while True:
channel = queue.get()
print("Lichtschranke wurde unterbrochen")
exception KeyboardInterrupt:
pass
finally:
gpio.cleanup()
if __name__ == '__main__':
main()
Ich habe den Code jetzt so halbwegs verstanden, allerdings erübrigt sich mir noch eine Frage.
In der "while-Schleife" wird ja gecheckt, ob die Lichtschranke unterbrochen wurde.
Wie könnte ich nun die Anzahl der Unterbrechungen zählen?
Liebe Grüße
Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 09:10
von __blackjack__
@therealgherkhin: Arbeite am besten mal ein Grundlagentutorial durch. In der Python-Dokumentation gibt es beispielsweise eines. Danach solltest Du das selbst können.
Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 09:13
von therealgherkhin
Das Grundlagentutorial für GPIO’s oder welche meinst du?

Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 09:20
von __blackjack__
@therealgherkhin: Ein Grundlagentutorial für Python. Für GPIOs gibt's keines in der *Python*-Dokumentation, denn das ist ja ein sehr spezielles Thema. Wie man in einem Programm grundsätzlich etwas zählt ist ein davon unabhängig, viel allgemeineres Problem.
Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 09:37
von therealgherkhin
Würde das dann nicht das Problem lösen?
Code: Alles auswählen
from RPi import GPIO as gpio
from functools import partial
from queue import Queue
RECEIVER_PIN = 23
counter = 0
def main():
try:
gpio.setmode(gpio.BCM) #initialisiert das GPIO Board
gpio.setup(RECEIVER_PIN, gpio.IN) # initialisiert den PIN 23 als Input
queue = Queue() # queue als Funktion
gpio.add_event_detect(RECEIVER_PIN, gpio.RISING, callback=queue.put, bouncetime=200) # queue = Pausierung der Abfrage zum Entlasten des CPU`s
while True:
channel = queue.get()
counter = counter +1
print("Lichtschranke wurde unterbrochen")
exception KeyboardInterrupt:
pass
finally:
gpio.cleanup()
if __name__ == '__main__':
main()
Also einfach einen Counter am Anfang definieren, der dann immer um +1 erhöht wird wenn die Bedingung True ist?
Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 09:49
von __blackjack__
@therealgherkhin: Probier's doch mal aus.
Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 10:11
von therealgherkhin
Würde ich gerne, allerdings habe ich gerade meinen Pi nicht zur Hand.
Theoretisch dürfte es doch so klappen oder nicht?

Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 10:21
von __blackjack__
@therealgherkhin: Theoretisch ja, praktisch ist da noch ein kleiner Fehler drin der mit den Sichtbarkeitsregeln von Variablen zu tun hat. Also insbesondere wann ein Name lokal in einer Funktion ist, und damit etwas anderes als der gleiche Name auf Modulebene. Auf Modulebene sollte es aber auch sowieso keine Variablen geben.
Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 11:03
von therealgherkhin
Okay das übersteigt mein Wissen.
Wie kann ich das Problem lösen bzw. wo könnte ich etwas darüber lesen damit ich das lösen kann?
Vielen Dank

Re: Unterbrechung einer Lichtschranke
Verfasst: Mittwoch 31. Oktober 2018, 11:11
von __blackjack__
@therealgherkhin: In der Python-Dokumentation gibt es ein Tutorial zu Python.