Raspberry GPIO if Funktion

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
turbo_forever
User
Beiträge: 4
Registriert: Sonntag 20. März 2016, 09:52

Hallo,

ich habe ein kleines Script mit dem man 3 GPIO`s ein und aus schalten kann.

Nun hätte ich gerne eine if Funktion mit an Bord:

wenn GPIO 15 an dann 19 auch einschalten
sonst ausgeschaltet lassen

Wie macht man das?

Oder kann man das gleich mit in den raw_input mit einbinden?

Würde mich über Hilfe freuen :)

Vielen Dank :)
turbo_forever
User
Beiträge: 4
Registriert: Sonntag 20. März 2016, 09:52

Code wäre vielleicht hilfreich :D

Code: Alles auswählen

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

GPIO.setup(11,GPIO.OUT)
GPIO.output(11,1)
GPIO.setup(13,GPIO.OUT)
GPIO.output(13,1)
GPIO.setup(15,GPIO.OUT)
GPIO.output(15,1)

try:
        while(True):
                request = raw_input("RGB-->")
                if (len(request) == 3):
                        GPIO.output(11,int(request[0]))
                        GPIO.output(13,int(request[1]))
                        GPIO.output(15,int(request[2]))
                        
except KeyboardInterrupt:
    GPIO.cleanup()
Zuletzt geändert von Anonymous am Sonntag 20. März 2016, 13:40, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
turbo_forever
User
Beiträge: 4
Registriert: Sonntag 20. März 2016, 09:52

Danke, aber das schaltet mir GPIO 19 immer an :K
BlackJack

@turbo_forever: Das sollte den Pin 19 nur anschalten wenn auch Pin 15 an ist. Allerdings schaltet dieser Code Pin 19 nie aus, wenn der also einmal angeschaltet ist, bleibt er an. Wenn Pin 19 immer den gleichen Wert wie Pin 15 haben soll, dann schalte den halt genau so wie Pin 15.

Anmerkungen zum Quelltext: Einrückung ist per Konvention vier Leerzeichen pro Ebene und nach Kommas ebenfalls ein Leerzeichen, damit das nicht alles so schwer lesbar zusammengequetscht steht. Wirf mal einen Blick in den Style Guide for Python Code.

Die überflüssigen Klammern um die Bedingungen sollte man weglassen, und insbesondere sollte man Schlüsselworte wie ``while`` plus Bedingung nicht so schreiben das es wie ein Funktionsaufruf aussieht. Das ist keine Funktion, genau wie ``if`` auch keine Funktion ist.

Magische Zahlen sollte man als Konstanten definieren, damit der Leser weiss was die bedeuten. Also letztendlich auch der Autor des Quelltextes selber, denn irgendwann wird der auch fast zu einem normalen Leser des eigenen Quelltextes wenn er da nach einem Monat oder so mal wieder rein schaut. Wofür die Pins stehen kann man hier nur an dem Prompt vom `raw_input()` erraten, wofür Pin 19 steht gar nicht.

Wenn man die Pin-Nummmern für die Farben in eine Liste steckt, braucht man nicht so viel Code wiederholen sondern kann das in einer Schleife abhandeln.

Den `cleanup()`-Aufruf will man eigentlich *immer* am Ende machen, nicht nur wenn der Benutzer die Tastenkombination für einen Abbruch gedrückt hat. Zum Beispiel auch dann wenn der Benutzer etwas eingegeben hat was `int()` nicht in eine ganze Zahl umwandeln kann und deshalb eine Ausnahme auslöst, oder wegen irgendwelcher anderer Ausnahmen die folge von Programmier- oder Benutzerfehlern sein können.

Davon abgesehen das man das Hauptprogramm üblicherweise schon in eine Funktion schreibt, ist das schon komplex genug um es sinnvoll auf mehrere Funktionen aufzuteilen, damit es nicht noch komplexer wird wenn man beispielsweise eine Eingabeprüfung macht, damit der Benutzer das Programm mit Fehleingaben nicht mehr zum beenden zwingen kann.

Bisher könnte das dann ungefähr so aussehen (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from RPi import GPIO

RGB_PINS = RED_PIN, GREEN_PIN, BLUE_PIN = [11, 13, 15]
SOME_OTHER_PIN = 19


def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(RGB_PINS, GPIO.OUT, initial=GPIO.HIGH)
    try:
        while True:
            request = raw_input('RGB-->')
            if len(request) == 3:
                for pin, value in zip(RGB_PINS, map(int, request)):
                    GPIO.output(pin, value)
                GPIO.output(SOME_OTHER_PIN, GPIO.input(BLUE_PIN))
    except KeyboardInterrupt:
        pass  # Intentionally ignored so the user can stop with CTRL+C.
    finally:
        GPIO.cleanup()


if __name__ == '__main__':
    main()
turbo_forever
User
Beiträge: 4
Registriert: Sonntag 20. März 2016, 09:52

Hey, cool, danke :) muß mich echt mal bissl mehr mit der kleinen Himbeere befassen.

Gerade probiert, funktioniert nicht :(

Traceback (most recent call ast)
Fehler in Zeile 27 <module> main()

Fehler in Zeile 19
GPIO.output(SOME_OTHER_PIN, GPIO.input(BLUE_PIN))
RuntimeError: The GPIO channel has not been set up as an OUTPUT

Sinn der Sache soll sein nur RGB einzugeben, nicht RGBB ... wollte ja eigentlich eine andere LED, ist aber leider erst Montag verfügbar :(
Wenn ich einfach nur ein + Kabel von B zu B auf dem breadbord stecke reicht die Spannung nicht.
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal versucht die Fehlermeldung zu verstehen? Die ist ja recht eindeutig, und sollte sich auch von einem Anfaenger beheben lassen.
Antworten