Sende mir über Bluetooth von einer App einen String z.b. FF6347. Dieser soll als Farbcode für einen RGB-Streifen dienen. Diesen habe ich nun zerlegt für Rot,Grün und Blau (Also Rot = FF, Grün = 63, Blau = 47). Da es sich immer noch um einen String handelt kann ich diese Werte nicht weiter verarbeiten. Der String muss denke ich mal in char, int oder dec gewandelt werden aber wie funktioniert das?
#include <FastLED.h>
#define DATA_PIN 6
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS 37
int BRIGHTNESS = 120;
CRGB leds [NUM_LEDS];
//String data;
//String rot;
//String gruen;
//String blau;
void setup()
{
Serial.begin(9600);
FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); // passt die Farben je nach Chip etwas an
FastLED.setBrightness(BRIGHTNESS);
}
void loop()
{
if (Serial.available())
{
String data = Serial.readString(); //lese Empfangene Daten
Serial.print("Empfangen: ");
Serial.println(data);
String rot = data.substring(0,2); //zerlegen Empfangene Daten von Stelle 0-2
Serial.print("Rot: ");
Serial.println(rot);
String gruen = data.substring(2,4); //zerlege Empfangene Daten von Stelle 2-4
Serial.print ("Grün: ");
Serial.println(gruen);
String blau = data.substring(4,6);
Serial.print("Blau: ");
Serial.println(blau); // String muss in char umgewandelt werden für FastLED
char x = rot.toInt(); // erkennt Buchstaben nicht
Serial.println(x);
}
/* if (Serial.available()) // als char auslesen, liest jedes Zeichen einzeln
{
char data = Serial.read();
Serial.println("Empfangen: ");
Serial.print(data);
}
FastLED.showColor (CRGB (rot, gruen, blau));
*/
}
Hatte ich schon mal und das wieder verworfen, weil ich immer auf das Steuerzeichen ohne feste Länge prüfe.
In dem Fall aber eine Alternative, wenn sichergestellt ist, das das immer als 3x2Byte Hexcode kommt und nichts anderes dazwischen funkt.
Auch dir danke, ist ähnlich zu dem von @combie, das mit der String länge ist immer fest, kann nur verschieden sein je nachdem welche Farbe man ausgewählt hat. Bekomme auch nur eine String wenn ich diesen an der App auslöse.
Denn haben ich gerade getestet, funktioniert soweit aber nur einmal. Sobald ich einen zweite Zeichenkette schicke werden die Werte nicht aktuallisiert.
void loop()
{
if (Serial.available())
{
String data = Serial.readString(); //lese Empfangene Daten
Serial.print("Empfangen: ");
Serial.println(data);
String rot = data.substring(0,2); //zerlegen Empfangene Daten von Stelle 0-2
Serial.print("Rot: ");
Serial.println(rot);
Serial.print("Rot_DEC: ");
Serial.println(strtol(rot.c_str(),0,16));
String gruen = data.substring(2,4); //zerlege Empfangene Daten von Stelle 2-4
Serial.print ("Grün: ");
Serial.println(gruen);
Serial.print("Grün_DEC: ");
Serial.println(strtol(gruen.c_str(),0,16));
String blau = data.substring(4,6);
Serial.print("Blau: ");
Serial.println(blau); // String muss in char umgewandelt werden für FastLED
Serial.print("Blau_DEC: ");
Serial.println(strtol(blau.c_str(),0,16));
FastLED.showColor (CRGB (rot.c_str(), gruen.c_str(), blau.c_str()));
}
Denke / Hoffe ich auch mal, habe die Funktionen jetzt nur mal schnell abgetippt ohne sie wirklich zu verstehen.
Werde sie morgen früh mal genauer anschauen.