Posts by DeaD_EyE

    Der Nachteil ist, dass es durch die vielen Iteratoren Exception-Handling unheimlich kompliziert wird.

    Dateien können mal einem anderen Nutzer gehören oder die Encodierung ist falsch.


    kann das auch mal NICHT funktionieren wenn der PI und die Relais zu schwach versorgt werden?

    Die 5V für die Relais und die Versorgung des PI muss ja erst mal gesichert sein.

    Da steht für RPI geeignet. Also 3.3V. Wenn das Relaisboard nur mit 5V arbeitet -> Pech

    Wenn das Relais zu viel Strom zieht -> Pech


    Dann muss man sich nun mal deutsche Hersteller heraussuchen und etwas mehr bezahlen.

    Schalte den GPIO-Pin ohne Relais und miss nach, ob dort 3.3 V anliegen.


    Dann schließ mal vom RPI0 3.3V an DC+ und GND an DC- an. IN1 und IN2 sind die Steuereingänge.

    Über die Jumper stellt man ein, ob mit 3.3V (HIgh) oder 0V (Low) geschaltet wird.


    Wenn er auf High steht, müssten 3.3V das Relais ansteuern.

    Wenn er auf Low steht, muss auf 0V gezogen werden, um das Relais anzusteuern.

    macht er auch CRC?


    Für crc gibt es auch Module, aber wichtig ist ja erstmal die korrekte Umrechnung des Messwerts.


    Siehst du irgendwo im Code was mit CRC?




    Code
    pip3 install crccheck


    Poste mal einfach die komplette Ausgabe, nicht nur die Zeile mit dem t=.


    Falls t durch den Treiber richtig interpretiert wird, so müsste der Wert auch negativ sein, wenn negative Temperaturen (°C) gemessen werden.


    Was ich jetzt an Informationen gesammelt habe:

    • Ausgabe der Rohdaten > 32767, dann ist der Wert negativ
    • In dem Fall Wert - 65536
    • Dann durch 16 teilen
    Code
    def convert(value):
        if value > 2 ** 15 - 1:
            return (value - 2**16) / 16
        else:
            return value / 16

    Das Beispiel habe ich hier her: https://www.raspberrypi.org/fo…topic.php?t=91982#p643987


    Sein Beispiel gibt aber auch die korrekte Temperatur aus.

    Falls die Ausgabe richtig wäre, könnte man einfach mit regex arbeiten:


    Für crc gibt es auch Module, aber wichtig ist ja erstmal die korrekte Umrechnung des Messwerts.

    Und dieser sprachenabhängige Teil müsste dann auch noch entfernt werden. ... Der vor dem Doppelpunkt ... Ähm ... :conf: ... krieg' ich hin ... irgendwie schon ... :denker: ... so:


    Ich nutze lieber iproute2 und Python.



    Mit iproute2 gebe ich dann vor, was ich an Adressen will.


    Code
    ip a s lo


    Um spezifischer zu werden, kann man das weiter eingrenzen z.B. auf ipv4.

    Code
    ip -4 a s lo
    Quote

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    inet 127.0.0.1/8 scope host lo

    valid_lft forever preferred_lft forever


    Um die Ausgabe vernünftig verarbeiten zu können, bietet sich JSON an.


    Code
    ip -4 -j a s lo
    Quote

    [{"ifindex":1,"ifname":"lo","flags":["LOOPBACK","UP","LOWER_UP"],"mtu":65536,"qdisc":"noqueue","operstate":"UNKNOWN","group":"default","txqlen":1000,"addr_info":[{"family":"inet","local":"127.0.0.1","prefixlen":8,"scope":"host","label":"lo","valid_life_time":4294967295,"preferred_life_time":4294967295}]},{},{},{}]


    Um es für Menschen besser lesbar zu machen:

    Code
    ip -4 -j -p a s lo


    Es ist einfacher strukturierte Daten zu parsen, als unstrukturierte Daten, die auch noch Sprachabhängig sein können.


    Die Ausgabe kann man das in das kleine Python-Programm pipe (läuft leider auch mit Python2) um dann ausschließlich die IP-Adressen auszugeben.

    Sieht dann so aus:

    Code
    ip -4 -j a s lo | python get_ip.py
    Quote

    127.0.0.1


    IPv6 gefällig?

    Code
    ip -6 -j a s lo | python3 get_ip.py
    Quote

    ::1


    Gewöhnt euch schonmal an iproute2, denn ifconfig wird es nicht mehr so lange geben.

    Eigentlich sollte das schon lange gestorben sein, aber Debian und Co. sind da sehr traditionell.

    Hohles Blabla!!! Welche Marketingidioten schreiben so eine Scheiße!


    Ja, so ist es.

    Ich denke nicht, dass irgendjemand diese Controller irgendwo sinnvoll einsetzt.


    Ein Kunde von uns setzt den Raspberry Pi 4 für den Lehrbetrieb ein.
    Falls es jemanden interessiert: Smart Factory Model Industrie 4.0 Testbetrieb


    Was ist Kaffee?

    Das einzig Braune in der Firma.



    Wer sich für SPS interessiert, kann eine Runtime auf dem Raspberry PI von Codesys nutzen.

    https://store.codesys.com/soft…-for-raspberry-pi-sl.html


    Wenn man die Runtime nicht lizenziert, läuft sie nur für eine Stunde, wenn ich das noch richtig im Kopf habe.


    aber dass ich einen simplen zustand eines buttons nicht abfragen kann, geht mir nicht in den kopf


    Doch kannst du. Steht in dem Beispiel was meigrafd gepostet hat: https://github.com/meigrafd/Sa…/master/_Tkinter/after.py die Methode startstop_func erledigt die Aufgabe.
    Du hast den callback und der callback setzt dann eine Variable auf True, wenn sie False war und umgekehrt. Der Text des Buttons wird durch startstop_button["text"] = 'Foo' zugewiesen.

    Was möchtest du wie starten?


    Man muss erstmal das Konzept einer GUI verstanden haben. Die GUI muss sich selbst darum kümmern alles im Fenster zu aktualisieren. Dies geschieht in einer Schleife. Wird nun eine Funktion aufgerufen, die das Programm blockiert, lässt sich die GUI solange nicht bedienen. Deswegen arbeitet man mit Threads um solche Funktionen auszulagern.


    Ich hab dein Code mal ein bisschen abgeändert, um zu demonstrieren was passieren kann und wie man das Problem umgeht.
    Getestet mit Python 3.6.



    Was du auf jeden Fall unbedingt nachlesen musst:



    Du wirst merken, dass es ab einem gewissen Punkt völlig Wahnsinnig ist alles in Funktionen auszulagern und die Referenz zum Objekt root mitzuschleppen. Dann hat man irgendwann Ravioli-Code.
    Es ist sinnvoll OOP für eine GUI zu nutzen. Dafür muss man aber erstmal das Konzept verstanden haben. Für so einfache Aufgaben, reicht aber auch Spagetti-Code. Man
    muss es sich selbst nicht komplizierter machen, als es schon ist.


    Noch ein Hinweis: Die Klassen von TKinter liefern alle eine Referenz zum erstellten Objekt zurück. D.h. der Aufruf tkinter.Button(root, text='foo') liefert ein Objekt zurück. Wenn du genau weißt, dass du diese Referenz später nicht benötigst, kannst du anstatt die Referenz einer Variable zuzuweisen, direkt die Methode pack() oder grid() verwenden. Das sähe dann so aus:


    Code
    Button(root, text="Einrichten", bg="#FFFF00", width=20, command=partial(handle_man, root)).grid(row=0, column=0, padx=10, pady=3)


    Sieht aber ziemlich hässlich aus und hat mit dem eigentlichen Problem nichts zu tun.


    Hat eigentlich schonmal jemand ein Dict genutzt, um die Eigenschaften an Button usw. zu übergeben? Fällt mir gerade so auf.

    Code
    btn_man_prop = dict(bg='#FFFF00', width=20, command=partial(handle_man, root))
    grid_man = dict(row=0, column=0, padx=10, pady=3)
    Button(**btn_man_prop).grid(**grid_man)


    Was mir noch aufgefallen ist:



    • Einrückung immer mit 4 Leerzeichen, keine Tabulatoren und auch nicht nur 2 Leerzeichen
    • Code auf Modulebene in Funktionen und Klassen auslagern.
    • Code in logische verständliche Funktionen aufteilen
    • Objekte nutzen, wenn man einen Status benötigt. (z.B. die Referenz zum root Objekt)
    • Aussagekräftige Variablen nutzen: Adjektive/Nomen für Variablen, Verben für Funktionen und Nomen für Klassen.
    • Plural für Sequenzen (list, tuple, set, ...), Singular für atomare Objekte (float, int, str, bool)

      Code
      a = ['Zucker', 'Milch', 'Eier', 'Mehl', 'Backpulver']
      for x in a:
          print(x)
      
      
      zutaten = ['Zucker', 'Milch', 'Eier', 'Mehl', 'Backpulver']
      for zutat in zutaten:
          print(zutat)



    Du kannst übrigens auch UTF8 für Variablen, Funktionen und Klassen verwenden:

    Da wir aber International arbeiten, sollte jedes Programm in englisch gehalten sein.