Wie sage ich es in Python ? (Einsteigerfragen)

  • hyle Wenn Du unbedingt die Crontab benutzen willst, dann erstelle einen Cronjob der das Script startet...


    Vielen Dank für deine Mühe! Aber das finde ich wirklich unschön. Dann lasse ich das Skript einfach durchlaufen :)

  • Das Problem ist, dass die LED zwar eingeschaltet wird, am Ende des Scripts aber wieder erlischt, da das Script die Ausgänge wieder reseted.

    Das ist mit GPIO.cleanup() aus RPi.GPIO vergleichbar. Wird das Script beendet/verlassen (terminiert) werden alle GPIO's wieder in den Werkszustand zurück gesetzt - so macht es gpiozero, was eigentlich besser und auch Anfängerfreundlicher ist.


    Mir ist leider keine Möglichkeit bekannt das abzustellen. Dir bleibt dann nur übrig dein Anliegen mit einem anderen Module zu realisieren (pigpio gäbs noch), oder das Script permanent laufen zu lassen.

  • meigrafd ...oder das Script permanent laufen zu lassen.


    Ich denke, genau das werde ich nun tun. Irgendwo habe ich mal gesehen, dass eine (so kurze) while True: Schleife mit nur einem if(): am Ende noch ein time.sleep(0.2) enthält, damit der Rechner "Zeit für andere Sachen hat". Meine Anwendung mit der Zeitschaltuhr ist ja absolut nicht zeitkritisch. Macht es daher Sinn, so eine Pause mit einzubauen? Es könnten für diesen Fall ja auch 1 Sekunde oder auch 30 Sekunden sein.

  • Wenn du keine Pause, bzw eigentlich ist das eine Blockade, einbaust verursacht das Script eine sehr hohe CPU Auslastung, da die while dann extrem schnell rotiert.


    Schlecht:

    Python
    import time
    
    while True:
        print(time.time())

    Besser:

    Python
    import time
    
    while True:
        print(time.time())
        time.sleep(0.01)

    Oder:

    Python
    import time
    
    def do_something(text):
        print(text)
        time.sleep(0.01)
    
    while True:
        do_something(time.time())

    do_something blockiert die Schleife derweil es beschäftigt ist - das ist mit jedem "Befehl" so, nur eben unterschiedlich. Hierbei bedarf es keines zusätzlichen Blockierens (sleep).

    Ein "print" alleine benötigt zwar auch einige Microsekunden, reicht aber nicht aus um eine 100% CPU Auslastung zu verhindern.

  • Hallo ich habe ein Problem mit meinem Raspi 2 mit aktuellem System.

    ich wollte eine simple LED ansteuern und hab dazu das folgende Script benutzt .

    LED Steckt an Pin 11 also GPIO 17 und 6 über Widerstand aber es tut sich außer Fehlermeldung

    (

    Warning (from warnings module):

    File "/home/pi/blink1.py", line 5

    IO.setup(11, IO.OUT)

    RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.


    gar nichts.

    der Code den ich in python 2 programm eingab und mit F5 starten wollte ist.


    #! / Usr / bin/ python

    import RPi.GPIO as IO

    import time

    IO.setmode(IO.BOARD)

    IO.setup(11, IO.OUT)

    state = True

    while True:

    IO.output(11, state)

    state = not state

    time.sleep(1)



    Ziel war eigentlich ein wechselblinken von 2 LED ( Weiß; Blau)

    könnt ihr mir helfen ich bin nunmal Neuling und Ratlos

    Danke

  • Hallo,


    du musst die `cleanup()` von RPi.GPIO aufrufen - wenn dein Programm crasht oder zurückgesetzt wird bleibt der Zustand der GPIOs sonst erhalten.


    Des Weiteren ist RPI.GPIO veraltet. Nutz' besser das gpiozero Modul, dass ist neuer, besser, einfacher.


    Gruß, noisefloor

  • Für mich ist Python neu und ich tue mich gerade ein bisschen schwer damit. Im Prinzip habe ich vier Variablen, die ich gerne sequentiell in eine Datei schreiben möchte, so dass ich sie mit einem anderen Programm zur weiteren Verarbeitung übernehmen kann. Die einzige Bedingung ist, dass die Daten problemlos und möglichst einfach von einem C-Programm übernommen werden können. Wenn es nicht anders geht, wäre auch eine Ausgabe in Form von JSON ok.


    Leider habe ich keine Ahnung, wie ich meine Daten in die Datei schreiben kann (siehe auskommentierte f.write() Operationen unten im Code).

    Es geht um folgende Variablen:


    file_mark: 1 Byte Code (z.B. ASCII "c" zur Markierung der Datei. Sollte in der Datei im ersten Byte liegen.

    base: Float mit einem Wert, der vom Anwender mitgeliefert werden muss (wird später über UI abgefragt).

    factor: Integer der anhand der Daten errechnet wird und vom Benutzer im UI angepasst werden kann.

    m: zweidimensionale Liste mit 256 x 256 Messwerten die zwischen 0.0 und 256.0 liegen.

    Irgendwie scheinen alle Tutorials und Beispiele dort aufzuhören, wo ich anfange ;)

    LG

    Peter

    Edited once, last by pgloor: Chaos im Code wegen Zeilenumbruch und abgeschnittenem Text. ().

  • Hallo,


    du kannst in eine Datei nur Strings schreiben. Mini-Beispiel für Python 3 basierend auf deinem:


    Python
    with open('demo.ter', 'w') as f:
        f.write('c\n')
        f.write('base=64\n')
        m = [['0.0' for _ in range(10)] for _ in range(10)]
        for row in m:
            f.write('|'.join(row))
            f.write('\n')

    Wenn du dazu noch Fragen hast startest du am bestehen einen eigenen Thread, das wird sonst unübersichtlich hier im Sammelthread. In deinem Code sind auch Anti-Pattern, was Iteration in Python angeht.


    Gruß, noisefloor

  • Erstmal ein Hallo an die RaspberryPi Community!


    Ich bin neu hier, genauso wenig Erfahrung habe ich mit dem Raspberry, als auch mit Python.

    Nach ersten Gehversuchen mit Beidem, wie sie in den ersten Tagen wohl jeder macht, habe ich auch schon die erste für mich unüberwindbare Hürde:


    Aus einer Tabelle, (zb. *.csv oder *.xlsx) mit den 3 Spalten "Schritt / GPIO-HIGHorLOW / Zeitdauer" will ich auslesen, dass ich einen Pin auf 1 oder 0 (Spalte 2) setze, und zwar für die Dauer aus Spalte 3. Soweit habe ich das auch ohne Probleme mit csv_read hinbekommen. Das Hauptproblem liegt aber darin, dass ich nach der abgelaufenen Zeit (ich habe time.sleep() verwendet), in die nächste Zeile springe, um dort wieder den Pin auf 0 oder 1 zu stellen, und zwar für die nächste Zeitdauer etc..


    Ich habe mich die letzten Stunden etwas in Numpay (arrays) eingelesen, weil ich mir dachte, dass das eventuell nützlich sein könnte, kann das aber auch schlecht verbinden.


    Auf welche Art und Weise würden das die Profis hier realisieren?

    Danke im Voraus!

  • Hallo und Willkommen im Forum,

    Das Hauptproblem liegt aber darin, dass ich nach der abgelaufenen Zeit (ich habe time.sleep() verwendet), in die nächste Zeile springe, um dort wieder den Pin auf 0 oder 1 zu stellen, und zwar für die nächste Zeitdauer etc..

    und wo liegt genau das Problem? so wie du es beschreibst funktioniert es ja oder etwa nicht?!


    Bei Programmierfragen bitte auch immer den kompletten Code (für den Fall das es mal Fehler gibt auch immer den kompletten Traceback) posten.

  • Hallo zusammen,


    ich habe eine weitere Einsteigerfrage für mein Projekt. Und zwar habe ich eine INI-Datei mit Einstellungen für meine Ventile. Pro Ventil gibt es einen Abschnitt mit den jeweiligen Einstellungen:


    Code
    settings.ini
    [Valve]
    name = Ventil 1
    [Valve]
    name = Ventil 2
    ...


    Ich habe mit einer Klasse valve() begonnen, und ich habe meine 6 Ventile zur Zeit fest eincodiert:

    v1 = valve()

    v2 = valve()

    ...


    Aber es wäre ja wesentlich schöner, wenn ich dassdessen über die INI-Datei iterieren könnte und bei jedem Abschnitt "Valve" dann eine neue Instanz von meiner Klasse ableite. Wie könnte ich das denn besser dynamisch machen?


    Ich bin auch später nicht mehr drauf angewiesen auf die Variablennamen der einzelnen Ventile in der Programmierung.

    Jede Instanz der Klasse valve() registiert sich in einer Liste listofallvalves[]. So kann ich später einen Wasserkreislauf nach dem anderen Abklappern wenn die Bewässerung läuft:

    Code
    for v in valve.listofallvalves:
        v.openvalve()
        sleep(v.duration)
        v.closevalve()

    (das letztere ist nur ein Platzhalter zum Verdeutlichen meines Plans)


    Vorschläge willkommen. Vielen Dank.

  • Haha, jetzt habe ich mich selbst reingelegt. Zur Zeit habe ich noch Abschnitte "Valve1", "Valve2" etc, in der INI-Datei drin, und es funktioniert. Dachte mir aber gerade, dass ich immer den gleichen Bezeichner brauche, um die zu finden.


    Anyways, wie kriege ich denn dynamisch eine Instanz abelegt wenn er ein "Valve*" findet?

  • Code
    [Test1]
    name = Test Nr. 1
    [Test2]
    name = Test Nr. 2
    Code
    $ python test_config.py
    Created 2 'Test' instances
    Test Nr. 1
    Test Nr. 2
    $

    Klassen bitte so schreiben: MyClassName! (zur besseren Unterscheidung von Funktionen (my_function_name).

  • Die Klasse ist sinnfrei und ein Exemplar der Klasse wird nicht wirklich benutzt.

    Guess what, es geht um was anderes :-/

    Zeile 11-17 sind die Antwort auf sie Frage von marcuszurhorst, aber du kannst es ja mal wieder besser :baeh2:

    Anyways, wie kriege ich denn dynamisch eine Instanz abelegt wenn er ein "Valve*" findet?



    Und tschüss.