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

Dienstag 6. Mai 2014, 21:56

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: 3334
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dienstag 6. Mai 2014, 22:04

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: 11556
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 6. Mai 2014, 23:36

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

Mittwoch 7. Mai 2014, 10:52

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

Mittwoch 7. Mai 2014, 11:17

@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

Mittwoch 7. Mai 2014, 12:07

@ 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: 11556
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 7. Mai 2014, 14: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

Mittwoch 7. Mai 2014, 16:06

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

Mittwoch 7. Mai 2014, 17:56

Besten Dank an "Sirius3"

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

Mittwoch 7. Mai 2014, 19:52

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

Mittwoch 7. Mai 2014, 20:38

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

Donnerstag 8. Mai 2014, 15:35

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

Donnerstag 8. Mai 2014, 15:45

@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

Donnerstag 8. Mai 2014, 16:52

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

Donnerstag 8. Mai 2014, 20:45

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
Antworten