"Start-Befehl" Programmier Probleme

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich hoffe hier kann mir jemand helfen. Ich stehe momentan irgendwie auf dem Schlauch.
    Ich habe einen Code für eine "ZeitschaltUhr" und einen Code für die Ansteuerung eines Schrittmotors und beide funktionieren auch Problemlos. Nun möchte ich die beiden Codes so ändern das bei der ZeitschaltUhr nicht ein GPIO geschaltet wird sondern es soll so eine Art "Start-Befehl" für das Schrittmotor-Programm sein. Gibt es sowas wie "interne Verbindungen" ?

    Kann mir jemand helfen?

    • Offizieller Beitrag

    Und warum läuft die Stepper py in einer endlosschleife? Weil es soll ja nicht endlos laufen sondern nur eine gewisse Zeit. Wenn du es zusammenfässt und threads benutzt kriegst du das NICHT mehr beendet. das läuft dann ewig...Aufrufen über subprocess funktioniert und kann auch von subprocess wieder gekilled werden.

    Ich würde es zusammenfassen und der Stepperfunktion ne feste Laufzeit mitgeben, den gnazen spass dann in nen thread geschmissen und gut. Wenn di Laufzeit rum ist beendet sich das script sauber und der Thread auch.

  • Hallo,

    starte doch das Step-Motor Skript über cron-Jobs. Die sind genau für wiederkehrende, zeitabhängige Aufgaben gemacht. Dann kannst du dir das ganze Zeitschaltuhr-Skript sparen.

    Und noch eine Anmerkgung zum Schrittmotor-Skript: Die Zeile

    Code
    Seq = range(0, StepCount)


    ist überflüssig. Die musst keine Liste mit Zahlen füllen, die du danach direkt überschreibst. Ein

    Code
    Seq = []

    reicht.

    Und die Varibale [font="Courier"]StepCount[/font] kannst du eigentlich auch weglessen. In der [font="Courier"]for[/font]-Schleife

    Code
    for j in range(StepCount)


    kannst du das durch

    Code
    for j in range(len(Seq))


    ersetzen :)

    Gruß, noisefloor


  • Und warum läuft die Stepper py in einer endlosschleife? Weil es soll ja nicht endlos laufen sondern nur eine gewisse Zeit. Wenn du es zusammenfässt und threads benutzt kriegst du das NICHT mehr beendet. das läuft dann ewig...Aufrufen über subprocess funktioniert und kann auch von subprocess wieder gekilled werden.

    Ich würde es zusammenfassen und der Stepperfunktion ne feste Laufzeit mitgeben, den gnazen spass dann in nen thread geschmissen und gut. Wenn di Laufzeit rum ist beendet sich das script sauber und der Thread auch.


    Okay, danke für die schnelle Antwort.

    -> mit fester Laufzeit meinst du time.sleep(60) ?
    -> thread? Ist mir neu. Wie soll sowas aussehen?
    -> das Script soll sich ja nicht beenden, sonst fünktionieren ja die restlichen Tage nicht mehr. Oder verstehe ich da gerade was falsch?

    Einmal editiert, zuletzt von dave1204 (9. Januar 2015 um 09:00)

  • Hallo,


    -> das Script soll sich ja nicht beenden, sonst fünktionieren ja die restlichen Tage nicht mehr. Oder verstehe ich da gerade was falsch?


    Ja, tust du ;) Du kannst das Skript doch beliebig oft neu starten.

    Das ist ja auch genau der Sinn von cron-Jobs. Die rufst ein Programm / Skript auf, dass etwas macht und dann zu Ende ist. Und das machst du dann periodisch, jedesmal wenn's nötig ist.

    Eine Endlosschleife für das Futterskript brauchst du wirklich nicht.

    Gruß, noisefloor

    • Offizieller Beitrag

    Bei Cronjobs kannst du aber nicht unterschiedliche Startzeiten definieren pro Tag. Dafür sind at jobs gedacht

    Code
    while True:
        time.sleep(60)
        delay = 5       # Zeitverzoegerung (ms)
        steps = 102     # Wie viele Schritte vorwaerts
        forward(int(delay) / 1000.0, int(steps))

    Du hast ja hier drin die Abbruchbedingung eigentlich schon definiert. Durch das While True dreht sich das Teil 102 Schritte vorwärts, und das immer und immer wieder.

    Code
    time.sleep(60)
    delay = 5       # Zeitverzoegerung (ms)
    steps = 102     # Wie viele Schritte vorwaerts
    forward(int(delay) / 1000.0, int(steps))

  • Hallo,


    Ja, tust du ;) Du kannst das Skript doch beliebig oft neu starten.

    Das ist ja auch genau der Sinn von cron-Jobs. Die rufst ein Programm / Skript auf, dass etwas macht und dann zu Ende ist. Und das machst du dann periodisch, jedesmal wenn's nötig ist.

    Eine Endlosschleife für das Futterskript brauchst du wirklich nicht.

    Gruß, noisefloor

    Wie fiunktioniet bzw. programmiere ich so einen cron-Job? Wenn ich das richtig verstehe muss das Programm des cron-Job ins Programm ZeitschaltUhr, oder?

    Hat jemand ein Beispiel für mich?

    Du hast ja hier drin die Abbruchbedingung eigentlich schon definiert. Durch das While True dreht sich das Teil 102 Schritte vorwärts, und das immer und immer wieder.

    Code
    time.sleep(60)
    delay = 5       # Zeitverzoegerung (ms)
    steps = 102     # Wie viele Schritte vorwaerts
    forward(int(delay) / 1000.0, int(steps))


    Ja, das ist ja auch richtig. Es soll der "Start-Befehl" von der ZeitschaltUhr kommen, dann soll sich der Motor 102 Schritte vorwärts laufen. Das ganze immer wieder wenn der "Start-Befehl" der ZeitschaltUhr kommt.

    Einmal editiert, zuletzt von dave1204 (9. Januar 2015 um 09:32)

  • Hallo,


    Bei Cronjobs kannst du aber nicht unterschiedliche Startzeiten definieren pro Tag. Dafür sind at jobs gedacht

    ??? - du kannst doch für jeden Tag quasi beliebig viel cron-Jobs für verschiedene Zeiten anlegen...
    Und [font="Courier"]at[/font] benutzt man doch nur, wenn der Job genau 1x laufen soll.

    dave1204: Doku zu cron-Jabs bei Raspbien -> http://www.raspberrypi.org/documentation/linux/usage/cron.md

    cron-Jobs werden vom System ausgeführt - du brauchst dann dein Zeitschaltuhr-Skripte eben _nicht_ mehr.

    Gruß, noisefloor

  • Okay, das sieh ja ganz gut aus. Nun hab ich nur das Problem, das evtl. später noch ein Taster zum aktivieren der ZeitschaltUhr und ein Display der Anzeigt wann sich der Motor das nächstemal dreht und ob die ZeitschaltUhr aktiv oder inaktiv ist.
    Geht das auch mit Cronjobs?


  • Nein das geht nicht. Cronjobs führen regelmäßig eine aufgabe aus. Wenn du das dynamisch aktivieren/deaktiverern willst, sind cronjobs ungünstig. ruf deine Forward funktion einfach innerhalb deiner Zeitschaltuhr auf

    Okay das hab ich gemacht. Das passt auch soweit nur das der Motor nach dem aufrufen nun alle 120 Sekunden läuft. Kann ich das wieder irgendwie beenden? oder hab ich die Funktion falsch aufgerufen? Und wieso wird mein Ausgang nicht mehr angesteuert?

  • Ich habe gedacht es funktioniert. Hab mich da wohl getäuscht.
    Jetzt bekomme ich folgende Fehlermeldung :

    Code
    pi@raspberrypi ~/Desktop/Projekts $ sudo python ZeitschaltUhr.py
    Traceback (most recent call last):
      File "ZeitschaltUhr.py", line 11, in <module>
        import stepper, stepper.forward
    ImportError: No module named forward

    Wenn ich die Fehlermeldung richtig verstehe, hat er ein Problem mit dem Modul forward. Das gibt es ja auch nicht. Sondern ich will einfach nur die forward funktion in einem anderen Skript aufrufen. :-/


  • ``from stepper import forward``

    Natürlich muss auch die stepper.py im gleichen Verzeichnis liegen

    Okay, jetzt bekomme ich keine Fehlermeldung mehr. Aber wieso wird das Programm stepper.py obwohl die ZeitschaltUhr noch garnicht eingeschaltet hat und wieso wird mein GPIO 26 nicht mehr angesteuert?

  • Danke für die schnelle Antwort, werde es mal testen. Die Funktion "forward" ist in diesem Programm enthalten.


  • Ich kenne die Funtkion ``forward()`` nicht, aber du rufst diese auch falsch auf. Anstelle von ``stepper.forward`` einfach mit ``forward(args)`` aufrufen.

    Vielleicht wäre es auch besser, du schlägst dich mal durch ein Tutorial...

    Naja so wirklich hat das nicht funktioniert =(

    Code
    pi@raspberrypi ~/Desktop/Projekts/Futterautomat $ sudo python ZeitschaltUhr.py
    Traceback (most recent call last):
      File "ZeitschaltUhr.py", line 67, in <module>
        forward(args)
    NameError: name 'args' is not defined

    Ich finde ja nicht in irgendwelchen Tutorials mit funktion aufrufen.

Jetzt mitmachen!

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