Wie der Titel schon sagt, versuche ich mich seit einiger Zeit daran, einen sketch zu schreiben, der dies ermöglicht.
Die LED zu dimmen ist kein problem, nur das bekomme ich nur ununterbrochen hin, ohne Pausen dazwischen.
Bisher ist es nur eine Endlosschleife aus "von dunkel zu hell" und von "hell zu dunkel".
Ich möchte dazwischen aber noch eine dauernde hell-Phase und zum Schluß noch eine dunkel-Phase.
Das ganze aber ohne delay darin zu verwenden.
Hat jemand so etwas schon einmal realisiert oder einen Lösungsansatz?
Wenn Du int dimmStatus = 0; definierst und dann auch die Zustände 1,2,3 verwendest, kannst Du leicht zwei weitere Zustände für "hell halten" und "dunkel halten" ergänzen. Der endliche Automat macht dann, was Du möchtest
Wenn es Dir besser gefällt, kannst Du "if" durch "switch/case" ersetzen.
Die Zeile dimm = 128 + 127 * cos(2 * PI / LEDblinken * millis()); verküpft die Fadegeschwindigkeit direkt mit der Zeit, wodurch keine Unterbrechung möglich ist1). Wenn Du anstelle der Addition eine nichtlineare Funktion implementieren möchtest, geht das natürlich auch, nur nicht mittels millis().
So absolut gilt das nicht, da auch eine mathematische Funktion Sprünge enthalten kann. Da ich leider kein Mathegenie bin, würde ich aber einen zumindest für mich einfacheren Weg wählen. Wer also eine Funktion formulieren möchte, die auch eine Zeit bei hell und dunkel "wartet", möge dies tun. Ich würde mich freuen und was lernen
Wenn du unbedingt mit der cos Funktion arbeiten willst, solltest du statt millis() die Differenz (millis() - vorige_millis) verwenden. und natürlich statt der 2 dimmstatus Werte 4 vorsehen.
Hab ich bereits versucht, ohne erfolg.
Zeigen
Was heisst "ohne Erfolg" ?
Hast du vergessen, die Änderung hochzuladen, oder hat sich die Änderung anders verhalten als gedacht?
Den sketch mit 1 2 3 4 hab ich nicht mehr gespeichert, war ein Test von vielen und nur eine von vielen Variationen die ich durchprobiert habe und trotzdem zu keinem Ergenis gekommen bin.
Ich weiß noch, das ich dimmStatus=1 geschrieben, das Programm aber dauernd mit 3 anfing und
if (dimmStatus == 1)
else if (dimmStatus == 2)
else if (dimmStatus == 3)
else if (dimmStatus == 4)
im skech verwendet hatte und trotzdem nicht funktionierte.
Wärend meiner ganzen Versuche, war zwischen einen festehendem Programm, über auslassen der dauernden Zwischenzeiten bis zu keiner Reaktion alles dabei.
Deswegen jetzt die Frage hier, wie Ihr da ran gehen würdet.
Mit dem cos bin ich mir auch noch nicht ganz sicher, sieht auf jeden fall besser aus, wie eine linieare Dimmung, auch wenn der der graphische Verlauf der Ausschaltkurve dabei noch nicht stimmt...
Deswegen jetzt die Frage hier, wie Ihr da ran gehen würdet.
Wenn des sketch was anderes macht als man meint programmiert zu haben, helfen meist Serial.print debug-Ausgaben.
Wenn es zu unübersichtlich wird, hilft oft, Funktionen zu definieren, damit man zwischen Programmlogik ( in welchem Schritt bin ich ) und Berechnung/Ausgabe der LED leichter trennen kann.
Das erleichtert es oft auch, statt der eigentlichen Berechnung/Ausgabe eine Test-Ausgabe ( Test-Led, oder Debug Text ) zu erzeugen.
if (dimmStatus == 1)
else if (dimmStatus == 2)
else if (dimmStatus == 3)
else if (dimmStatus == 4)
würde ich switch case nehmen, und den Zuständen mit
enum dimmStatus {aus, hellerwerden, an, dunklerwerden};
Namen geben.
Zuweisung:
byte dimmStatus = hellerwerden;
normo:
Mit dem cos bin ich mir auch noch nicht ganz sicher, sieht auf jeden fall besser aus, wie eine linieare Dimmung, auch wenn der der graphische Verlauf der Ausschaltkurve dabei noch nicht stimmt...
Deswegen Werte aus einem Array holen. Für jeden Dimmschritt einen Wert. Notfalls, wenn du nicht so viele Werte im Array haben möchtest, kannst du immer noch interpolieren. Wertebeispiele damit das Dimmen fürs Auge passt, musst du in dem anderen Thread suchen.
Ich versuche jetzt nochmal was und denn mal schauen ob es klappt.
Wenn nicht, werde ich euch den sketch zeigen, vielleicht seht Ihr ja wo mein (Gedanken-)Fehler ist.
Ich glaub ich weiß warum es vorher nicht mit dem 1 2 3 4 ging.
Habe den sketch nochmal versucht zu schreiben und er funktionierte sofort, ich wusste nur nicht was zum letzten mal anders war.
Als ich den Monitor zum anschauen der Werte öffnen wollte, zeigt er nix, da im sketch noch alles als Kommentar markiert war.
Nachdem ich den sketch nochmal hochgeladen hatte, ging wieder nichts mehr, also wieder als Kommentar markiert, hochgeladen, funktioniert.
Ich vermute mal, das da irgendwas mit der seriellen Ausgabe überfordert ist und der sketch deswegen nicht läuft.
Für gewöhnlich ist das meine übliche Vorgehensweise, wenn etwas nicht funktioniert so wie gedacht oder wie es sollte, mir alle Werte am Monitor anzusehen. Das wurde mir diesmal wohl zum Verhängnis, was mich viele Stunden und Nerven gekostet hat.
Hier nochmal der komplette sketch, so wie er jetzt bei mir läuft: