Hardwareaufbau

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • warum so kompliziert, habe es einfach gelöst:

    weil das von dir keine saubere Programmierung ist.

    Und Python2 ist seit 1.1.2020 EOL (End of Life) verschoben um über fünf Jahre in 2014. Warum verwendest du es immer noch?

    Aber jeder wie er will, viel Erfolg :thumbup:

  • Beitrag von SmallSunset65327 (10. November 2021 um 15:43)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Beitrag von SmallSunset65327 (10. November 2021 um 15:47)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Hallo,

    Ich starte es mit python3, sollte amprint erkennbar sein ...

    Nee, `print` mit Klammer funktioniert auch unter Pyhton 2.7 - auch wenn `print` unter Python 2.7 keine Funktion ist. Und die Shebang ist trotzdem falsch bzw. referenziert explizit Python 2. Es funktioniert natürlich, wennn du `python3 mein_skript.py` aufrufst, weil die Shebang dann irrevlevant ist - aber das weiß hier niemand, wie du das Skript letztendlich aufrufst.

    Die Klammern hinter dem `not` sind übrings in deinem Code überflüssig.

    Gruß, noisefloor

  • Beitrag von SmallSunset65327 (10. November 2021 um 19:02)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Laut shebang wird Python 2.7 gestartet.

    Code
    #!/usr/bin/env python

    Python ist bei den meisten Distributionen noch ein Symlink zu Python 2.7.

    Wenn du die Datei ausführbar machst und direkt startest, wird Python 2.7 verwendet.

    Der Shebang wird ignoriert, wenn du den Interpreter mit angibst.

    Code
    ./dein_programm.py
    # Python 2.7
    
    python3 dein_programm.py
    # Python 3.x

    Eingänge in einer while Schleife auf True abzufragen kann zu Problemen mit dem Timing führen.

    Was ist, wenn sich der Eingang ändert und kurz vorher die Abfrage kam?

    Da ist die Verwendung von gpiozero (was nur ein Wrapper ist) etwas einfacher, da man Callbacks einfacher hinzufügen kann.

    Callback == Funktion, die aufgerufen wird, wenn eine steigende oder fallende Flanke vorkommt. Wenn nichts passiert, wird auch der Callback nicht aufgerufen. So gehen einem weniger Impulse verloren.

  • @hwpi Sauber wäre es als erstes mal das nicht alles auf Modulebene stehen zu haben. Auch wenn es nur eine Funktion ist, sollte man sich das gleich angewöhnen keine Variablen dort zu definieren.

    ``as`` beim Importieren ist zum umbennenen. `GPIO` wird aber gar nicht umbenannt.

    Man sollte auf jeden Fall den Aufruf von `GPIO.cleanup()` am Programmende sicherstellen. Also auch wenn das durch einen Fehler abgebrochen wird, oder der Benutzer es mit Strg+C beendet.

    Die Pinnummer sollte man als Konstante definieren, statt sie mehrfach im Code zu wiederholen. Dann kann man einen sprechenden Bezeichner vergeben und man kann die Pinnummer einfacher und weniger fehleranfällig an einer Stelle im Quelltext verändern.

    Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

    Der Kommentar zu `i` stimmt auch nicht ganz, das ist der Flankenzähler, nicht allgemein ein Schleifenzähler. Dafür hätte man auch ``for`` genommen und nicht ``while``. Und `i` ist auch ein schlechter Name in diesem Fall, weil man den ja kommentieren *muss*, damit der Leser nicht den gesamten Code verstehen muss. Kommentare die schlechte Namen erklären sollte man aber besser durch einen selbsterklärenden Namen ersetzen.

    Python hat einen eigenen Datentyp für Wahrheitswerte, da sollte man nicht 0 und 1 für missbrauchen.

    Statt in einer Schleife zwei verschiedene Sachen zu machen und letztlich mit dem `impuls`-Flag zu entscheiden was das genau ist, und diese Entscheidung dann auch noch als *zweiten* Teilausdruck in zwei ``if``\s zu ”verstecken” finde ich ziemlich unübersichtlich. Verständlicher wäre erst auf die steigende Flanke zu warten, und dann auf die fallende. Dann fällt `impuls` weg. Und man muss da noch nicht einmal selber Code für schreiben, `GPIO` hat bereits eine Funktion um auf eine Flanke zu warten. Und dann kann man aus der ``while``- auch eine ``for``-Schleife machen, denn warten bedeutet ja blockieren, so dass jeder Durchlauf der äusseren Schleife auch tatsächlich eine neue steigende Flanke bedeutet.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Einen Digitaleingang kann man wie folgt abfragen:

    Man definiert eine Integer-Varibale (zähler) und einen Merker (Flag);

    In einem Umlaufprogramm (z.B. main) fragt man den Zustand des GPOIs ab.

    Ist der Zustand 1 zählt man die Variable um 1 hoch;

    Ist der Zustand 0 zählt man die Variable um 1 runter;

    Wird der Zählerstand beim hochzählen 10 setzt man den Merker auf 1 und begrenzt den Zähler auf 10;

    Wird der Zählerstand beim herunterzählen 0, setzt man den Merker auf 0 und begrenzt den Zähler auf 0;

    Nachfolgende Programme, welche den GPIO auswerten sollen, fragen dann den Merker ab anstatt des GPIOs direkt.

    Setzen des Merkers ist eine Flanke. Löschen des Merker ist eine Flanke.

    Ob man bis 10 oder 100 zählt, hängt vom Abfragezyklus und dem Prellverhalten des Schalters ab.

    Mach ich seit über 30 Jahren so. Hat mich noch nie enttäuscht.

  • Beitrag von SmallSunset65327 (13. November 2021 um 16:16)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Konventionen sind m.M.n. nicht mal unbedingt nur ein Qualitätsanspruch, sondern auch eine wichtige Sache zur Lesbar- und Verständlichkeit von fremdem Code. Wenn man will, dass andere Leute verstehen was der ihnen vorgelegte Code machen soll, dann gibt man sich mühe es ihnen so leicht wie möglich zu gestalten.

    Um es mal bildlich auszudrücken: Wenn ich ungewaschen zum Arzt gehe muss ich mich nicht wundern, wenn dieser die Nase rümpft.

    Style Guide for Python Code: https://www.python.org/dev/peps/pep-0008/

Jetzt mitmachen!

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