Go Down

Topic: BlinkwithoutDelay - Die Nachtwächtererklärung (Read 18194 times) previous topic - next topic

combie

Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Quelle: Jean-Paul Sartre

mratix

#31
Aug 18, 2017, 02:28 am Last Edit: Aug 18, 2017, 02:34 am by mratix
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 :(

guntherb

Danke für das Lob, aber sowas für Datentypen zu schreiben ist vergebene Mühe, weil die sind in der REFERENCE 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

Grüße
Gunther

HotSystems

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Juergen001

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


michael_x

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.

Juergen001

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

Schuppeste

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.

AxelMunshine

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.

HotSystems

#39
Aug 19, 2018, 09:47 pm Last Edit: Aug 19, 2018, 09:51 pm by HotSystems
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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

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
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

AxelMunshine

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...

Alter_Fritz

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"…?

combie

#43
Jun 11, 2020, 01:13 pm Last Edit: Jun 11, 2020, 01:14 pm by combie
Weil du dir so einen weiteren Überlauf einfängst, der nicht automatisch kompensiert wird.
Einer kann durch den - Unterlauf kompensiert werden.
Dein zweiter nicht.
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
Quelle: Jean-Paul Sartre

Tommy56

@Alter_Fritz: Hier habe ich die millis mal in Byte nachgebildet, damit es nicht so lange dauert. Daran kannst Du es austesten.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up