GPIOs mit DEF funktion aufrufen

  • Hey Leutz,
    ich arbeite an einem Projekt im Betrieb für eine Ansteuerung einer LED Matrix mit Schieberegistern. Ich habe es schon testweise hin bekommen etwas auf der LED-Matrix anzeigen zu laseen.
    Jetzt möchte ich aber um es mir für später zu erleichtern mit "def" arbeiten.
    Leider habe ich noch keine große bzw. 0 Erfahrung mit Python.
    So sieht es aktuell aus:

    Z.Z. bekomme ich gleich die Fehlermeldung des Skripts:

    Code
    File "ledblinken.py", line 45
        def Save for i in range(0,1):
                   ^
    SyntaxError: invalid syntax

    Danke im Voraus

  • arteck: Auch das ist noch fasch. Nach der def muss ein doppelpunkt stehen, bzw kann man sich generell merken das nach einem doppelpunkt eine Einrückung erfolgen muss.

    Er hat also gleich mehrere Fehler in dem Script. Ein weiterer Fehler können aber auch die teilweise unterschiedlichen Einrückungen sein, also der Abstand von Links nach Rechts. Auf sowas reagiert Python ziemlich empfindlich.

    Fehlerhaft:

    Spoiler anzeigen

    Etwas besser:

    Spoiler anzeigen

    Allerdings stören mich generell die übertriebene Nutzung von return. Hab die jetzt aber mal drin gelassen um es nicht zu kompliziert zu machen.. Da scheint er auch noch etwas nicht verstanden zu haben und sollte mal nachlesen wann man return braucht und wofür das genutzt wird
    Die ganzen for i in range(0,1) Zeilen sind ebenfalls überflüssig... Auch hier wurde anscheint der Sinn nicht wirklich verstanden

    Das sieht mir stark nach blindem copy&past Code aus. Vielleicht wärs besser seinen Code von Anfang an selber zu schreiben, dann lernt man dabei auch was ;)

    Richtiger:

    Spoiler anzeigen


    Wobei auch hier unter Vorbehalt weil ich nicht weiß was das gesamte Konstrukt überhaupt soll :D Das macht so auch eher wenig Sinn für nur einen Aufruf in der Anweisung (def) diese überhaupt extra festzulegen.


  • Wobei auch hier unter Vorbehalt weil ich nicht weiß was das gesamte Konstrukt überhaupt soll :D Das macht so auch eher wenig Sinn für nur einen Aufruf in der Anweisung (def) diese überhaupt extra festzulegen.

    Das macht schon in sofern Sinn, als dass man diese Funktion (oder Definition) im Verlauf des Codes mehrfach an den verschiedensten Stellen verwenden. Sollten sich während der Entwicklung oder auch im Betrieb die Notwendigkeit ergeben, dass der in der Funktion verwendete Befehl in den Parametern geändert werden muss, so muss man dies dann nur in der Funktion (oder Definition) tun, und nicht an jeder Stell im Code, wo dieser Befehl verwendet wird.

    Allerdings muss man so was schon sinnvoll einsetzen, sonst wird's statt übersichtlicher nur unübersichtlicher.

  • DieterWo: Das war mir schon klar, ich bin auch ein starker Verfechter von "so wenig wie möglich Code Wiederholen" - allerdings glaub ich nicht das der TE sich dessen ansatzweise bewusst war als ich das oben kommentierte.

  • Ja Hallo zurück,
    danke schon mal für die Zahlreichen Antworten von euch allen übers WE.

    meigrafd
    Ich werde deine Tipps mal befolgen und was die Fehler an geht bzw das nicht Verstehen.
    Ich bin absolut neu in Python und hab nur zwei Bücher von meinem Ausbilder zur Verfügung an denen ich mich Orientiert habe.
    1x Sensoren am Raspberry Pi (Franzis Verlag)
    1x Raspberry Pi, programmieren mit Python (mitp Verlag)
    So ganz genau verstehe ich nicht was ich da programmiere und wozu "return" dient.

    "ich vermute um nach dem Ausführen des Def Befehls bzw. eine Programm Verzweigung wieder zurück zum Abzweigpunkt zu kommen"

    aber ich bin dankbar für jeden Tipp.

    Damit ihr wisst was das Teil genau machen soll am Schluss hier ein Bild.

    Z. Z. übernimmt die Steuerung der Anzeige ein PIC der ziemlich am Limit ist und man muss jedes mal runter mim Notebook dran wenn man die Anzeige ändern will.
    Mit dem Pi soll das dann iwann mal übers Netzwerk möglich sein.

  • Ich habe das jetzt mal so versucht wie du das beschriebe hast meigrafd.
    leider bekomme ich dann beim ausführen des Scripts

    Code
    pi@raspberrypi ~ $ sudo python ledblinken.py
      File "ledblinken.py", line 60
        def 1():
            ^
    SyntaxError: invalid syntax

    Der Aktuelle Code sieht so aus:


  • Zur Einrückungstiefe, ich drücke da immer TAB im Nano Editor zum einrücken.
    Ist das falsch?

    Nein, nur Mischen darfst du das nicht. Also ENTWEDER tab ODER leerzeichen, nicht beides. Es spielt aber keine Rolle ob man einheitlich 2 Leerzeichen, 4 oder 6 oder 8 oder 10 verwendet. - Hauptsache überall die gleiche Anzahl als Einrückung.
    (für Kommentare ist es aber auch egal und muss nicht beachtet werden)

    Man sieht in deinem Code aber Abweichungen von den Einrückungen.

    Siehe hier: http://codepad.org/3QqUwLJi

    Zeile 40 hat eine andere Einrückung als die nachfolgenden. Ebenso Zeile 69 unterscheidet sich zu den anderen Einrückungen.


    Und wie gesagt ergeben die ganzen "return" in den Zeilen 30, 34, 38 und 44 eigentlich auch kein Sinn, es wird ja bei dir nichts "returned" also zurückgegeben.

    Anstatt 1() usw aufzurufen könntest du auch direkt den Befehl aufrufen. Wenn du den Code später dann noch weiter ausbauen willst kannst du die Befehle dann ja auch wieder in eine vernünftig benannte Anweisung setzen, eben ein vernünftiger Definitions-Name passend zu dem was darüber gemacht wird

    Spoiler anzeigen

    Oder eben einigermaßen vernünftige Definitions-Namen:

    Du könntest aber auch nur eine Definition verwenden an die du den jeweiligen "Wert" übergibst:

  • meigrafd

    1.
    Bitte keine Halbwahrheiten verzapfen. Es spielt sehr wohl eine Rolle wegen der Einrückung und zwar genau so wie ich im Deutschen Substantive groß schreib und Verben klein. Ich kann ''kan, haus, Flus, Modorbod" schreiben und ggf. ist Grammatiksyntax richtig, jedoch ist und bleibt es ein Rechtschreibfehler genau wie deine Funktionsnamen.

    Gerade bei Anfänger halte ich es für fahrlässig, ihnen falsche "Rechtschreibung" zu übermitteln genau so, wie in jedem zweiten Codeschnipsel globale Variablen als Rundumlösung zu präsentieren.

    2.
    Es wird sehr wohl ein Wert mit ''return'' zurückgegeben.


  • 1.
    Bitte keine Halbwahrheiten verzapfen. Es spielt sehr wohl eine Rolle wegen der Einrückung [...] genau wie deine Funktionsnamen.

    Im Gegensatz zu den meisten hier teste ich nahezu alles was ich hier an Scripts poste oder dazu Tips gebe. Es funktioniert so wie ich es zuletzt geschrieben habe

    Guckst du:

    Spoiler anzeigen


    Ausgabe:

    Code
    root@RoPi:/tmp# python /tmp/test.py 
    set Zeile 1
    set Zeile 2
    None


    Ausgabe:

    Code
    root@RoPi:/tmp# python /tmp/test.py 
    set Zeile 1
    set Zeile 3
    set Zeile 2
    None

    Nu verrate mir mal bitte was daran "Halbwahrheiten verzapfen" sein soll :huh:

    Und wenn du mein Beitrag mal vernünftig lesen würdest ist das bezüglich Einrückungen imho ebenfalls korrekt.

    2.
    Es wird sehr wohl ein Wert mit ''return'' zurückgegeben.

    Ich habe nirgends gesagt das allgemein mit return kein Wert zurück gegeben werden würde.

  • Moin Leutz,
    so danke für die weiteren Antworten das bingt mich z. Z. gut weiter.

    Jetzt klappt das Ansteuern auch schon besser ich habe jetzt nur zwei Probleme.

    1. Das auf der Anzeige noch net ganz das angezeigt wird was soll die ersten zwei Spalten klappen dann nur noch mist.

    2. Ich bekomme jetzt jedesmal beim ausführen folgendes angezeigt:


    Hab ich da iwo einen Fehler drin oder is das nur ne art Warnmeldung?
    Danke


    So jetzt hätte ich noch eine frage wie ich einfach den Reset ablauf 8x durchlaufen lassen kann ohne jetzt 8x den reset in das programm schreiben zu müssen,
    was für Methoden gibt es (einfach)?

    Dazu kommt noch folgendes.
    Ich habe jetzt alles hinbekommen alles funktioniert aktuell so wie gedacht (auser die oben genannten Probleme).
    ich habe jetzt für jeden Buchstaben eine A.py - z.py Datei / Skript erstellt.
    Jetzt würde ich gerne hingehen und einfach nur im Hauptskript einzeln die Dateien aufrufen um nicht einen ewig langen Spaghetti Code zu erhalten.
    Wie mach ich das am einfachsten.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!