FastLED Library - wie lese ich die RGB Variablen (0-255) aus ?

Hallo Leute,
Ich bin relativ neu im Umgang mit dem Arduino und C und habe folgendes Problem:

Ich habe eine einzelne RGB LED, wo ich mir die Farbe über einen dreh-Encoder einstelle, was auch schon so funktioniert.

Jetzt mein Problem:

Die FastLED library, welche ich benutze ist so einfach, dass man im Grunde nur das Beispiel “AnalogOutput” kopieren muss, die Variablen kurz umbenennt und schon funktioniert das ganze.

Allerdings möchte ich mit den am Ausgang ankommenden Werten (R,G & B (0-255)) weiterarbeiten, kann diese jedoch nicht auslesen, weil ich nicht weiß, wie diese Variable genau heißt.

also wenn ich den Befehl gebe “Serial.print ()”, welche Variable muss ich auswählen, um zb die Variable von Rot zu bekommen?

Ganz unten im Code ist die Stelle zu finden, an der ich nicht weiterkomme.

PS:
Ich habe den Code zum besseren Verständnis kommentiert.

Danke schon mal für eure Hilfe :slight_smile:

#include <HSBColor.h>
#include <FastLED.h>


#define REDPIN   9
#define GREENPIN 10
#define BLUEPIN  11

// Initialisierung benötigter Variablen
int Counter = 0; 
boolean Richtung;
int Pin_clk_Letzter;  
int Pin_clk_Aktuell;
 
// Definition der Eingangs-Pins
int pin_clk = 3;  
int pin_dt = 4; 
int button_pin = 5;

// Initialisierung für HSB RGB
int sattigung = 255;
int helligkeit = 255;
  
  
void setup() 
{ 

//------------------------- DREH ENCODER-------------------------
   // Eingangs-Pins werden initialisiert...
   pinMode (pin_clk,INPUT);
   pinMode (pin_dt,INPUT);
   pinMode (button_pin,INPUT);
    
   // ...und deren Pull-Up Widerstände aktiviert
   digitalWrite(pin_clk, true);
   digitalWrite(pin_dt, true);
   digitalWrite(button_pin, true);
    
   // Initiales Auslesen des Pin_CLK
   Pin_clk_Letzter = digitalRead(pin_clk);   
   Serial.begin (250000);


//-------------------------RGB LED FastLED--------------
  // RGB LED PINS
  pinMode(REDPIN,   OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN,  OUTPUT);


 } 
 
// Das Programm überprüft, falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden
// Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt.
// Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen
// Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht.
// Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben.
// Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position.

 
//---------------RGB LED -- FastLED library-----------------

void showAnalogRGB( const CRGB& rgb)
{
  analogWrite(REDPIN,   rgb.r );    


 // hier hatte ich schon versucht die Variable rgb.r zu printen, das hat aber leider nicht geklappt, weil der compiler dann meckert, dass rgb.r nicht deklariert wurde (ich nehme an, dass die variable nur in der library erkannt wird, nicht im programm selber)


  analogWrite(GREENPIN, rgb.g );
  analogWrite(BLUEPIN,  rgb.b );
}



void loop()
{ 

//--------------- drehencoder------------------

   // Auslesen des aktuellen Statuses  
   Pin_clk_Aktuell = digitalRead(pin_clk);

       if (Counter > 255)
   {
    Counter = 0;   
   }
   if (Counter < 0)
   {
    Counter = 255;
   }
   
   // Überprüfung auf Änderung
   if (Pin_clk_Aktuell != Pin_clk_Letzter)
   { 
          
        if (digitalRead(pin_dt) != Pin_clk_Aktuell) 
        {  
            // Pin_CLK hat sich zuerst verändert
            Counter ++;
            Counter ++;
            Counter ++;
            Richtung = true;
        } 
          
        else
        {       // Andernfalls hat sich Pin_DT zuerst verändert
            Richtung = false;
            Counter--;
            Counter--;
            Counter --;
        }
        Serial.println ("Drehung erkannt: ");
        Serial.print ("Drehrichtung: ");
         
        if (Richtung)
        {
           Serial.println ("Im Uhrzeigersinn");
        }
        else
        {
           Serial.println("Gegen den Uhrzeigersinn");
        }
         
        Serial.print("Aktuelle Position: ");
        Serial.println(Counter);
        Serial.println("------------------------------");
          
   } 
    
   // Vorbereitung für den nächsten Durchlauf:
   // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert
   Pin_clk_Letzter = Pin_clk_Aktuell;
    
   // Reset-Funktion um aktuelle Position zu speichern
   if (!digitalRead(button_pin) && Counter!=2)
     {
       Counter = 2;
       Serial.println("Position resettet");
     }

//-------------Fast LED-----------
// hier wird der HSV (HSB) Farbwert in einen RGB Farbwert umgewandelt und dann an die drei Ausgangspins weitergeleitet 


  // Use FastLED automatic HSV->RGB conversion
  showAnalogRGB( CHSV( Counter, sattigung, helligkeit) );
  
  //delay(20);


Serial.print (???)  // hier weiß ich nicht, welche variable den wert für beispielsweise rot (0-255) hat



 }

Stevuino:
Die FastLED library, welche ich benutze ist so einfach, dass man im Grunde nur das Beispiel “AnalogOutput” kopieren muss, die Variablen kurz umbenennt und schon funktioniert das ganze.

also wenn ich den Befehl gebe “Serial.print ()”, welche Variable muss ich auswählen, um zb die Variable von Rot zu bekommen?

Zum Testen habe ich das Beispiel “AnalogOutput” um eine Ausgabe erweitert:

#include <FastLED.h>

#define REDPIN   5
#define GREENPIN 6
#define BLUEPIN  3

void showAnalogRGB( const CRGB& rgb)
{
  analogWrite(REDPIN,   rgb.r );
  analogWrite(GREENPIN, rgb.g );
  analogWrite(BLUEPIN,  rgb.b );
  byte a = rgb.r;
  Serial.print("rgb.r: ");
  Serial.print(a);
  a = rgb.g;
  Serial.print("\trgb.g: ");
  Serial.print(a);
  a = rgb.b;
  Serial.print("\trgb.b: ");
  Serial.println(a);
}

void loop()
{
  static uint8_t hue;
  hue = hue + 1;
  // Use FastLED automatic HSV->RGB conversion
  showAnalogRGB( CHSV( hue, 255, 255) );

  delay(20);
}


void setup() {
  Serial.begin (9600);
  Serial.println ("\nAnfang");
  pinMode(REDPIN,   OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN,  OUTPUT);
}

Die gesuchten Werte sind also in rgb.r, rgb.g und rgb.b enthalten. Oder habe ich was mißverstanden?

hab mir deinen part mit dem byte a = rgb.r mal kopiert und jetzt funktioniert es, wow vielen dank!!

allerdings frag ich mich dann, woran es lag?
ich hatte es nicht im gleichen void und der compiler hat mir gesagt rgb.r ist keine deklarierte variable...
also lag es daran, dass ich es nicht im gleichen void hatte, oder eher wegen dem byte? und muss man das mit dem byte so machen oder reicht auch ein int dafür?

auf jeden Fall danke für die schnelle Hilfe!! :slight_smile:

Stevuino:
auf jeden Fall danke für die schnelle Hilfe!! :slight_smile:

Bitte gerne!

Du beschreibst es falsch, meinst aber das Richtige. Es gibt globale und lokale Variablen. Wenn eine lokale Variable nur innerhalb einer Funktion gültig ist, dann kannst Du sie nicht außerhalb verwenden. Die Fehlermeldung deutet in diese Richtung.

Eine Funktion hat einen Rückgabewert, bei int showAnalogRGB() hätte er den Typ int, bei long showAnalogRGB() den Typ long. Bei void gibt es nichts zurück.

Stevuino:
ich hatte es nicht im gleichen void

Es gibt keine voids! Die Dinger heißen Funktionen und void ist ein Datentyp

Der Funktion wird als Parameter eine Referenz auf ein CRGB Objekt übergeben. Damit ist das natürlich nur innerhalb der Funktion bekannt