Guten Tag ich bin neu in diesem Forum und habe mich heute extra wegen einem Problem bei dem ich hilfe benötige angemeldet.
Meine Skills sind eher noch im Anfängerbereich einzuordnen was Python angeht, bin aber nicht vollständig programmier unerfahren.
Nun zu meinem Problem:
Ich versuche an meinem Raspberry Pi 3 2 Laserlichtschranken im laufendem programm so auszulesen das ich quasi einfach nur den zustand abfrage, soll heissen ich habe ein bestehendes programm was in einer while schleife läuft und irgwas tut. nun möchte ich in jedem schleifen umlauf nacheinander prüfen ob schleife 1 offen oder geschlossen ist und entsprechende maßnahmen für einen zustand treffen in meinem beispiel will ich prüfen ob s1(schleife1) geschlossen ist und dann weitere operationen vornehmen und das gleiche im anschluss mit s2(schleife2).
im meinem naiven kopf sieht das in etwa so aus.
while 1:
if s1 = 1:
...
if s2 = 1:
...
Module und laser sind die gleichen wie von dieser Seite:
https://tutorials-raspberrypi.de/raspbe ... distanzen/
so wie in dem beispiel kann ich es aber nicht machen weil hier permanent in einer while das hauptprogramm quasi unterbrochen wird und bei mir ist es wichtig das ein schleifenumlauf des hauptprogramms 1 Sekunde ist.
für ideen oder beispiele währe ich echt mega dankbar.
Kuss schonmal im vorraus ;P
Laserlichtschranke simpel auslesen
Jedes GPIO Framework (empfohlen wird dieser Tage gpiozero) besitzt die Faehigkeit, Rueckruffunktionen zur Ereignisbehandlung anzugeben. Damit kannst du die jeweiligen Ereignisse der Lichtschranken in eine Queue stopfen, und in deiner Hauptschleife abfragen, ob und was in der Queue so drin steckt. Eine Suche hier im Forum sollte da ausreichend Hinweise liefern. Ich wuerde aber via Google suchen. PHP BB Forumssuche selbst ist eher mau.
- __blackjack__
- User
- Beiträge: 13113
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Toastgott: Was ist denn jetzt das konkrete Problem oder die konkrete Frage?
Zu dem was im Kopf schon existiert: Python hat einen Typ für Wahrheitswerte (`bool`) mit den Werten `True` und `False`. Da sollte man keine Zahlen für missbrauchen. Wird in dem Beispiel in dem Blog ja richtig gemacht.
Der Vergleichsoperator in Python lautet ``==``. ``=`` ist für Zuweisungen.
An der Stelle wo `s1` und `s2` stehen muss halt der entsprechende Funktionsaufruf hin um den Zustand von einem Pin abzufragen. Das Ergebnis vergleicht man nicht mit einem Wert, sondern verwendet das direkt als Bedingung. Oder man verwendet ``not`` wenn man das Gegenteil testen will.
Vor der Schleife fehlt noch der Setup-Kram, und man sollte sicherstellen, das am Programmende `GPIO.cleanup()` aufgerufen wird. Dann kann man sich auch die Deaktivierung von Warnungen sparen, wie fälschlicherweise im Code vom Blog zu sehen ist.
Zu dem was im Kopf schon existiert: Python hat einen Typ für Wahrheitswerte (`bool`) mit den Werten `True` und `False`. Da sollte man keine Zahlen für missbrauchen. Wird in dem Beispiel in dem Blog ja richtig gemacht.
Der Vergleichsoperator in Python lautet ``==``. ``=`` ist für Zuweisungen.
An der Stelle wo `s1` und `s2` stehen muss halt der entsprechende Funktionsaufruf hin um den Zustand von einem Pin abzufragen. Das Ergebnis vergleicht man nicht mit einem Wert, sondern verwendet das direkt als Bedingung. Oder man verwendet ``not`` wenn man das Gegenteil testen will.
Vor der Schleife fehlt noch der Setup-Kram, und man sollte sicherstellen, das am Programmende `GPIO.cleanup()` aufgerufen wird. Dann kann man sich auch die Deaktivierung von Warnungen sparen, wie fälschlicherweise im Code vom Blog zu sehen ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Hallo zusammen ich konnte das Problem lösen juhu, die Antworten haben mir indirekt geholfen der Tipp mit dem GPIOzero hat mich zu einem einsteiger tutorial gebracht:
https://tutorials-raspberrypi.de/raspbe ... ng-lernen/
aber kurz gefasst war der befehl den ich gesucht habe: "GPIO.input(PORT)"
hier noch der code für andere zum ausprobieren:
Ich hoffe falls in zukunft jemand vor dem selben Problem steht das ich hiermit weiterhelfen konnte
https://tutorials-raspberrypi.de/raspbe ... ng-lernen/
aber kurz gefasst war der befehl den ich gesucht habe: "GPIO.input(PORT)"
hier noch der code für andere zum ausprobieren:
Code: Alles auswählen
import RPi.GPIO as GPIO
import time
s1 = 23 #Lichtschrankenport 1 GPIO 23
s2 = 22 #Lichtschrankenport 2 GPIO 22
GPIO.setmode(GPIO.BCM)
#beide Ports als GPIO eingänge eingerichtet
GPIO.setup(s1, GPIO.IN)
GPIO.setup(s2, GPIO.IN)
#endlosschleife für wiederholte abfrage der eingänge
while 1:
print("s1")
print(GPIO.input(s1)) #auslesen des Lichtschrankenports 1
print("s2")
print(GPIO.input(s2)) #auslesen des Lichtschrankenports 2
print("__________")
time.sleep(1.0) #1 Sekunde warten
- __blackjack__
- User
- Beiträge: 13113
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Toastgott: Anmerkungen zum Quelltext:
Ich schrob doch extra schon, dass es Wahrheitswerte gibt und man dafür keine Zahlen missbrauchen sollte.
``as`` bei Importen ist zum umbenennen gedacht, `GPIO` wird aber gar nicht umbenannt.
Die Kommentare sind alle überflüssig oder könnten es sein, wenn man nicht so schlechte Namen wie `s1` und `s2` verwenden würde. Die Kommentare die nichts mit schlechten Namen zu tun haben, sagen nur das was da ganz offensichtlich bereits als Code steht.
Konstanten werden in Python KOMPLETT_GROSS geschrieben.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
`GPIO.setup()` kann man mehr als einen Pin übergeben.
Das man auf jeden Fall vor dem Programmende `GPIO.cleanup()` aufrufen sollte, hatte ich auch schon geschrieben.
Ungetestet:
Ich schrob doch extra schon, dass es Wahrheitswerte gibt und man dafür keine Zahlen missbrauchen sollte.
``as`` bei Importen ist zum umbenennen gedacht, `GPIO` wird aber gar nicht umbenannt.
Die Kommentare sind alle überflüssig oder könnten es sein, wenn man nicht so schlechte Namen wie `s1` und `s2` verwenden würde. Die Kommentare die nichts mit schlechten Namen zu tun haben, sagen nur das was da ganz offensichtlich bereits als Code steht.
Konstanten werden in Python KOMPLETT_GROSS geschrieben.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
`GPIO.setup()` kann man mehr als einen Pin übergeben.
Das man auf jeden Fall vor dem Programmende `GPIO.cleanup()` aufrufen sollte, hatte ich auch schon geschrieben.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import time
from RPi import GPIO
PHOTO_SENSOR_A_PIN = 23
PHOTO_SENSOR_B_PIN = 22
def main():
try:
GPIO.setmode(GPIO.BCM)
GPIO.setup([PHOTO_SENSOR_A_PIN, PHOTO_SENSOR_B_PIN], GPIO.IN)
while True:
print("PHOTO_SENSOR_A_PIN")
print(GPIO.input(PHOTO_SENSOR_A_PIN))
print("PHOTO_SENSOR_B_PIN")
print(GPIO.input(PHOTO_SENSOR_B_PIN))
print("__________")
time.sleep(1.0)
finally:
GPIO.cleanup()
if __name__ == "__main__":
main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman