Hardwareaufbau

  • Post by SmallSunset65327 ().

    This post was deleted by the author themselves ().
  • Post by SmallSunset65327 ().

    This post was deleted by the author themselves ().
  • 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

  • Post by SmallSunset65327 ().

    This post was deleted by the author themselves ().
  • 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.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • 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.

  • Post by SmallSunset65327 ().

    This post was deleted by the author themselves ().
  • Hallo,


    Quote

    ich bin kein Programmierer, sondern Bastler, das wird hier oft missverstanden

    Das hat damit nichts zu tun, dass ist bestenfalls eine Ausrede gegenüber dir selber. Auch als Hobbyprogrammierer egal auf welchem Level kann man einen Qualitätsanspruch an seinen eigenen Code haben.


    Gruß, noisefloor

  • 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/

    • Best Answer

    hyle Oder einen gar nicht erst behandelt. Wenn keine unmittelbare Lebensgefahr besteht, muss er das nämlich nicht.

    “If debugging is the process of removing software bugs, then programming must be the process of putting them in.” — Edsger Dijkstra

  • SmallSunset65327

    Selected a post as the best answer.
  • SmallSunset65327

    Selected a post as the best answer.
  • SmallSunset65327

    Selected a post as the best answer.
  • SmallSunset65327

    Changed the title of the thread from “GPIO - Flankenerkennung” to “Hardwareaufbau”.