Hier meine Aufgabenstellung (ist für einen Belichtungsrechner für meine Camera):
tStart = gewünschter Anfangswert
tEnd = gewünschter Endwert
now = das "Jetzt" seit starten des Programmes
runStart = hier wurde das Programm gestartet
tDuration = gewünschte Dauer des Programmes
Momentanwert = ?
Hier ist der Momentanwert 499,5, denn ich befinde mich in der Mitte der Zeit (now - runStart = tDuration / 2) und somit habe ich die Hälfte zwischen tEnd und tStart ((tEnd-tStart)/2)
Gewünscht ist zu jedem beliebigen JETZT (now) den aktuellen Wert zwischen tStart und tEnd abfragen zu können, abhängig natürlich von der Dauer der linearen Änderung von "tStart" zu "tEnd" über die Dauer "tDuration".
Hallo MaFu,
das funktioniert super!
Du hast nicht zufällig noch die passende Formel (mit den gleichen werten) für exponentielle Wertänderung in deinem Mathematikerkopf?
Ich komme auch ganz gut klar mit meinen Bezeichnungen, vor allem weil ich immer weiß was es ist (das geht mir mit S0 leider nicht so). Ich halte hier immer eine art Namenskonvention ein, die Variablennamen sind halt relativ lang...
@TelosNox: Da habe ich auch schon dran gedacht, das werde ich mal testen - allerdings glaube ich nicht das die lineare Rampe funktionieren kann...
Das ist das Problem. Sobald Du mit Exponentialfunktionen arbeitest wird es mit Integers schwierig. Ich will nicht sagen, daß es überhaupt nicht gehen kann, aber dazu muß man dann sehr genau verstehen wie die Formeln funktionieren und auch genau auf die Wertebereiche aufpassen. Deshalb wäre es vermutlich besser wenn Du dazu auf floats umstellst.
Ich habe keine floats genommen, weil ich da immer Probleme bekomme mit der Wandlung in Strings. Ich habe ein Display dran hängen und gebe hier einen String aus. Teilweise sind das dann auch Werte aus den Berechnungen. Bei "long" geht das ohne Probleme, bei float sträubt sich das Arduino erfolgreich.
[quote author=Udo Klein link=topic=67997.msg501102#msg501102 date=1312096622]
(exp(t)-exp(t0))/(exp(t1)-(exp(t0)) = (s-s0)/(s1-s0)
oder
s = (s1-s0)/(exp(t1)-exp(t0)) * (exp(t)-exp(t0)) + s0
[/quote]Hast Du das mal selber auf dem Arduino ausprobiert?
Ich denke, dass bei den Zahlen von derHerrKohler viel zu große Werte rauskommen. Die können auf dem Arduino nicht mehr verarbeitet werden.
TelosNox:
Für so lineare Sachen kann man einfach die Funktion MAP nehmen
du müsstest halt zunächst aus runStart + runDuration dein runEnd ausrechnen.
Meine obige Formel entspricht weitestgehend der map Funktion. Nur werden da zwei Rechenschritte gespart (runEnd berechnen welches map anschließend wieder für das errechnen der differenz verwendet) und es funktioniert so auch mit float (map ist nur für int definiert).
Wozu ausprobieren? Solange er nicht sagt wie die Wertebereiche sind ist unklar ob das Probleme geben wird oder nicht. Man kann auch andere Exponentielle Formeln nehmen. Genaugenommen ist ein Freiheitsgrad zuviel da. Wie gesagt: solange er das nicht sagt ist es ziemlich nutzlos das auszuprobieren.
Ich für meinen Teil würde keine exponentielle Funktion nehmen sondern Splines.
Mein Wertebereich liegt immer im positiven Bereich bis ca. 30.000.000 (8 Stunden in ms) für now , runStart und tDuration. Die Belichtungszeiten (tStart und tEnd) liegen zwischen 5 und 600.000 (ca 10 Minuten). Die Genauigkeit ist hier nicht ausschlaggebend, ob das jetzt 3 ms mehr oder weniger sind, kann ich vernachlässigen denke ich.