While-Schleife nur 5 mal ausführen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

Hallo, ich bitte um Entschuldigung, bin aber fast völliger Neuling in Python.

Ich wollte ein Relais über den Raspberry 5 mal im 0,7 Sekunden-Takt schalten (akustische und über den Schaltkontakt auch optische Signalisierung).

Habe die while-Schleife auch soweit fertig, aber weiß nicht, wie ich diese jetzt automatisch ohne Tastendruck auch wieder beende.

Code: Alles auswählen

# Programm zum takten des Display-Relais

import time
import RPi.GPIO as GPIO

# RPi.GPIO Layout verwenden (wie Pin-Nummern)
GPIO.setmode(GPIO.BOARD)


# Pin 3 (GPIO 2) auf Output setzen
GPIO.setup(3, GPIO.OUT)

# Dauersschleife
while 1:

    # Relais aus
    GPIO.output(3, GPIO.HIGH)

    # Warte 700 ms
    time.sleep(0.7)

    # Relais an
    GPIO.output(3, GPIO.LOW)

    # Warte 700 ms
    time.sleep(0.7)

Ich hoffe, Ihr könnt mir helfen.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Pieper66 hat geschrieben:Habe die while-Schleife auch soweit fertig, aber weiß nicht, wie ich diese jetzt automatisch ohne Tastendruck auch wieder beende.
Aus der Schleife kommst du mit break heraus. Da du aber ohnehin eine fixe Anzahl von 5 Schleifendurchläufen haben möchtest solltest du besser for i in range(5) statt einer while-Schleife verwenden.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Code: Alles auswählen

import time
import RPi.GPIO as GPIO
from itertools import chain, repeat

REPEATS = 5

# RPi.GPIO Layout verwenden (wie Pin-Nummern)
GPIO.setmode(GPIO.BOARD)
 
GPIO.setup(3, GPIO.OUT)
 
for state in chain.from_iterable(repeat([GPIO.HIGH, GPIO.LOW], REPEATS)):
    GPIO.output(3, state)
    time.sleep(0.7)
boletus999
User
Beiträge: 25
Registriert: Dienstag 27. August 2013, 07:04

nur noch so am Rande.

wenn dir die 700ms sehr wichtig sind, d.h. ein bestimmter Vorgang immer in der exakten Zeitabfolge geschehen soll, dann verwende niemals nur time.sleep().

Denn, das Ausführen deines Skriptes benötigt auch Zeit, die auf deinen time.sleep(Wert) dazu addiert wird.
Das ist bei 5 mal nicht erwähnenswert, aber bei größeren Schleifen entsteht hier ein delay über das man sich später wundert.
Außerdem benötigt das Skript je nach PC, ARM etc. unterschiedlich lange.

Der beste Weg in meinen Augen ist das messen der Skriptdurchlaufzeit z.B. mit

Code: Alles auswählen

import timeit 
die Zeit in ms kann man dann bequem beim time.sleep(Wert - *.timeit() ) abziehen.

Ich persönlich benutze die Uhr des BS um Zeitlich etwas genau zu steuern, schalten, loggen ...
Die ist zwar auch nicht 100% genau, doch damit kann ich einen Schaltvorgang z.B. ganz genau am 8/5/2014 14:30:00:00 anschieben.

LG boletus
Theory is when you know everything but nothing works.
Practice is when everything works but no one knows why.
In my office, theory and practice are combined:
nothing works and no one knows why.
BlackJack

@boletus999: Das mit `timeit` zu messen ist IMHO ziemlicher Unsinn. Das ist ziemlich aufwändig und die Laufzeit ist von vielen Faktoren abhängig, teilweise welche die man weder im Griff hat, noch vorhersehen kann. Zum Beispiel kann der Prozess ”beliebig” lange vom Betriebssystem angehalten werden, wenn zum Beispiel die Systemlast hoch ist, oder viel IO passiert. Das kann auch locker mal deutlich länger als 700ms sein. Wenn man solche zeitlichen Garantien braucht, ist ein Rechner mit einem normalen Betriebsystem nicht brauchbar, oder man muss die Zeitkritischen Operationen als Kernelmodul/Treiber realisieren, wo man entsprechende Garantien erzwingen kann.
boletus999
User
Beiträge: 25
Registriert: Dienstag 27. August 2013, 07:04

@ BlackJack

!!Stimmt!! ich wollte aber nicht mit meinen Ausschweifungen ausufern :wink:
Theory is when you know everything but nothing works.
Practice is when everything works but no one knows why.
In my office, theory and practice are combined:
nothing works and no one knows why.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@boletus999: trotzdem ist timeit dafür ungeeignet, da man sich ja an der Systemzeit und nicht an der Skriptzeit ausrichten will, damit ist time.time() völlig ausreichend.
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

Hier mal ein link, wofür ich das brauche.

http://www.forum-raspberrypi.de/Thread- ... nksagungen

Also so genau sollte das nicht sein :-)
Der code soll nur das Display zum blinken bringen, als Empfangskontrolle für IR-Signale.
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

Besten Dank an "Sirius3"

Hat auf Anhieb funktioniert :D
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Pieper66 hat geschrieben:Ich wollte ein Relais über den Raspberry 5 mal im 0,7 Sekunden-Takt schalten (akustische und über den Schaltkontakt auch optische Signalisierung).
Bei einer so hohen Schaltrate würde ich kein Relais nehmen, außerdem hast du hoffentlich das Relais nicht direkt am Pi hängen, damit kannst du dir u.U. den Ausgang schroten…
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

außerdem hast du hoffentlich das Relais nicht direkt am Pi hängen
Schau mal in´s Schaltbild :wink:

Zudem macht ein Transistor kein "Klick" :!: (zumindest nicht öfters)

Das Relais wird eigendlich nur eher selten betätigt, nur bei Befehlen der IR-Fernbedinung und dann ja maximal 5 mal.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Pieper66 hat geschrieben:
außerdem hast du hoffentlich das Relais nicht direkt am Pi hängen
Schau mal in´s Schaltbild :wink:
Welches Schaltbild?
Zudem macht ein Transistor kein "Klick" :!: (zumindest nicht öfters)
?
Das Relais wird eigendlich nur eher selten betätigt, nur bei Befehlen der IR-Fernbedinung und dann ja maximal 5 mal.
Dann ist ja gut.
BlackJack

@Darii: Vier Beiträge über Deinem ist ein Link zu einem Raspi-Forum wo das Hardwareprojekt samt Schaltplan zu sehen ist.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

BlackJack hat geschrieben:@Darii: Vier Beiträge über Deinem ist ein Link zu einem Raspi-Forum wo das Hardwareprojekt samt Schaltplan zu sehen ist.
Aus
Du bist entweder nicht eingeloggt oder dir fehlt die Berechtigung, diese Seite zu sehen. Grund dafür könnte einer der folgenden sein:
kann ich leider nicht so viel erkennen, abgesehen davon scrolle ich nicht jeden verlinkten Thread bis zum Ende durch…
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

Leider erlaubt dieses Forum kein direktes hochladen von Bildern.
Man muß eingeloggt sein, um die "links" zu sehen, da auch ein veröffentliches Bild nur als link erscheint.

Schade eigendlich, aber diese Plattform bedarf meiner Meinung nach mal ein Update. :x

Um Missverständnisse zu vermeiden, ich meine damit NICHT dieses Forum, das ist einfach SPITZE :D
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

Aber

um das zu umgehen, kann man ja den link auch als Text darstellen :wink:

htt?://ww?.forum-raspberrypi.de/Thread-hyperion-receiver-vorstellung-und-danksagungen?pid=79600#pid79600

Die beiden ? natürlich ersetzen. :mrgreen:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Pieper66 hat geschrieben:htt?://ww?.forum-raspberrypi.de/Thread-hyperion-receiver-vorstellung-und-danksagungen?pid=79600#pid79600

Die beiden ? natürlich ersetzen. :mrgreen:
:?:

Was hat man gegenüber direktem Verlinken mit diesem Ersetzspiel gewonnen? Die Bilder kann man so oder so nicht in groß sehen ohne dort angemeldet zu sein, weil viele Foren dass aus seltsamen bis sinnlosen Gründen nicht erlauben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

Leonidas hat geschrieben:
Pieper66 hat geschrieben:htt?://ww?.forum-raspberrypi.de/Thread-hyperion-receiver-vorstellung-und-danksagungen?pid=79600#pid79600

Die beiden ? natürlich ersetzen. :mrgreen:
...Die Bilder kann man so oder so nicht in groß sehen ohne dort angemeldet zu sein, ...

Richtig, ABER man kann den link sehen, ohne HIER angemeldet zu sein ( sollte das hier denn auch so sein, kann ich zum Glück nicht testen, da ich IMMER überall automatisch angemeldet bin) :evil:
BlackJack

@Pieper66: Man kann echte Links hier auch sehen ohne angemeldet zu sein. So einen Unsinn haben wir nicht nötig um die Zahl der Mitglieder hoch zu treiben. Das verschreckt mehr Leute oder produziert ”Karteileichen”, als das es irgendwie nützlich wäre.
Pieper66
User
Beiträge: 9
Registriert: Samstag 15. März 2014, 21:54

Wenn das so ist, entschuldige ich mich dafür :oops:

Ich hatte "Darii" aber so verstanden :K
Antworten