Forum: Mikrocontroller und Digitale Elektronik Beleuchtung Dimmen nach Zeit


von Michi (Gast)


Lesenswert?

Hi,

Wie kann ich das machen: Ich habe eine Beleuchtung mit PWM steuerbar. Es 
kann die Helligkeit mit 8 Bit also 0-255 eingestellt werden.

Jetzt soll die Beleuchtung immer in gleicher Zeit bis zur Dunkelheit 
gedimmt werden (Beispiel 5 sec.).

Wenn man alle 10 msec oder so eins abzieht, ist bei Helligkeit 100 ja 
doppelt so schnell dunkel wie bei Helligkeit 200. Wie kann man es so 
machen, dass es immer gleich lang dauert egal wie hell?

Danke für die Mithilfe!


Michi

von ängstlicher (Gast)


Lesenswert?

Wert alle x ms mit einem konstanten Faktor <1 multiplizieren 
(zumindestens theoretisch).

von ängstlicher (Gast)


Lesenswert?

Jetzt wo ich nochmal darüber nachgedacht habe: Kommando zurück, so geht 
es nicht. Sry.

Dann bleibt wohl nur ausrechnen wie viel man jeweils abziehen muss.

von dumdidum (Gast)


Lesenswert?

Teile deinen Helligkeitswert durch die Zeit-Intervalle in denen du 
dimmen willst und dann zieh das Schritt für Schritt ab?

Oder habe ich gerade einen Denkfehler?


Also alle 100 ms dimmen auf 5s gesamt hieße: 50 Schritte

von 250 (Helligkeit) auf Null musst du eben dann 250 / 50 = 5 pro 100ms 
abziehen und von 100 auf Null musst du eben dann 100 / 50 = 2 pro 100ms 
abziehen ... nicht?

P.S.: Es ist spät, ich bin ziemlich fertig, kann sein, dass das grad 
großer Müll ist, aber für mich macht es im Moment gerade Sinn so...

von Karl H. (kbuchegg)


Lesenswert?

dumdidum schrieb:

> von 250 (Helligkeit) auf Null musst du eben dann 250 / 50 = 5 pro 100ms
> abziehen und von 100 auf Null musst du eben dann 100 / 50 = 2 pro 100ms
> abziehen ... nicht?

Schon.
Das Problem kommt, wenn sich die Zahlen eben nicht so schön ausgehen.

Dann würd ich so vorgehen:
Prinzipiell genau gleich ausrechnen, nur dass ich dann mit dem Inkrement 
wieder zurückrechne und die 100ms korrigiere, so dass die Differenz 
minimal wird.

Oder aber man setzt einen Bresenham auf das Problem an.
Die eine Achse ist die Zeit, die andere Achse ist die 
Helligkeitsdifferenz.

von Nonlineares Wesen (Gast)


Lesenswert?

Der Trick beim Dimmen, Lautstärke regeln etc.. ist, die nonlineare 
Wahrnehmung abzubilden. Wenn Du immer nur einen Wert abzählst, sieht es 
so aus, als würde es Anfangs langsam und dann immer schneller dunkel 
werden.
Deshalb ist es für das Empfinden angenehmer/natürlicher, wenn der Wert 
schrittweise mit einem Faktor 0 < x < 1 multipliziert wird, wobei die 0 
nur bei beliebig genauen reelen Zahlen nicht erreicht werden würde, in 
der Praxis aber definierbar schnell erreicht wird.
Ich denke, das ganze ist mit Integers abbildbar.

Schau einfach, nach wie vielen Schritten Du von einem Standardwert (z.B. 
1000) auf 0 kommst, wenn Du ihn immer wieder mit 1000 multiplizierst und 
durch 1024 teilst:
1
#include <stdio.h>
2
3
int main(int argc, char** argv)
4
{
5
        int i, n;
6
        i = 1000;
7
        for (n = 0; i > 0; ++n)
8
        {
9
                i *= 1000;
10
                i /= 1024;
11
                printf ("%d: %d\t", n, i);
12
        }
13
}

gibt aus:
0: 976  1: 953  2: 930  3: 908  4: 886
...
153: 4  154: 3  155: 2  156: 1  157: 0

Bei einem Standardwert von 1000 hast Du also 158 Schritte bis zur 0. Die 
kannst Du jedesmal live ausrechnen oder in einer Tabelle ablegen, ist 
Geschmackssache und eine Frage des freien Speichers.

Der Gag ist, dass Du das Abdimmen dadurch machst, dass Du den jeweiligen 
Wert errechnest:
Aktueller Wert = (Startwert * aktueller Faktor) / 1000

von Michi (Gast)


Lesenswert?

Vielen Dank für die Tipps!

Ich wollte gar nicht erst fragen wegen nicht-linearem Ablauf usw. Linear 
erschien mir schon kompliziert genug. Aber mit den Informationen schaffe 
ich es nun, mir das Programm zurecht zu schreiben.

Ihr seid super!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.