[GELÖST] RGB LED Farbwerte in Arrays speichern?

Hallo Ihr Lieben,
ich habe heute versucht, eine simple Steuerung einer RGB LED zu programmieren.
Die Funktion des Codes ist diese:

Mit

char* color[] = {"white","dimwhite","red","blue"};

habe ich die Wörter eingespeichert, um nachher die Arrays mit den Farbwerten aufrufen zu können.
Die Farbwerte habe ich in dem Teil

// Farbwerte
//  color          | red|green|blue
int white[3]      = {255,255,255};
int dimwhite[3]   = {55 ,55 ,55 };
int red[3]        = {100,0  ,0  };
int blue[3]       = {0  ,0  ,100};

hinterlegt.

Meine eigentliche Frage ist nun, ob ich die einzelnen Arrays, in denen ich die Farbwerte hinterlegt habe, wie folgt aufrufen kann:

var_red = color[i][0];
 var_green = color[i][1];
 var_blue = color[i][2];

Dabei soll "i" einfach ein Wert sein, mit dem ich die Arrays nachher auswählen kann.

Ich habe mir vorgestellt, dass das Programm für color[i] den passenden Text aus meinem String einsetzt, und dass zb aus color[0][2] im Programm ein white[2] wird, damit ich so den Wert aufrufen kann.

Leider gibt er mir in der seriellen Übertragung nur komische Werte zwischen 90 und 120 aus.

Hier ist noch einmal der ganze Code:

 /*
  RGB LED Ansteuerung.
 */
 
 
int pin_red = 3; //LED pin 1
int pin_blue = 5; // LED pin 3
int pin_green = 6; // LED pin 4

int var_red = 0;
int var_green = 0;
int var_blue = 0;

int i = 0;

char* color[] = {"white","dimwhite","red","blue"}; 

// Farbwerte
//  color          | red|green|blue
int white[3]      = {255,255,255};
int dimwhite[3]   = {55 ,55 ,55 };
int red[3]        = {100,0  ,0  };
int blue[3]       = {0  ,0  ,100};    


void setup() {                

  
  pinMode(pin_red, OUTPUT); 
  pinMode(pin_green, OUTPUT); 
  pinMode(pin_blue, OUTPUT); 
  Serial.begin(9600);
}



void loop() {
  
  i++;      // i um 1 erhöhen. (Zum Durchschalten der 4 Farben oben.
  
  if (i>3){i = 0;}
 
  var_red = color[i][0];
  var_green = color[i][1];
  var_blue = color[i][2];
  
  //varred = map(varred,0,255,255,0);        //Invertierung der PWM Werte, da es eine Common Anode LED ist.
  //vargreen = map(vargreen,0,255,255,0);
  //varblue = map(varblue,0,255,255,0);
  
  analogWrite(3,var_red);      //Gibt die Werte als PWM aus
  analogWrite(5,var_blue);
  analogWrite(6,var_green);
  
  delay(5000);     // Warte 5 Sekunden          
  
  
  //Serielle Übertragung der Werte zur Überprüfung
  Serial.print("RED");
  Serial.println(var_red);
  Serial.print("GREEN");
  Serial.println(var_green);
  Serial.print("BLUE");
  Serial.println(var_blue);
  Serial.println (color[i]);
  Serial.println("NEW");
}

Lg true_Nic

true_Nic:
Könnt ihr einen Fehler finden?

  1. Fehler: Du postest Beispielcode ohne ihn in code-Tags einzubetten
  2. Fehler: Du gehst davon aus, dass der Code das macht, was Du denkst. Tatsächlich macht er aber das, was Du programmiert hast.

Ich kann an Deinem Code allerdings beim besten Willen nicht erkennen, was Du Dir dabei gedacht hast und was das werden soll, was Du da programmiert hast. Sorry.

jurs:

true_Nic:
Könnt ihr einen Fehler finden?

  1. Fehler: Du postest Beispielcode ohne ihn in code-Tags einzubetten
  2. Fehler: Du gehst davon aus, dass der Code das macht, was Du denkst. Tatsächlich macht er aber das, was Du programmiert hast.

Ich kann an Deinem Code allerdings beim besten Willen nicht erkennen, was Du Dir dabei gedacht hast und was das werden soll, was Du da programmiert hast. Sorry.

Hast du natürlich Recht. :~
Ich habe den Post noch einmal editiert, damit meine Frage hoffentlich verständlicher wird. :cold_sweat:

Wenn du Text haben willst der wie ein numerischer Index wirkt, kannst du entweder #define verwenden oder enum, aber natürlich um Himmels willen keinen String

#define WHITE 0
#define DIMWHITE 1
#define RED 2

color[WHITE] = RGB(255,255,255);  // color muss eine spezielle Klasse sein ...


int i = DIMWHITE;
var_red = color[i].R;
var_green = color[i].G;
var_blue = color[i].B;

Damit print den Datentyp color mit seinem Namen anzeigt, muss man allerdings noch viele Klimmzüge einbauen…

P.S. Peinlich, peinlich. Code -Tags sind wirklich nützlich, wenn man Text in eckigen Klammern hat, wie oben [ WHITE ], sorry

michael_x:
Wenn du Text haben willst der wie ein numerischer Index wirkt, kannst du entweder #define verwenden oder enum, aber natürlich um Himmels willen keinen String

#define WHITE 0
#define DIMWHITE 1
#define RED 2

color = RGB(255,255,255); // color muss eine spezielle Klasse sein …

int i = DIMWHITE;
var_red = color*.R;*
var_green = color*.G;
var_blue = color.B;
Damit print den Datentyp color mit seinem Namen anzeigt, muss man allerdings noch viele Klimmzüge einbauen…
_[/quote]*
Oh ok! Aber ich sehe grad dass ich das meiste vom Code erst hier im Antwortfenster sehe. Nun macht es auch sinn. :slight_smile:
Die Serial.print Funktion habe ich nur als Hilfe eingebaut damit ich die Werte am Rechner überprüfen kann. Werden später nicht mehr gebraucht.
Ich werde mich nochmal an einem Code probieren und ihn dann hier posten. Danke schonmal für die Hilfe! :slight_smile:_

true_Nic:
Ich habe den Post noch einmal editiert, damit meine Frage hoffentlich verständlicher wird. :cold_sweat:

Nicht wirklich.

Ich habe Dir mal zwei Codes gemacht, die vielleicht das machen könnten, was Du möchtest.

Oder auch nicht.

Ansonsten kannst Du Dir wenigstens was im Code abschauen, z.B. mit der Definition von "struct".

Ein Codebeispiel:

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

struct RGB {
  byte r;
  byte g;
  byte b;
};

RGB white={255,255,255};
RGB dimwhite={55,55,55};
RGB red={100,0,0};
RGB blue={0,0,100};

RGB rgbColors[]={white,dimwhite,red,blue};


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

void loop() {
  // put your main code here, to run repeatedly: 
   static int i=0;
  i++;
  if (i>3){i = 0;}
  analogWrite(REDPIN,rgbColors[i].r);
  analogWrite(GREENPIN,rgbColors[i].g);
  analogWrite(BLUEPIN,rgbColors[i].b);
  
  //Serielle Übertragung der Werte
  Serial.print("RED ");
  Serial.println(rgbColors[i].r);
  Serial.print("GREEN ");
  Serial.println(rgbColors[i].g);
  Serial.print("BLUE ");
  Serial.println(rgbColors[i].b);
  Serial.println();
  delay(5000);               
}

Noch ein Codebeispiel:

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

struct scolor{char c[10]; byte r; byte g; byte b;} ;

scolor colors[]={
  {"white", 255,255,255},
  {"dimwhite",55,55,55},
  {"reed",100,0,0},
  {"bluue",0,0,100},
};


// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(REDPIN, OUTPUT); 
  pinMode(GREENPIN, OUTPUT); 
  pinMode(BLUEPIN, OUTPUT); 
  Serial.begin(9600);
  randomSeed(50);
}

// the loop routine runs over and over again forever:
void loop() {
  static int i=0;
  i++;
  if (i>3){i = 0;}
  analogWrite(REDPIN,colors[i].r);
  analogWrite(GREENPIN,colors[i].g);
  analogWrite(BLUEPIN,colors[i].b);
  
  //Serielle Übertragung der Werte
  Serial.print("RED ");
  Serial.println(colors[i].r);
  Serial.print("GREEN ");
  Serial.println(colors[i].g);
  Serial.print("BLUE ");
  Serial.println(colors[i].b);
  Serial.println (colors[i].c);
  Serial.println();
  delay(5000);               
}

Super jurs! Vielen Dank! :slight_smile:
Der Code macht, in gegensatz zu meinem, zumindest das, was ich mit meiner Grundidee verfolgt hatte und ausprobieren wollte. Und zwar einfach RGB Werte zu speichern, die ich dann aufrufen kann. Ich habe die Vairable i benutzt, die ich einfach nachher verändere, jenachdem welche Farbe ich auswählen wollte. Ich musste lediglich noch die Ausgabewerte invertieren, da ich eine Common Anode RGB LED verwende.