Umwandlung Analog zu RGB

Hallo Freunde,
ich bin gerade mit einem WS2812B am experimentieren. Mir ist eine Idee gekommen, bei der ich aber die Umsetzung gedanklich nicht hinbekomme. Ich würde gerne ein Poti (Analogwerte 0-1023) als Eingabe nutzen wollen, um in das komplette Farbspektrum (RGB) umzusetzen.
Allein der Ansatz dazu fehlt mir. Habt ihr Ideen dazu?
Danke sehr für Anregungen

3 Potis wären da besser

Und dann:
https://www.arduino.cc/reference/de/language/functions/math/map/

Ich kenne map.
Ist nicht meine Frage.

Nun - mit einem Poti alleine kann das nix werden.
Das bietet genau einen Freiheitsgrad zum Regeln.
Im Farbraum brauchst Du aber derer drei - RGB (oder aber Farbton, Sättigung und Helligkeit).

Also wirst Du mindestens noch eine Taste brauchen, um Dein Poti einer der zu verstellenden Größen zuzuordnen. Luxus ist dann schon eine Anzeige (eine der LEDs?) dafür, worauf das Poti gerade wirkt.

WS2812 kann mehr als 1024 Farben darstellen, das paßt also rein rechnerisch schon nicht zusammen.

Anstelle Poti ginge Drehencoder. Mit einem würde ich das aber bei den vielen Farben nicht machen wollen :stuck_out_tongue_closed_eyes:

Das ist natürlich falsch :wink: .

Selbstverständlich kannst Du mit einem Poti eine von 1024 Farben (bei gleicher Helligkeit) auswählen. Ins Blaue- weder kompiliert noch getestet:

unsigned long tempValue = map(analogRead(A0), 0, 1023, 0, 16777216UL) ;
byte red   = (tempValue & 0xFF0000UL) >> 16 ;
byte green = (tempValue & 0xFF00UL) >> 8 ;
byte blue  = tempValue & 0xFFUL;

Allerdings verschenkst Du dabei einen gewissen Teil (genauer: 99,9939%) der möglichen einstellbaren Farbwerte. Ob das Sinn ergibt, kannst nur Du beurteilen.

10 Bit vom ADC kann man umsetzen in 3x3 Bit RGB und 1 Bit Helligkeit. Aber bis man da die Farbe hingefummelt hat, die man gerne haben möchte...

Ich nehme mal die Variable der Helligkeit raus. Die soll immer 100% sein.

Dann kannst Du sowas wie RGB343 machen (grün kriegt ein Bit mehr - analog zum weit verbreiteten RGB565). Wenn das Poti links am Anschlag ist - LED aus, rechts = weiß.

Die nötige Bit-Pfriemelei halte ich für beherrschbar; wie genau hängt davon ab, welchen Wertebereich die einzelnen Farben haben sollen (0...255 oder was anderes?).

Du könntest auch mit dem Poti die Geschwindigkeit der Änderung der Farbe einstellen,
ganz links sehr schnell rückwärts, mittig keine Bewegung, ganz rechts schnell forwärts.

Bewegen würde ich dabei den H Wert einer HSV Darstellung der Farbe.

Mein Ausgangsgedanke war der von einer App zur Steuerung von einer RGB-Lampe. Der Kreis auf dem Display des Handys beschreibt 360°. Jeder Winkelgrad beschreibt dabei eine Mischfarbe. Wenn ich jetzt ein Poti, mit sagen wir 270° Drehwinkel habe, wie setzt man das dann um?
Den Algorithmus gibt es schon. Wie lautet der?

Winkel = (360 / 1024) * gelesener Poti Wert
(falls der Bereich des Potis wirklich ganz benutzt wird).

Es gibt 2 Ansätze:
Die bereits mehrfach vorgeschlagenen und
den anderen den Whandall vorschlägt.

Wenn nicht die Helligkeit sondern nur die Farbe mit dem Poti eingestellt werden soll dann nimm HSV

Mit dem Potentiometer änderst Du den hue (Farbton) Wert.
Von den vom Poti gelesenen 0 -1023 mappst Du auf 0 - 359 um.
saturation (Saettingung) und value (Hellwert) läßt du auf 100%.
So kannst Du mit dem Poti alle Farben (mit einer reduzierten Auflösung) auswählen. Es sind zwar nur 360 Farben wählbar.

Grüße Uwe

Hallo,
schau dir mal die Fast LED lib an und das HSV Farbschema . Damit kannst Du mit einem Wert alle Farbe einstellen

Heinz

Gibt es nicht auf deutsch?
Danke

Hallo
Poste deinen aktuellen Sketch.

Hallo,
aus meiner Bastelkiste etwas angepasst , eventuell reicht das als Einstieg.
Heinz

#include <FastLED.h>
// How many leds in your strip?
const byte numled = 10;
const byte datapin = 3;
CRGB leds[numled];

const byte analogpin(A1);
byte  hu = 0;
byte br = 255;
byte sa = 255;
uint32_t altzeit;
uint16_t spannung;

void setup() {
  // put your setup code here, to run once:
  FastLED.addLeds<WS2812B, datapin , GRB>(leds, numled);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (millis() - altzeit >= 100) {    // mach das nur alle 100 ms
    altzeit = millis();
    //hu++; 
    spannung =analogRead(A1);       // Poti einlesen
    hu=map(spannung,0,1023,0,255);  // auf 255 normieren
    Serial.println(hu);
    for ( byte i = 0; i < numled; i++) { // farbe an LED geben
      leds[i] = CHSV(hu, sa, br);
    }
    FastLED.show();// aktualisieren
  }
}

Schau ich mir an. Komme aber erst nächste Woche dazu.
Vielen Dank bis hierher

An sowas bin ich gerade dran, nur nicht mit App, sondern mit HTML und drei Schiebereglern für Farbe, Helligkeit und Intensität.

Beschäftige Dich zuerst mit Farbräumen, beispielsweise mit dem HSV-Farbraum. WS2812 kann 256x256x256 Farben darstellen, mit einem Poti wird das nichts.

FastLED stellt in HSV die 360 Grad mit 0 bis 255 dar.

naja, es geht schon. Die Frage ist, welche Anwendung?
Vorausgesetzt, Helligkeit ist konstant:

In einer Tabelle die RBG-Werte eines Regenbogenverlaufs abbilden. Falls Weiß auch gewünscht wird, am Ende einen Übergang nach Weiß mit einarbeiten.
Entweder gleich mit 1024 Zeilen, oder, um Speicherplatz zu sparen, weniger (128?) und dazwischen interpolieren. Dann kann mit dem Poti-Wert die Zeile auswählen und damit mit dem Poti sozusagen den Regenbogen durchfahren.

Mit dieser Methode kann man natürlich nur Vollfarben darstellen. "Pastellfarben" mit Weißanteilen gehen damit nicht.

Aber es wäre, wie es der Threadersteller gewünscht hat, die Idee für eine "analog => RBG Umwandlung"

Grüße

Gunther