Fast LED CRGB::Variabel

Hallo,

ich versuche gerade LEDs per Bluetooth zu steuern und stoße bei folgendem Code-Teil auf das Problem das ich die Farbe nicht variabel gesteuert bekomme:

...
for (int i = 0; i < NUM_LEDS; i++)
    leds[i] = CRGB::Blue; //Die Farbe soll per Bluetooth übermittelt werden
    FastLED.show();
    delay(30);

Ist es möglich die Farbe, in diesem Fall Blue, durch eine Variable zu ersetzen? Ich erhalte immer nur folgende Fehlermeldung:

‘Farbe’ is not a member of ‘CRGB’

Schon mal vielen Dank für eure Hilfe.

Schönen Gruß

Marcus

Hi

Naja - da in dem Snipped nirgends das Wörtchen 'Farbe' auftaucht, sehe ich nicht, wo die Fehlermeldung her kommen sollte.

Denke, Du setzt die Variable 'Farbe' (wohl 32 Bit) auf irgend einen Wert und versuchst dann
leds = CRGB::Farbe;
Da die Farbe 'Farbe' aber nicht definiert ist, schlägt Das fehl.
Warum nicht stur
leds*=Farbe; //??*
Allerdings muß sich in 'Farbe' dann die Gruppen für R,G,B in der richtigen Reihenfolge und an richtiger Stelle befinden.
Ggf. ist auch noch ein Weiß mit drin (dann braucht's sogar die 32 Bit, sonst reichen 24).
MfG

Schon mal vielen Dank für die Antwort. Ich habe gehofft ich übertrag einfach über das Handy z.B. “Blue” und die LEDs leuchten Blau.
Hier mal mein ganzes Script vielleicht fällt euch ja noch was auf. Bitte verzeiht ggf. Fehler aber ich bin noch blutiger Anfänger :o

#include <String.h>
#include <FastLED.h>

#define LED_PIN     2
#define COLOR_ORDER GRB
#define CHIPSET     WS2812
#define NUM_LEDS    2

#define BRIGHTNESS  200
#define FRAMES_PER_SECOND 60

bool gReverseDirection = false;
CRGB leds[NUM_LEDS];

int Port = 0;
char Farbe[16];

const byte numChars = 32;
char receivedChars[numChars];   // an array to store the received data

boolean newData = false;

void setup() {
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
FastLED.addLeds<CHIPSET, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}

void loop() {
 
   recvWithEndMarker();
   showNewData();
}

void recvWithEndMarker() {
    static byte ndx = 0;
    char endMarker = '#';
    char rc;
    
    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (rc != endMarker) {
            receivedChars[ndx] = rc;
            ndx++;
            if (ndx >= numChars) {
                ndx = numChars - 1;
            }
        }
        else {
            receivedChars[ndx] = '\0'; // terminate the string
            ndx = 0;
            newData = true;
        }
    }
}

void showNewData() {
    if (newData == true) {

       sscanf(receivedChars, "%d,%s", &Port,Farbe);
        Serial.print("Port ");
        Serial.println(Port); 

        Serial.println("Farbe");
        Serial.println(Farbe);
   //rot

  for (int i = 0; i < NUM_LEDS; i++)
    leds[i] = CRGB::Farbe;    // Hier liegt mein Problem!
    FastLED.show();
    delay(30);

        newData = false;
 }

    
    }

So sieht CRGB aus:
https://github.com/FastLED/FastLED/blob/master/pixeltypes.h
Zeile 102ff

Ist da irgendein "Farbe" drin? Nein. Wieso soll das also gehen?

Farbe ist bei der erst mal ein C String. Aber anscheinend nur als Text. CRGB kann ein Objekt entweder aus 3 getrennten RGB Werten oder aus einem 32/24-Bit Wert erzeugen. Dann musst du deine Eingabe entsprechend machen oder bearbeiten. Am besten direkt die passenden Zahlen übertragen. Und nicht "blau" oder "rot" als Text

In der Pixel reference findest Du auch die "Predefined colors list". Du könntest also auch "GreenYellow" übertragen. Werte wie 0xADFF2F oder die drei Farben einzeln dürfte einfacher sein. Das hängt dann von Deiner Händy-App ab.

Hallo, vielen Dank für eure Hilfe. Dadurch bin ich jetzt schon ein wenig weiter gekommen.

Hier mein Code den ich bisher entwickelt habe:

#include "FastLED.h"
#define LED_PIN     2
#define COLOR_ORDER GRB
#define CHIPSET     WS2812
#define NUM_LEDS    2

#define BRIGHTNESS  200
#define FRAMES_PER_SECOND 60
  CRGB leds[NUM_LEDS];
bool gReverseDirection = false;


int Port;
int r,g,b;
//char Farbe[16];
    byte j;
   char buf[25];  
  char* ptr = buf;

  
const byte numChars = 32;
char receivedChars[numChars];   // an array to store the received data

boolean newData = false;

void setup() {
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
FastLED.addLeds<CHIPSET, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}

void loop() {

 
 if (Serial.available())
  {
    buf[j] = Serial.read();
    j++;
      }
  if (buf[j-1]=='#')
  {
    FastLED.clear();
    j=0;
            sscanf(ptr, "%d,%d,%d,%d", &Port, &r, &g, &b);
          for (int i = 0; i < NUM_LEDS; i++)
    leds[i] = CRGB ( r, g, b);
    FastLED.show();
    delay(30);  
   
    }   
    
    
}

Ich habe aber noch ein Problem welches ich mir nicht erklären kann. Ich übergebe per Bluetooth die Farbparameter (Hierzu habe ich mit MIT appinventor ein kleines Programm erstellt) aber die Farbe der LED ändert sich nicht. Reboote ich allerdings den Arduino (Uno) erleuchtet die LED in der ausgewählten Farbe. Das kann ich mir nicht erklären und möchte euch bitten mal zu gucken ob mein Code das Problem ist oder die App zur Übertragung.

Besten Dank
Marcus

(deleted)

:o Ja, mit Kommentaren stehe ich schon immer auf Kriegsfuß, versuche mich zu bessern.

Reboot?

Ein Reset hätte ich schon Mal live miterlebt - ein Reboot wäre mir auf den µC nicht bekannt.
Ein Reset würde aber kein Sinn ergeben, da Damit der Arduino komplett jungfräulich von Vorne anfängt, Da ist Nichts mehr mit 'Informationen aus einer anderen Zeit' - und EEprom sehe ich derzeit auch nicht im Gebrauch.

MfG

(deleted)

In der IDE +t formatiert in leserlicher Form und Leerzeilen sollten sparsam eingesetzt werden.

Das Programm aus #5 funktioniert übrigens bei mir, ganz ohne Reset. Die Verbindung zum MIT appinventor erschließt sich mir allerdings nicht.

So, ich habe mal versucht den Code ein wenig aufzuräumen und Kommentare hinzugefügt.

#include "FastLED.h"
#define LED_PIN     2
#define COLOR_ORDER GRB
#define CHIPSET     WS2812
#define NUM_LEDS    2

#define BRIGHTNESS  200
#define FRAMES_PER_SECOND 60
CRGB leds[NUM_LEDS];


int Port; //Mehrer WS2812 Stränge auf verschiedenen Ausgängen
int r,g,b;  //Farben (RGB)

  byte j;
  char buf[25];  
  char* ptr = buf; // an array to store the received data

void setup() {
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
    FastLED.addLeds<CHIPSET, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
}

void loop() {
 if (Serial.available())
  {
    buf[j] = Serial.read();
    j++;
      }
  if (buf[j-1]=='#')
  {
    FastLED.clear();
    j=0;
      sscanf(ptr, "%d,%d,%d,%d", &Port, &r, &g, &b);// Liest den String aus und übergibt an die LESs
      for (int i = 0; i < NUM_LEDS; i++) 
      leds[i] = CRGB ( r, g, b); //RGB aus Bluetoothübergabe
      FastLED.show(); 
      delay(30);  
} 
}

Ich habe auch mal den String für die Farbauswahl per Bluetooth Terminal übertragen. Hier wird die Farbe sofort gewechselt. Scheint wohl doch an der App zu liegen.

Auf jeden Fall vielen Dank für eure Hilfe

Gruß
Marcus

(deleted)

Da fehlt die Terminierung des Strings wenn das Einlesen fertig ist

So, habe das Problem mit folgendem Code gelöst, nicht sehr elegant aber es funktioniert.

void reboot() {
  wdt_disable();
  wdt_enable(WDTO_15MS);
  while (1) {}
}

Gruß
Marcus

Hi

Bis auf das disable() sieht’s doch ganz manierlich aus.
Selber lasse ich in meinen 8Sekunden WDT-Zeit einen Error-Code vorblinken, damit ich weiß, WER den Reset wollte (bei mir drei mögliche Quellen).

MfG