Für lineare Farbverläufe sollte sich das HSV-Farbmodel besser eignen, als das RGB-Model (wenn's mit RGB überhaupt geht).
Dort bestimmst Du die Farbe durch H (Winkel), S (Entfernung zur Mittelachse = Weiß) und V (Entfernung vom 'Boden'=Schwarz).
Wenn Du hier Zwischen Start- und Zielpunkt eine Gerade ziehst, kannst Du beliebig viele Zwischenpunkte berechnen und kannst zu Diesen die drei jeweiligen Werte für H, S, V berechnen.
Diese Werte kannst Du in RGB umwandeln und zu Deinem Stripe schicken.
Welche Tageszeit welcher Farbe entspricht ... gute Frage.
Je kleiner Du aber die Abstände der Einzelfarben machst, desto realistischer wird Dein Farbverlauf.
Blödes Beispiel:
0:00 schwarz H und S egal, V=0
12:00 weiß H und S egal, V=1
24:00 schwatz H und S egal, V=0
Hier würdest Du nur in einem Grau-Bereich faden, einige Punkte mehr dürften also nicht stören
Die Komplexität wird darin bestehen, daß Du die Hypotenuse eines 'schräg' im Raum liegenden Dreieck berechnen musst.
Alles kein Hexenwerk, durften wir in der Schule hüstel ... röchel ... auch schon machen - ist aber ein paar Jahre bereits her.
Mir ist noch nicht ganz klar was Du da vorhast. Wie sollen die LED angeordnet sein, Streifen , Rechteck, Kreis. ? Sollen alle LED immer die gleiche Farbe haben.
Ich wüdre auch mit HSV Farbmodell arbeiten. Kenne aber nur die FastLED etwas , Link zr Beschreibung hatte ich schon angegeben. Denke aber das geht mit der LIB die Du verwendest ähnlich. MIT dem RGB hast Du eventuell mehr Freiheiten wird aber sicher viel schwieriger.
Bau dir doch erst mal was um die HSV Farbpalette langsam durchlaufen zu lassen. Dann siehst Du dir an ob Dir das gefälllt und ob du da Teile von gebrauchen kannst. z.B Bereich von weiss richtung rot - und blau für den Abendhimmel für den "Sonnenuntergang"
Den Vorgang "Sonnenuntergang" lässt du dann zu einer bestimten Uhrzeit starten. Dann must Du die oberlegen wie lang das dauern soll . sagen wir mal 100 min. Die Farbpalette von weiss , gelb bis dunkelrot hat ca. 100 Werte. Dann könntest Du jede Minute die Farbe um 1 ändern. Eventuell zum ende hin schneller ??
Funktioniert das HSV Modell denn mit RGBW LEDs? Wahrscheinlich nicht.
Ja alle LEDs sollen die gleiche Farbe darstellen und sind als Streifen angeordnet.
Ich habe mal eine Konversion von HSI zu RGBW gefunden., weiss aber nicht mehr wo.
class OneLed {
public:
void set(uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
green = g;
red = r;
blue = b;
white = w;
}
void set(uint32_t code) {
green = code & 0xFF;
code >>= 8;
red = code & 0xFF;
code >>= 8;
blue = code & 0xFF;
code >>= 8;
white = code & 0xFF;
}
uint32_t get() {
return *((uint32_t*)&green);
}
void set(float H, float S, float I);
uint8_t green;
uint8_t red;
uint8_t blue;
uint8_t white;
};
// This section is modified by the addition of white so that it assumes
// fully saturated colors, and then scales with white to lower saturation.
//
// Next, scale appropriately the pure color by mixing with the white channel.
// Saturation is defined as "the ratio of colorfulness to brightness" so we will
// do this by a simple ratio wherein the color values are scaled down by (1-S)
// while the white LED is placed at S.
// This will maintain constant brightness because in HSI, R+B+G = I. Thus,
// S*(R+B+G) = S*I. If we add to this (1-S)*I, where I is the total intensity,
// the sum intensity stays constant while the ratio of colorfulness to brightness
// goes down by S linearly relative to total Intensity, which is constant.
void OneLed::set(float H, float S, float I) {
int r, g, b, w;
float cos_h, cos_1047_h;
H = fmod(H, 360); // cycle H around to 0-360 degrees
H = 3.14159 * H / (float)180; // Convert to radians.
S = S > 0 ? (S < 1 ? S : 1) : 0; // clamp S and I to interval [0,1]
I = I > 0 ? (I < 1 ? I : 1) : 0;
if (H < 2.09439) {
cos_h = cos(H);
cos_1047_h = cos(1.047196667 - H);
r = S * 255 * I / 3 * (1 + cos_h / cos_1047_h);
g = S * 255 * I / 3 * (1 + (1 - cos_h / cos_1047_h));
b = 0;
w = 255 * (1 - S) * I;
} else if (H < 4.188787) {
H = H - 2.09439;
cos_h = cos(H);
cos_1047_h = cos(1.047196667 - H);
g = S * 255 * I / 3 * (1 + cos_h / cos_1047_h);
b = S * 255 * I / 3 * (1 + (1 - cos_h / cos_1047_h));
r = 0;
w = 255 * (1 - S) * I;
} else {
H = H - 4.188787;
cos_h = cos(H);
cos_1047_h = cos(1.047196667 - H);
b = S * 255 * I / 3 * (1 + cos_h / cos_1047_h);
r = S * 255 * I / 3 * (1 + (1 - cos_h / cos_1047_h));
g = 0;
w = 255 * (1 - S) * I;
}
red = r;
green = g;
blue = b;
white = w;
}
Vielleicht kannst du ja Teile davon verwenden.
Added: habe die Stelle gefunden und da ist es auch viel schöner dargestellt.
Auch die Konversionsroutinen sind einfache Funktionen.
Rentner:
Ich wüdre auch mit HSV Farbmodell arbeiten. Kenne aber nur die FastLED etwas , Link zr Beschreibung hatte ich schon angegeben. Denke aber das geht mit der LIB die Du verwendest ähnlich.
Lady Ada1) hat da leider nichts eingebaut, dafür funktioniert RGBW. Bei FastLED wird HSV unterstützt, aber nicht RGBW.
Jani007:
Kann mir noch jemand ein Tipp geben wie ich die jetzt mit bestimmten Zeiten der ReelTimeClock verknüpfe und wie ich dann die Zwischenwirte berechnen kann. Ich kann ja schlecht für jede Uhrzeit exakte Farbeinstellungen speichern.
Mir fehlt leider die Vorstellung, wie sich Helligkeit und Farbe über den Tag verändern. Da ich aber noch aus einer Zeit stamme, wo man mit dem Belichtungsmesser herumlief, spekuliere ich mal, daß sich um 12 Uhr herum nicht viel ändert. Zu Sonnenauf- und -untergang sieht das viel spektakulärer aus. Da braucht sie ungefähr eine halbe Stunde, um glutrot aus dem Meer aufzutauchen oder darin zu versinken. Wenn Du eine nichtlineare mathematische Funktion findest, die das beschreibt, dann kannst Du rechnen, sonst benötigst Du eine Tabelle. Diese Tabelle könnte neben RGBW auch eine Zeit bis zum nächsten Wechsel enthalten. Die RGBW-Werte sind ja in Stufen von 0 bis 255 anzusteuern, Du erhälst also keinen kontinuierlichen Übergang. Von einem Schritt zum nächsten braucht das Programm nichts zu tun, nur warten.
Als Zeit kannst Du die Minuten seit Mitternacht nehmen, also 0 bis 1439. Welche Uhr verwendest Du?
Anm.:
Limor Fried, Chefin von Adafruit, nennt sich nach der britischen Mathematikerin Augusta Ada Byron King, Countess of Lovelace. Es gab da mal eine Ausstellung im Heinz Nixdorf MuseumsForum, wo ich zu meinem Staunen auch über Arduinos stolperte.
Als Uhr verwende ich eine DS3231 RTC. Ich Versuch jetzt erst mal hsv werte in RGBW umzurechnen und danach beschäftige ich mich dann wieder mit der Zeit. Wie kann man denn die Zeit in Minuten abfragen? Ich dachte die laufen nur von 0 bis 60? Oder muss ich dann die Stunden mit abfragen und wieder in Minuten umrechnen?
Ok Danke kann mir noch jemand sagen in welchem Bereich die Werte bei dem hsi Modell liegen müssen? Versuche das gerade in RGBW werte umzurechnen mit dem grposteten code aber irgendwie kommen da immer negative Zahlen raus und das kann nicht richtig sein
Ok vielen Dank ich glaube jetzt bin ich auf jeden Fall schon mal schlauer geworden. Habe zumindest schon mal ein paar werte herausgefunden die dem sonnenlicht zumindest optisch recht nahe kommen. So ist das auf jeden Fall deutlich leichter als mit RGBW werten zu experimentieren. Jetzt muss ich morgen nur noch sehen das ich die Zeit da mit einbeziehe und dann nimmt das ganze langsam Form an.
Könnte doch noch mal ein Tipp gebrauchen. Kann man irgendwie den dynamischen Speicher vom Arduino erhöhen und wofür nutzt der den? Oder wie kann man sonst den speicherbedarf reduzieren?
Jani007:
Kann man irgendwie den dynamischen Speicher vom Arduino erhöhen und wofür nutzt der den? Oder wie kann man sonst den speicherbedarf reduzieren?
Einen Speicherriegel dazu stecken wie beim PC geht nicht. Aber man kann Konstanten in den Programmspeicher verlagern (PROGMEM) oder im EEPROM ablegen oder externen Speicher wie EEPROM oder SRAM mittels I2C oder SPI anschließen.
Oder man wechselt zu einer anderen Hardware wie z. B. Teensy oder ESP32.
An erster Stelle steht aber geschicktes Programmieren
Na klasse geschicktes programmieren ist ja genau meine Stärke. Andere Hardware ist leider wegen der projektbeschreibung nicht möglich. Dann muss ich mir wohl noch mal ein Kopf machen wie ich das geschickter programmiere. Zumindest habe ich schon mal ein Programm das grundsätzlich funktioniert. Danke für die schnelle Antwort.
Hat noch jemand ein Ansatz für mich wie ich Daten vom Arduino auf ein Nextion Display bekomme und wie ich Daten aus dem Display Auslese? Die Bibliothek scheint zwar zu funktionieren erzeugt aber selbst mit den beispielsketches Fehler ohne Ende. Aus dem Grund würde ich das am liebsten ohne versuchen. Am Rande kann das Display keine fließkommazahlen darstellen oder bin ich da nur zu doof für?
Jani007:
Hat noch jemand ein Ansatz für mich wie ich Daten vom Arduino auf ein Nextion Display bekomme und wie ich Daten aus dem Display Auslese? Die Bibliothek scheint zwar zu funktionieren erzeugt aber selbst mit den beispielsketches Fehler ohne Ende. Aus dem Grund würde ich das am liebsten ohne versuchen. Am Rande kann das Display keine fließkommazahlen darstellen oder bin ich da nur zu doof für?
Die Nextion-Lib ist wirklich grottenschlecht - ohne geht es einfacher.
Es ist aber keine leichte Kost für nebenher, da musst Du Dich richtig einarbeiten.
Hier gibt es ein Tutorial und natürlich die Infos beim Hersteller, z.B. diese.
Floats musst Du als Textfelder darstellen, da das Nextion nur Ganzzahlen kann.
Das der keine kommazahlen kann ist ungünstig wollte mit einem Schieberegler werte zwischen 6 und 7 einstellennaja dann muss ich mir da noch was einfallen lassen.
Erst mal Danke für die schnellen Antworten. Werde mir die links gleich mal durchlesen und das heute Abend noch mal testen.