Hallo,
ich versuche grad Farbwerte von einem Array zu holen und diese dann zu übergeben. Ziel ist es per Kapazitiven Taster das Array durchzuschalten um per Tastendruck die Farbe zu wechseln. Leider funktioniert es nicht und ich erkenne mein Problem nicht. Nur wenn ich den Wert aus dem Array direkt dahinter schreiben geht es. Er meckert das mein Color_Array kein Member von CRGB:: ist, was mir zwar einleuchtet aber ich nicht verstehe wie ich es lösen kann. Wenn ich CRGB::White; schreibe geht es.
Hier mein Code (ist nur ein Beispiel zum testen von mir):
[/#include "FastLED.h"
#include <CapacitiveSensor.h>
#define DATA_PIN 5
#define NUM_LEDS 4
#define CHIPSET WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
byte index=0;
char Color_Array[10]={'White', 'Blue', 'Green', 'Yellow', 'Red', 'Maroon', 'Aqua', 'DarkCyan', 'SkyBlue', 'DarkRed'};
CapacitiveSensor Front_Touch = CapacitiveSensor(22,37);
#define SCHALTPLUSHYST 50 // Hysterese +
#define SCHALTMINUSHYST 50 // Hysterese -
void setup() {
FastLED.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
Front_Touch.set_CS_Timeout_Millis(200);
}
void loop() {
Change_Color();
leds[0]=CRGB::Color_Array[index];
leds[1]=CRGB::Color_Array[index];
leds[2]=CRGB::Color_Array[index];
leds[3]=CRGB::Color_Array[index];
FastLED.show();
}
Wo liegt mein Denkfehler in der Benutzung vom Array?
boolean State_Front(byte Front)
{
static boolean touchDown=false;
boolean currentTouch;
if (touchDown) {
if (Front == 0)
currentTouch=(Front_Touch.capacitiveSensor(50)>SCHALTMINUSHYST);
}
else {
if (Front == 0)
currentTouch=(Front_Touch.capacitiveSensor(50)>SCHALTPLUSHYST);
}
if (currentTouch && !touchDown)
touchDown=true;
else if (!currentTouch && touchDown)
touchDown=false;
return touchDown;
}
void Change_Color() {
if (State_Front(0) == true) {
index++;
delay(1000);
if (index > 10)
index = 0;
}
}
code]
Ich vermute mal, daß
char Color_Array[10]={'White', 'Blue', 'Green', 'Yellow', 'Red', 'Maroon', 'Aqua', 'DarkCyan', 'SkyBlue', 'DarkRed'};
bestenfalls die ersten 10 Zeichen erhält, oder noch was viel Schlimmeres.
Ich würde mal probieren
CRGB Color_Array[10] = (CRGB::White, <usw.>);
Die Namen der Farben stehen stellvertretend für 3 Bytes - also einen 24Bit Farbwert (z.B. White = 0xFFFFFF) - ich würde dafür auch ein CRGB Array vorschlagen.
Alternativ kannst Du Deine Farbliste in einer Farbpalette speichern. Siehe dazu das ColorPalette Beispiel.
Hätte den Vorteil, dass Du zwischen den Farben weich überblenden kannst.
Gruß,
Helmuth
Hallo ihr zwei,
danke für die Tipps. Es funktioniert. Kann mir aber jemand erklären wieso es so funktioniert und nicht so wie ich es gedacht habe? Möchte gerne dazu lernen. 
Was du das hattest ist semantischer und syntaktischer Blödsinn
Diese Namen sind irgendwelche symbolischen Konstanten (enums glaube ich, aber es ist egal). Keine Strings!
Selbst wenn, dann ist ein String selbst schon ein char Array. Arrays aus Strings sind entweder zwei-dimensionale Arrays oder Arrays aus Zeigern auf char. Außerdem werden Strings in doppelten Anführungszeichen geschrieben. Einfache Anführungszeichen sind ein einzelner char, auch wenn es dir der Compiler leider durchgehen lässt.
Hallo,
versuche hier immer noch zu lernen. Irgendwie muss ich mir das mit Array nochmal besser ansehen. "Was du das hattest ist semantischer und syntaktischer Blödsinn" trifft wohl ganz genau zu :-[
Habe folgendes Problem. Ziel soll es sein 2 Farbpaletten zu benutzen. Ich würde gerne, wenn Display == 0 gesetzt ist das der Regenbogen durchläuft, was er ja auch schon macht. Wenn Display == 1 ist, soll er die Mono Palette verwenden, jedoch möchte ich nicht das er dann die Farben automatisch wechselt, sondern möchte ich Ihm sagen welche Farbe er aus der Palette anzeigen soll. Wie kann ich das lösen?
#include <FastLED.h>
#define LED_PIN 5
#define NUM_LEDS 60
#define BRIGHTNESS 64
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
byte Display = 0;
CRGB leds[NUM_LEDS];
CRGBPalette16 currentPalette;
TBlendType currentBlending;
extern CRGBPalette16 MonoColors;
extern const TProgmemPalette16 MonoColors_p PROGMEM;
void setup() {
delay( 3000 ); // power-up safety delay
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
}
void loop()
{
Color();
static uint8_t startIndex = 0;
startIndex = startIndex + 1; /* motion speed */
FillLEDsFromPaletteColors( startIndex);
FastLED.show();
}
void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
for( int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette( currentPalette, colorIndex, BRIGHTNESS, currentBlending);
colorIndex += 3;
}
}
const TProgmemPalette16 MonoColors_p PROGMEM =
{
CRGB::Red,
CRGB::Gray,
CRGB::Blue,
CRGB::Yellow,
CRGB::Yellow,
CRGB::Blue,
CRGB::Gray,
CRGB::Red,
CRGB::Red,
CRGB::Gray,
CRGB::Blue,
CRGB::Yellow,
CRGB::Yellow,
CRGB::Blue,
CRGB::Gray,
CRGB::Red
};
void Color() {
if (Display == 0){
currentPalette = RainbowColors_p;
} else {
currentPalette = MonoColors_p;
}
currentBlending = BLEND;
}
Die jeweils aktuelle Palette läuft durch, weil Du den Farbindex kontinuierlich hochzählst.
startIndex = startIndex + 1;
Stattdessen kannst Du den Index einfach fix festlegen = kein Farbdurchlauf. Also z.B.
startIndex = 23;
Wenn nur der Regenbogen durchlaufen soll und die Monopalette statisch sein soll, inkrementierst Du den Index nur, wenn die Regenbogen Palette aktiv ist. Also
if (currentPalette == RainbowColors_p) {startIndex = startIndex + 1;}
Hi,
ok, das schaue ich mir mal an. Aber was ich noch nicht verstehe ist ich dachte es wäre wie ein Array. Also der erste Wert würde ich mit [0] aufrufen, den 2ten mit [1] etc. Aber wie funktioniert das mit den 0...255?
Also ich meine wenn ich Index = 2 Schreibe nimmt er dann die 2te Farbe in der Palette?
Also ich meine wenn ich Index = 2 Schreibe nimmt er dann die 2te Farbe in der Palette?
Jein. Wenn Du eine Palette mit 16 Farben und aktiviertem Blending hast, stehen die reinen Farben an den Positionen 0, 15, 31, ...
Dazwischen stehen die Mischwerte der nächstliegenden reinen Farben.
Der Index ist ein uint8_t - also ein implizit gecastetes Byte ohne Vorzeichen. Das bedeutet, wenn der zulässige Wertebereich (0-255) nach oben oder unten überläuft, geht es automatisch am anderen Ende weiter.
Z.B. 255+3=2 oder 3-5=254
Beschäftige Dich mal mit den grundlegenden Datentypen - damit bekommst Du es immer wieder zu tun.