Hallo,
ich möchte über meinem Aquarium eine LED dimmen.
Dazu habe ich einen Arduino Uno und eine DS1307 RTC.
Aus einem älteren Beitrag hier im Forum habe ich den Code.
Das war dieser Beitrag Beitrag "Propleme beim Zeitgesteuerten Dimmen einer LED"
Ich verwende jedoch kein LCD Display.
Nach ersten Tests läuft der Code.
Meine Frage: Wie kann ich in diesen Code verändern damit die LED fürs
Menschliche auge gleichmäßig dimmt also logarithmisch.
Ich bin anfänger im Arduino Bereich und bin für eure Hilfe und
Lösungsansätze wirklich dankbar. Ich weiß nicht in welche Richtung ich
jetzt gehen muss.
Ach so, hier nochmal der Code wie ich Ihn jetzt benutze:
1
#include<Time.h>
2
#include<TimeLib.h>
3
#include"Wire.h"
4
5
intledPin=10;// LED Pin setzen
6
7
#define DS1307_I2C_ADDRESS 0x68 // I2C Adresse
8
charbuffer[20]="";
9
10
11
bytebcdToDec(byteval)
12
{
13
return((val/16*10)+(val%16));
14
}
15
16
17
//Zeit und Datum aus DS1307 auslesen und konvertieren
18
19
voidgetDateDs1307(intdate[])
20
{
21
Wire.beginTransmission(DS1307_I2C_ADDRESS);// I2C-Kommunikation im Schreibmodus starten
Daniel schrieb:> Meine Frage: Wie kann ich in diesen Code verändern damit die LED fürs> Menschliche auge gleichmäßig dimmt also logarithmisch.
Man könnte das formelmässig korrigieren, indem man den Lichtwert erst
durch eine Exponentialfunktion jagt, die ihn so "verzerrt", dass durch
die logarithmische Kennlinie des Auges sich dann alles wieder
ausgleicht. Gegen die Kennlinie des Auges kannst du nichts tun, die ist
dir vorgegeben. Aber du kannst natürlich dieser vorgegebenen Kennlinie
eine andere davorsetzen, so dass die logarithmische Kennlinie dann
wieder alles gerade biegt.
An und für sich ist die Berechnung gar nicht mal so aufwändig. Aber im
einfachsten Fall benutzt man dazu einfach eine Tabelle, in der diese
Kennlinie schon eingearbeitet ist.
Du findest zb hier eine
https://www.mikrocontroller.net/articles/LED-Fading
Dann heisst es bei dir dann eben
1
....
2
3
// exponentielle Kennlinie anwenden
4
licht=tabelle[licht];
5
6
// jetzt noch schnell die Lampe tatsächlich anhand der
Daniel schrieb:> Ich komme jetzt nicht weiter wie ich den pwmtable auf zB 1800Sekunden> verteile.
Das heisst also, du hast den Code nur abgeschrieben. Sauber. Das rächt
sich jetzt.
Ich denke ich hab in dem von dir verlinkten Atikel mehr als ausführlich
die Herleitung des Programmes mit dem damaligen Fragesteller
durchbesprochen.
PS. Deine PWM geht nur von 0 bis 255 und nicht von 0 bis 65535. Daher
wird dir diese Tabelle nicht viel helfen.
Du musst schon eine nehmen, in der keine grösseren Werte als 255
vorkommen.
(die hat dann allerdings nur mehr 32 Dimmstufen).
Die hier zum Beispiel
1
constuint16_tpwmtable_8D[32]=
2
{
3
0,1,2,2,2,3,3,4,5,6,7,8,10,11,13,16,19,23,
4
27,32,38,45,54,64,76,91,108,128,152,181,215,255
5
};
allerdings musst du dann auch deine Berechnung
1
intmaxlicht=255;
entsprechend anpassen. Denn du hast ja keine 256 Dimm-Stufen mehr,
sondern nur noch 32. Irgendeinen Tod musst du sterben. Entweder du
akzeptierst, dass die Helligkeitszunahme nicht linear ist, oder du lässt
einige Dimmstufen aus, damit du aus dem Rest zusammen mit der
logarithmischen Kennlinie eine lineare Zunahme bauen kannst. Aber beides
zusammen geht nicht.
(Oder aber du machst die PWM selber anstatt die vorgfertigte
analog_write zu benutzen. Denn die kann eben nur 8 Bit PWM, mit Werten
von 0 bis 255)