INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Zeitverzögerung
13.08.2014, 01:43 (Dieser Beitrag wurde zuletzt bearbeitet: 13.08.2014 01:44 von robin.)
Beitrag #1
Zeitverzögerung
Hallo an Alle,

ich habe schon von mehreren gehört, dass man die "Delay" -Funktion nicht verwenden soll.

Nun also meine Frage, wie bekomme ich eine Zeitverzögerung hin?

Eingangssignal wird High - LED soll 5 Sekunden leuchten und dann erst ausgehen. Also mit dem normalen Beispiel von Blink without Delay geht es leider nicht, hat jemand eine Idee? Kann Delay leider nicht nutzen, da es kritisch werden möchte, wenn alles stoppt. Vielen Dank.

Kurzübersicht: (Da ich gerade nicht meinen Code zur Verfügung habe)

PIR1 aktiv
LED1 An
LED2 An
LED3 An
30s warten (Timeout) oder wenn PIR2 aktiv ist (Wenn PIR2 aktiv ist 5s leuchten)
LED3 Aus
LED2 Aus
LED1 Aus


Mit freundlichen Grüßen

Robin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.08.2014, 06:14 (Dieser Beitrag wurde zuletzt bearbeitet: 13.08.2014 06:26 von RMR.)
Beitrag #2
RE: Zeitverzögerung
(13.08.2014 01:43)robin schrieb:  Hallo an Alle,

ich habe schon von mehreren gehört, dass man die "Delay" -Funktion nicht verwenden soll.

Nun also meine Frage, wie bekomme ich eine Zeitverzögerung hin?
Robin

Moin Robin,

in dem du mit der"verstrichenen" Zeit arbeitest. Dafür kannst du millis() verwenden.

Beispielcode findest du: hier

Warum soll Blink without Delay nicht funktionieren? Du lässt deine LED eben solange an bis
deine 30 bzw 5 Sekunden für PIR2 um sind.

Das ist eine klassische IF /ELSE -Struktur.

VG, Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.08.2014, 09:53
Beitrag #3
RE: Zeitverzögerung
(13.08.2014 01:43)robin schrieb:  ich habe schon von mehreren gehört, dass man die "Delay" -Funktion nicht verwenden soll.
Die delay()-Funktion ist nicht unbedingt per se böse. Wie bei jeder anderen Funktion kann man halt nichts machen, während delay() läuft (außer mit Interrupts). Wenn man also z.B. ein Licht einschaltet und per Taster schon vor der abgelaufenen Zeit wieder abschalten will, dann wird's mit delay() kompliziert.

Zitat:Eingangssignal wird High - LED soll 5 Sekunden leuchten und dann erst ausgehen.
Hä? In Deinem Ablauf unten leuchtet doch eh alles 30 Sekunden. Das ist eh länger als 5 Sekunden.

Zitat:Also mit dem normalen Beispiel von Blink without Delay geht es leider nicht, hat jemand eine Idee?
Ja, zeig Dein Coding.

Zitat:Kann Delay leider nicht nutzen, da es kritisch werden möchte, wenn alles stoppt.
Was genau meinst Du für Deinen Fall damit?

Zitat:30s warten (Timeout) oder wenn PIR2 aktiv ist (Wenn PIR2 aktiv ist 5s leuchten)
Wie meinst Du das? Normalerweise (PIR1 an, PIR2 aus) 30 Sekunden und wenn PIR1 und PIR2 beide aktiv, dann nur 5 Sekunden?
Oder wenn PIR2 auch an ist, dann nicht nach 30 Sekunden ausgehen, sondern weitere 5 Sekunden anbleiben?
Oder meinst Du etwa sowas: So lange anbleiben wie PIR2 aktiv (plus 5 Sekunden), ansonsten nach 30 Sekunden ausgehen?
Die meisten Varianten kann man gefahrlos mit delay() machen.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.08.2014, 21:55 (Dieser Beitrag wurde zuletzt bearbeitet: 16.08.2014 05:34 von robin.)
Beitrag #4
RE: Zeitverzögerung
EDIT: Siehe nächsten Post
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.08.2014, 20:11
Beitrag #5
RE: Zeitverzögerung
Hi,
also Dein Programm ist viel zu lang als das da jemand Lust hat, sich das genauer anzuschauen. Ich würde Dir empfehlen, mal einen kleineren Sketch zu machen, der Dein Problem zeigt.
Ansonsten kann ich Dir das empfehlen:
1. Schmeiß so lange Sachen aus Deinem Programm bis das, was übrig bleibt, so funktioniert, wie Du Dir das denkst. Dann füge Stück für Stück neues dazu. Zwischendurch immer ausprobieren. Falls Du dann nicht weiterkommst, dann kannst Du gezielt hier fragen.
2. Schreibe Dein Programm so um, dass es keine (!!!) delays-Aufrufe außer denen im Setup hat.
3. Teile das, was momentan in der Funktion loop steht in sinnvolle Unterfunktionen auf. Das könnte z.B. sein: handleProtocol für die Ausgabe, handleLights für's Einschalten und Ausschalten, handleSensors für's Abfragen der Sensoren.
4. Es gibt nur eine einzige Version, wie man die Sache mit den millis() richtig macht. Siehe hier: http://www.leonardomiliani.com/en/2012/c...di-millis/. Du machst das am Anfang richtig, aber später nicht mehr. Das wird nach ungefähr 49 Tagen schief laufen.
5. Definiere Dir ein paar globale Variablen, die den kompletten Zustand des Systems erfassen. D.h. inklusive der momentanen Helligkeit der einzelnen LEDs.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.08.2014, 05:38
Beitrag #6
RE: Zeitverzögerung
Hallo Thorsten,

okay werde dann nur einen Programmausschnitt in den nächsten Tagen liefern.

Wieso ist meine Art von millis() falsch? Ich habe doch immer nach dem Standard gearbeitet.

Code:
unsigned long currentMillis = millis();
  
   if(currentMillis - previousMillis > interval) {

    previousMillis = currentMillis;  
    ...
   }

Ich werde dort hingehend nochmal recherchieren.


Mit freundlichen Grüßen

Robin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.08.2014, 09:17
Beitrag #7
RE: Zeitverzögerung
Hi,
leider hast Du Dein Coding wieder rausgenommen, ich kann Dir also nicht direkt zeigen, was ich meine.
Ich sagte ja, dass Du es am Anfang richtig machst. Weiter unten im Coding gibt es aber ein paar Stellen, die anders sind. Wenn Du Dein Coding wieder reinstellst, dann zeige ich Dir direkt, was ich meine.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.08.2014, 10:02
Beitrag #8
RE: Zeitverzögerung
Hi Ricardo,
ich verstehe nicht, was Du meinst. Ich denke mal, dass die drei Punkte ("...") für die eigentliche Aktion stehen. Die von Dir bezeichnete Zeile braucht man schon, sonst bleibt previousMillis ja ewig auf 0 stehen und die Bedingung ist nach dem ersten mal immer wahr.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste