Unterbrechung einer Lichtschranke

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
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 :)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
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
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@therealgherkhin: Arbeite am besten mal ein Grundlagentutorial durch. In der Python-Dokumentation gibt es beispielsweise eines. Danach solltest Du das selbst können.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
therealgherkhin

Das Grundlagentutorial für GPIO’s oder welche meinst du? :)
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
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?
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@therealgherkhin: Probier's doch mal aus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
therealgherkhin

Würde ich gerne, allerdings habe ich gerade meinen Pi nicht zur Hand.

Theoretisch dürfte es doch so klappen oder nicht? :)
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
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 :)
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@therealgherkhin: In der Python-Dokumentation gibt es ein Tutorial zu Python.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten