Arduino Forum

International => Deutsch => Topic started by: guntherb on Sep 13, 2016, 08:48 am

Title: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: guntherb on Sep 13, 2016, 08:48 am
Ich wurden gebeten, die Erklärung des BlinkWithoutDelay (https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay) hier nochmal reinzustellen.

Am Beispiel eines Wachmanns, der seine Runden dreht, wird in einfacher und eingängiger Weise erklärt, wie man ohne delay() zeitliche Abfolgen programmieren kann.

(an die Profis: es geht auch einfacher, es sind syntaktische Unsauberkeiten drin. Mein Augenmerk lag auf einer möglichst einfachen Darstellung für Menschen, die noch niemals im Leben was mit Programmiersprachen zu tun hatten)

Also: Wie funktioniert Blink Without Delay?
So kompliziert ist das gar nicht.

Gehen wir vom Blinken mal einen Schritt weg  zu was ganz praktischem: Wir haben einen Nachtwächter / Wachmann, der immer seine Runden um ein Haus geht (das entspricht unserer Loop).
Zusätzlich erhält er die Aufgabe, jede Stunde für 15min eine Lampe einzuschalten. Die Lampe selbst sieht er nicht, aber es gibt einen Schalter am Haus.
Was macht er also:
Er schaltet das Licht ein, merkt sich die Zeit und dass die Lampe ein ist und macht weiter seine Runden. Bei jeder Runde schaut er auf die Uhr, ob die 15min schon um sind. Sind sie noch nicht um, geht er einfach weiter, wenn die um sind, schaltet er die Lampe aus und merkt sich, dass sie jetzt aus ist.
Nun schaut er bei jeder Runde auf die Uhr, um zu prüfen, ob die Stunde seit Einschalten schon um ist.
Ist sie um, schaltet er wieder ein, notiert sich Status der Lampe und Uhrzeit, und nimmt seine Runden wieder auf.

Genau so macht es der Arduino.
wenn wir die Schritte des Wachmanns in Arduinosprache übersetzen, schaut das in etwas so aus:

(http://forum.arduino.cc/index.php?action=dlattach;topic=423688.0;attach=187504)

wenn sich der Wachmann die Zeiten auf dem Zettel notiert, schreibt der Arduino einen Wert in eine Variable. millis() ist die Systemuhr des Arduino. Sie zählt einfach die vergangenen millisekunden seit Start des Arduino.

der zugehörige Code schaut dann so aus:
Code: [Select]
unsigned long LED_timestore;  // Variable Speicher für Systemzeit.
int LedStatus = LOW;
int LedPin = 13;



void setup() {
  pinMode(LedPin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
}

void loop() {
  if (LedStatus == LOW) {
    if (millis() - LED_timestore> 1000 ) {
      digitalWrite(LedPin, HIGH);
      LED_timestore = millis();
      LedStatus = HIGH;
    }
  } else {
    if (millis() - LED_timestore> 300) {
      digitalWrite(LedPin, LOW);
      LedStatus = LOW;
    }
  }
}


Wenn der Wachmann / Arduino mehrere Lampen schalten soll, braucht er einfach noch mehr Zettel / Variable und Schalter / Pins.

Geben wir Ihm doch noch eine Aufgabe dazu:
Erweiterung:
Ausserdem soll er alle 3h die Bewässerung für 10min einschalten.

Dann könnte das so aussehen:

(http://forum.arduino.cc/index.php?action=dlattach;topic=423688.0;attach=187502)

In dieser Weise kann man (fast) beliebig viele Aktionen unabhängig voneinander ausführen lassen.
Man kann es übersichtlicher gestalten, in dem man die einzelnen Aktionen in Funktionen packt, oder flexibler, in dem man die Zeiten in Arrays steckt. Und, und, und...



Im Anhang Tabellen als Word-Datei (Excel geht leider nicht)
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Schuppeste on Sep 13, 2016, 10:31 am
Das kann man aber auch allgemein besser schreiben, ich konnte es jetzt nicht testen..

Code: [Select]

unsigned long Zeit_Eben;  // Variable Speicher für Systemzeit.
int meineEinZeit=700;
int meineAusZeit=300;
int ledStatus = LOW;
int LedPin = 13;

void setup() {

  pinMode(LedPin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.

}

void loop() {

  int Zeitfaktor=0;

  if (ledStatus == LOW)
    Zeitfaktor=meineAusZeit;
  else
    Zeitfaktor=meineEinZeit;


  if (Jetzt()-Zeitfaktor > Zeit_Eben ) {

    Zeit_Eben = Jetzt();
    ledStatus= !ledStatus; // Umkehrung Status
    digitalWrite(LedPin, ledStatus);

  }

}

unsigned long Jetzt()
{
  return millis();
}


oder so

Code: [Select]

unsigned long Zeit_Eben;  // Variable Speicher für Systemzeit.
int meineEinZeit=700;
int meineAusZeit=300;
int LedStatus = LOW;
int LedPin = 13;

void setup() {
  pinMode(LedPin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
  }

void loop() {
  if (LedStatus == LOW) {
 
    if (Jetzt()-meineAusZeit > Zeit_Eben ) {
      digitalWrite(LedPin, HIGH);
      Zeit_Eben = Jetzt();
      LedStatus = HIGH;
    }
 
  } else {
   
 if (Jetzt()-meineEinZeit > Zeit_Eben) {
      digitalWrite(LedPin, LOW);
      Zeit_Eben = Jetzt();
      LedStatus = LOW;
   
 }
}
}

unsigned long Jetzt()
{
return millis();
}

Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Schuppeste on Sep 13, 2016, 10:39 am
Für das Verständnis ist es allerdings besser zu verstehen.. weil man eine ohnehin schwierige Numemr nicht noch im Kopf umkehren muss.

Magst wohl recht haben.. aber da muss ein Programm erstmal hinkommen.

Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Schuppeste on Sep 13, 2016, 10:49 am
Dann erkläre es doch gleich richtig!

Womöglich wird die Millis() Variable nach 50Tagen oder wann auch immer überlaufen und auf Null resettet, wenn man kurz vorm Überlauf die 300 oder 700 draufrechnet gibts einen Rechenfehler.

Also macht man das mit Minus.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: combie on Sep 13, 2016, 11:32 am
Code: [Select]
#include <TaskMacro.h>
// Die  TaskMacros sind hier zu finden:
// https://forum.arduino.cc/index.php?topic=415229.0


const bool AUS = false;
const bool EIN = true;

// Pin def
const byte licht  = 13;
const byte wasser = 12;


void tueWasser()
{
  taskBegin();
  taskPause(3L*60L*60L*1000L); // 3H warten
  while(1)
  {
   digitalWrite(wasser,EIN);
   taskPause(10L*60L*1000L); // 10 Minuten warten
   digitalWrite(wasser,AUS);
   taskPause((3L*60L*60L-10L*60L)*1000L); // Warten bis 3H voll
  }
  taskEnd();
}

void tueLicht()
{
  taskBegin();
  taskPause(60L*60L*1000L); // Stunde warten
  while(1)
  {
   digitalWrite(licht,EIN);
   taskPause(15L*60L*1000L); // 1/4 Stunde warten
   digitalWrite(licht,AUS);
   taskPause(45L*60L*1000L); // 3/4 Stunde warten
  }
  taskEnd();
}

void nachtwaechter()
{
  tueLicht();
  tueWasser();
}

void setup()
{
  pinMode(licht,OUTPUT); 
  digitalWrite(licht,AUS);
 
  pinMode(wasser,OUTPUT);
  digitalWrite(wasser,AUS);
}

void loop()
{
  nachtwaechter();
}


Das ist eine Umsetzung des Nachtwächters mit Hilfe der TaskMacros.
 


PS:
Schuppeste, meine Kritik an deinem Code habe ich gelöscht, da sie jetzt hinfällig ist.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: guntherb on Sep 13, 2016, 12:39 pm
Das kann man aber auch allgemein besser schreiben, ich konnte es jetzt nicht testen..
ja, ich weiß.

Deshalb hatte ich auch das geschrieben:
(an die Profis: es geht auch einfacher, es sind syntaktische Unsauberkeiten drin. Mein Augenmerk lag auf einer möglichst einfachen Darstellung für Menschen, die noch niemals im Leben was mit Programmiersprachen zu tun hatten)
Aber tob dich ruhig weiter aus wenns deinem Wohlbefinden dient.

Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: HotSystems on Sep 13, 2016, 01:41 pm
ja, ich weiß.

Deshalb hatte ich auch das geschrieben: Aber tob dich ruhig weiter aus wenns deinem Wohlbefinden dient.

Hallo Gunther,

deine Erklärung (auch mit dem DocToGo) ist sehr ausführlich und verständlich.
Das es nicht um den Sketch geht, sondern um eine verständliche Beschreibung hat wohl nicht jeder mitbekommen.

Alle Kritiker müssen das erst mal besser machen. Also mach weiter so.

Vielen Dank.

P.S.
Die Lösung von combie finde ich allerdings gut gelungen und hoffe das es für Anfänger verständlich ist.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: agmue on Sep 13, 2016, 06:03 pm
Ich finde Deine Anleitung sehr anschaulich, weshalb ich sie bei meiner Anleitung Ein Endlicher Automat entsteht (http://forum.arduino.cc/index.php?topic=335352.msg2312165#msg2312165) mit verlinkt habe.

Deine Anmerkung habe ich gelesen, dennoch fände ich diese Zeilen nicht gar so verwirrend:
Code: [Select]
bool LedStatus = LOW;
const int LedPin = 13;
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Tommy56 on Sep 13, 2016, 10:28 pm
Ich wurden gebeten, die Erklärung des BlinkWithoutDelay (https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay) hier nochmal reinzustellen.

Am Beispiel eines Wachmanns, der seine Runden dreht, wird in einfacher und eingängiger Weise erklärt, wie man ohne delay() zeitliche Abfolgen programmieren kann.
Im Anhang Tabellen als Word-Datei (Excel geht leider nicht)
Vielen Dank für dieses geniale Beispiel.

Gruß Tommy
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Moko on Nov 18, 2016, 03:09 pm
@guntherb
Quote
1h Wachmann entspricht 1sek Arduino
Erweiterung:
Ausserdem soll er alle 3h die Bewässerung für 10min einschalten.

Auf die Uhr sehen, ob die 3h schon rum ist. Wenn ja:    if (millis() -  Water_timestore > 1000){
müsste es nicht heissen:

Code: [Select]
  if (millis() -  Water_timestore > 3000){
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: guntherb on Nov 18, 2016, 03:48 pm
ja, sollte es, da hast du recht.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Doc_Arduino on Nov 18, 2016, 03:53 pm
Hallo,

ich weiß auch nicht warum man sich über eine gute Erklärung künstlich aufregt.
Zudem der Variablenüberlauf hier gar keine Rolle spielt.



Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: guntherb on Nov 18, 2016, 05:10 pm
Es ging ja gar nicht um den Überlauf (der ist korrekt), sondern dass ich 1000 anstelle 3000 geschrieben hatte. Ich verstehe es auch nicht als aufregen,  sondern als Hinweis auf einen Fehler.

Ich werde es bei Gelegenheit korrigieren.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: combie on Nov 18, 2016, 05:22 pm
Quote
Ich verstehe es auch nicht als aufregen,  sondern als Hinweis auf einen Fehler.
dito/ebenso/konform

Dieses Tutorial soll Anfängern auf die Sprünge helfen, und nicht verwirren.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Moko on Nov 18, 2016, 05:31 pm
dito/ebenso/konform

Dieses Tutorial soll Anfängern auf die Sprünge helfen, und nicht verwirren.
Deshalb hatte ich auch die Frage gestellt. Nicht dass sich Anfänger wundern wieso die "1000" einmal 1 Stunde, und einmal 3 Stunden bedeuted.

Es sollte keinesfalls eine Kritik an der genialen Erklärung sein.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Doc_Arduino on Nov 18, 2016, 05:56 pm
Hallo,

will ja nicht nörgeln, aber ich lese Threads immer noch komplett. Darauf bezog sich meine Aussage. Ich sehe weder ein Überlaufproblem noch eine angebliche, in einen Fehler führende, Addition.

Quote
Dann erkläre es doch gleich richtig!

Womöglich wird die Millis() Variable nach 50Tagen oder wann auch immer überlaufen und auf Null resettet, wenn man kurz vorm Überlauf die 300 oder 700 draufrechnet gibts einen SystemFehler.

Also macht man das mit Minus.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: carsten72 on Mar 14, 2017, 10:26 pm
Halllo und Grüss Euch erstmal.
Vielen Dank für die ausführliche Erklärung!

Ich habe da eine Frage :
Ich habe eine Uhr gebaut.

Kann ich den "Wachmann" auch für das refreshen eines Displays (Nokia5110) (Displayclear) verwenden und die Sekunden Punkte einer Uhr darüber blinken lassen? Es müsste doch möglich sein, die Ausgabe vom LED Pin umzuschreiben auf eine Funktion die dann Aufgerufen wird? Oder wie ich es gerne machen würde zwei Funktionen.

Bisher habe ich das mit delay gemacht ... keine gute lösung

Vielen Dank!

Carsten
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: FlyingEagle on Mar 14, 2017, 10:37 pm
ja liese es sich, vorausgesetzt das die Abarbeitung binnen einer Sekunde erfolgt, ansonsten hast du ein unregelmäßiges Blinken.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: carsten72 on Mar 14, 2017, 10:46 pm
Es gibt ja noch eine weitere lösung
Z.b. per Interrupt - die sind aber sehr schwer zu programmieren .. oder?
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Tommy56 on Mar 14, 2017, 10:50 pm
Halllo und Grüss Euch erstmal.
Vielen Dank für die ausführliche Erklärung!

Ich habe da eine Frage :
Ich habe eine Uhr gebaut.

Kann ich den "Wachmann" auch für das refreshen eines Displays (Nokia5110) (Displayclear) verwenden und die Sekunden Punkte einer Uhr darüber blinken lassen? Es müsste doch möglich sein, die Ausgabe vom LED Pin umzuschreiben auf eine Funktion die dann Aufgerufen wird? Oder wie ich es gerne machen würde zwei Funktionen.

Bisher habe ich das mit delay gemacht ... keine gute lösung

Vielen Dank!

Carsten
Klar geht das. Anstelle der Led erfolgt Deine Ausgabe.

Gruß Tommy
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: carsten72 on Mar 14, 2017, 10:57 pm

Vielen Dank Tommy
Ich probiers mal mit dem Wachmann
Gruß Carsten
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Eisebaer on Mar 14, 2017, 11:55 pm
hi,

falls Du eine RTC einsetzt, hat die im normalfall einen pin, auf dem alle sekunden von GND auf Vcc geschalten wird. ich finde das ideal, um die sekunden zu schalten.

gruß stefan
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: carsten72 on Mar 15, 2017, 08:26 am
Hi Stefan (Eisbär)
Ich verwende die DS3231.
Hast Du einen Link oder evtl. eine Zeichnung? Damit kann man den : (doppelpunkt) blinken lassen?
Das währe ja ideal.
Gruß Carsten
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: HotSystems on Mar 15, 2017, 08:34 am
Wenn ich das richtig verstehe, verwendest du ein Nokia-Display. Da kannst du nicht einfach einen Pin zum Blinken schalten.
Das musst du in deinem Sketch lösen.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: carsten72 on Mar 15, 2017, 08:46 am
Hi HotSystems,
Habe ich in der zwischenzeit auch gemerkt das es so nicht funktioniert.
Kann ich denn nicht das Display refresh und das blinken im Interrupt lösen?
Eine Routine zum Display Doppelpunkt anzeigen / löschen habe ich schon.. was fehlt ist der Trigger, den
ich bisher mit delay gelöst hatte was aber unsinn ist.
Grüße Carsten
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: HotSystems on Mar 15, 2017, 09:14 am
Dann sieh dir diesen Beitrag an, mit der Library kannst du deine Funktion ganz ohne Interrupt starten.

Interval (http://forum.arduino.cc/index.php?topic=413734.0)

Damit mache ich es auch in einem LCD-Display.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Eisebaer on Mar 15, 2017, 10:50 am
hi,

Quote
Wenn ich das richtig verstehe, verwendest du ein Nokia-Display. Da kannst du nicht einfach einen Pin zum Blinken schalten.
ich meinte natürlich nicht, daß man einen pin der RTC direkt an das display anschließt und dadurch was zum blinken bringt. aber die RTC kann dem sketch im sekundentakt ein signal geben.

auf der DS3231 ist das der SQW-pin, verwende ich auch. die funktionen zum anschalten und intervall-festlegen findest Du in den libraries. wenn Du eine sekunde einstellst, hast Du immer eine halbe sekunde HIGH und eine halbe sekunde LOW auf dem pin.

ich mache das dann in der form, daß ich bei jedem wechsel auf HIGH eine sekunde weiterzähle und natürlich nicht andauernd die uhrzeit abfragen muß, ob eine sekunde vergangen ist. das zähle ich intern, delays oder millis gibt's da garnicht. ein interrupt ist bei mir auch nicht nötig, passiert doch alles sehr langsam.

alle 60 sekunden vergleiche ich meine "mitgezählte" zeit mit der RTC.

für Deinen doppelpunkt kannst Du diesen halbsekundentakt natürlich optimal nutzen.

gruß stefan
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: FlyingEagle on Mar 15, 2017, 11:07 am
ich mache das dann in der form
Hättest du da ein wenig Beispielcode?
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: carsten72 on Mar 15, 2017, 04:13 pm
@ HotSystems: Super - genau danach habe ich gesucht!
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: HotSystems on Mar 15, 2017, 04:19 pm
Dann gebe ich den Dank weiter an combie, das ideale Teil erstellt hat.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: combie on Mar 15, 2017, 04:55 pm
 :o
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: mratix on Aug 18, 2017, 02:28 am
Sehr schön @gunther, vielen Dank für die einfache und verständliche Darstellung.
Auch die beiden, im Anschluss, folgenden Ausführungen haben mir gefallen und etwas Licht ins Sketch'ing gebracht.

Als Anfänger würde ich mir etwas i.d.A. für Variablen wünschen.
Überall stehen Begriffe wie int, unsigned long, const, bool, enum, float, double... ohne einer Erklärung :(
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: guntherb on Aug 18, 2017, 07:53 am
Danke für das Lob, aber sowas für Datentypen zu schreiben ist vergebene Mühe, weil die sind in der REFERENCE (https://www.arduino.cc/en/Reference/HomePage) recht gut erklärt.

Und wenn man des Englischen nicht mächtig ist, und eine der üblichen Suchmaschinen bemüht, dann stößt auf viele deutsche Seiten, die das ebenfalls seht gut erklären, z.B. Wikibooks: Einführung in C++/ Variablen, Konstanten und ihre Datentypen (https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Einf%C3%BChrung_in_C%2B%2B/_Variablen,_Konstanten_und_ihre_Datentypen)

Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: HotSystems on Aug 18, 2017, 09:49 am
Und weiteres findest du hier: Arduino-Code-Referenz (https://www.arduinoforum.de/referenz.php)
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Juergen001 on Apr 24, 2018, 11:05 am
Hallo zusammen,

vielen Dank an guntherb für die schöne Erklärung; auch für Anfänger gut verständlich.
Der Sketch von Schuppeste funktioniert allerdings nicht.
Zeile23 eine schliessende Klammer zu viel = )
expected primary-expression before ')' token

Zeilen 26 + 27 muss heissen LedStatus

'ledStatus' was not declared in this scope

Gut dass der Compiler sowas merkt; vielleicht kann der Sketch ja korrigiert werden

Gruß

Jürgen

Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: michael_x on Apr 24, 2018, 12:05 pm
Schuppeste könnte auch in Antwort #3 die Sache mit dem "Systemfehler" besser formulieren ;)

Keine Ahnung, was ein "Systemfehler" sein soll, aber ein Überlauf ist völlig normal.

@Juergen001: Schön dass dir dieser Thread auch gefällt und du ihn extra nochmal aufgewärmt hast.
Schön, dass du dich extra dafür registriert hast.
Willkommen im Forum.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Juergen001 on Apr 24, 2018, 01:11 pm
Hallo Michael,
vielen Dank für dein herzliches Willkommen.
Habe mich nicht extra für diesen Thread registriert sondern weil ich ein ziemlicher Anfänger mit Arduino bin und sicher noch oft Hilfestellung brauchen werde

Gruß

Jürgen
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Schuppeste on Apr 24, 2018, 08:39 pm
Danke für die Info.. wie schon dazu geschrieben war das ungetestet und dann leider Vergessen.

@Michael: Ja, die beiden Posts dahinter waren ja Antworten auf Fragen die irgendwie gelöscht wurden.

Habs geändert, Danke. Vielleicht werde ich das nochmal verfeinern.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: AxelMunshine on Aug 19, 2018, 09:36 pm
Zunächst mal: Ganz tolle Erklärung, vielen Dank für die Mühe.

Mein Problem beim Verständnis ist folgendes:
Den "delay" Befehl will man ja vermeiden, da er das Programm verzögert. Im Nachtwächter Sketch aber selbst ist es egal, weil ja nichts weiter Verzögert werden kann, er könnte also auch gut mit dem "delay" Befehl arbeiten...

Um es in der Sprache hier zu sagen:
Mein Nachtwächter geht seine Runden und muss die Blumen giessen. Wenn er einen Anruf über sein Handy bekommt, soll er seine Taschenlampe für 15 Minuten einschalten.
Er giesst also die Blumen und plötzlich klingelt sein Handy.
Er nimmt die Taschenlampe raus und schaltet sie ein.
Die Taschenlampe weiss, dass sie 15 Minuten leuchten muss.
Also steckt der Nachtwächter sie auf seinen Hut und giesst die Blumen weiter, ihm ist egal, was die Taschenlampe weiss.

Ich hoffe, das war Verständlich?

Wenn in meinem Loop "X" passiert, dann möchte ich eine LED für eine Zeit "Y" auf ON stellen.
Während "Y" läuft, soll aber der Loop weitergehen...

Ich denke, dass dieses Problem äusserst einfach zu lösen ist..., aber ich bin halt nicht die hellste Kerze auf der Torte...

Danke im Voraus für eure Mühen.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: HotSystems on Aug 19, 2018, 09:47 pm
Zunächst mal: Ganz tolle Erklärung, vielen Dank für die Mühe.

Mein Problem beim Verständnis ist folgendes:
Den "delay" Befehl will man ja vermeiden, da er das Programm verzögert. Im Nachtwächter Sketch aber selbst ist es egal, weil ja nichts weiter Verzögert werden kann, er könnte also auch gut mit dem "delay" Befehl arbeiten...
.....
Vermutlich hast du die Erklärung nicht verstanden, denn auch dank der Nachtwächtererklärung solltest du kein "delay()" verwenden, denn auch darin können diese eine Verzögerung erwirken. Ein delay() hält den Controller in einer Pause fet.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: postmaster-ino on Aug 19, 2018, 10:00 pm
Hi

Nein, mit delay() könnte Er hier NICHT arbeiten, da delay blockiert.
delay = Nachtwächter schläft.
In dieser Zeit kann der Nachtwächter weder die Taschenlampe wieder aus schalten, noch das Blumengießen beenden.
Auch hat Er keinen blassen Schimmer, daß bei Dir gerade 'X' passiert ist - der Gute ist im Land der Träume.

Also KEIN delay.
Wenn Nichts zu tun ist, machen wir einfach Nichts.
Wenn 'X' passiert, schalten wir die LED ein und merken uns die aktuelle Zeit.
Ab jetzt prüfen wir bei jedem Durchgang, ob 'aktuelle Zeit minus Einschaltzeit größer Leuchtdauer' ist.
Wenn Das nicht ist, machen wir wieder Nichts.
Erst, wenn die Leuchtdauer erreicht ODER überschritten ist (nur auf Gleichheit prüfen kann nach hinten los gehen!), wird die LED wieder ausgeschaltet - nun merken wir uns, daß die LED aus ist und wir nicht bei jedem Durchgang prüfen müssen, ob wir die LED wieder ausschalten müssen.

Also eigentlich prüfen wir, ob 'die LED an ist und die aktuelle Zeit minus der Einschaltzeit größergleich der Leuchtdauer' ist.

Gleiches mit den Blumen.
Wenn wir Diese gar nicht gießen, müssen wir auch nicht prüfen, ob wir mit dem Gießen aufhören müssen.

Wir brauchen pro Einzelarbeit
- die Startzeit
- die Laufzeit
- einen Merker, daß diese Arbeit gerade läuft

Wenn diese Arbeit aus mehreren Schritten besteht, ist Das EINE State-Maschine.

Wenn ich mehrere Arbeiten habe, die quasi gleichzeitig ablaufen sollen, sind das Alles einzelne State-Maschinen.
Also z.B. Blumen gießen und LED wieder ausschalten haben Nichts miteinander zu tun und hängen auch nicht voneinander ab - zwei einzelne State-Maschinen.

Wenn Du auf einen Tastendruck eine LED AN und auf den Nächsten wieder AUS schalten möchtest, sind die ganzen enthaltenen Schritte zusammen aber auch nur EINE State-Maschine.
- Licht ist aus, wir warten auf Tastendruck
- Licht an, wir warten auf Taste lösen (ggf. Entprellzeit)
- Licht ist an, wir warten auf Tastendruck
- Licht aus, wir warten auch Taste lösen

Wenn Du mit jedem Drücken eine weitere LED von 10 anschalten willst, kommen Da noch einige identische Zeilen drunter - immer nur mit einem anderen Ausgang, Der geschaltet wird.

Wenn Du trotzdem nicht zum Ziel kommst, eröffne bitte einen eigenen Thread und zeige uns, was Du hast.
(Sketch, Hardware, Dein Problem - was erwartest Du und was macht statt Dessen der Arduino)
Wenn Dieser dann gelöst ist, gerne einen Link in Deinen Post hier zu Deinem Thread.
So wird dieser Thread nicht zerpflückt und bleibt beim Wesentlichen.

MfG
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: AxelMunshine on Aug 20, 2018, 07:59 pm
Vielen Dank für die sehr ausführlichen Antworten.
Bin das erste mal hier und fühle mich gleich gut aufgehoben.

Beste Grüsse an alle hier aus Kopenhagen...
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Alter_Fritz on Jun 11, 2020, 01:01 pm
Ich hoffe, dass es keine Thread-Schändung darstellt, wenn man einen 2 Jahre ruhenden Thread wieder aufleben lässt. Aber um das mit der Zeit-Zählung im Arduino endgültig zu verstehen, fehlt mir, glaube ich, ein wichtiges Puzzleteil. Und zwar: Warum funktioniert der Sketch nicht mit "+", also  " if (millis() + LED_timestore> 1000"…?
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: combie on Jun 11, 2020, 01:13 pm
Weil du dir so einen weiteren Überlauf einfängst, der nicht automatisch kompensiert wird.
Einer kann durch den - Unterlauf kompensiert werden.
Dein zweiter nicht.
Title: Re: BlinkwithoutDelay - Die Nachtwächtererklärung
Post by: Tommy56 on Jun 11, 2020, 01:19 pm
@Alter_Fritz: Hier (https://forum.arduino.cc/index.php?topic=568261.msg3871289#new) habe ich die millis mal in Byte nachgebildet, damit es nicht so lange dauert. Daran kannst Du es austesten.

Gruß Tommy