Forum: Mikrocontroller und Digitale Elektronik Arduino/ C# RGB LED Steuerung


von Jannick G. (jannick_g)


Lesenswert?

Hallo liebe Community,
ich bin relativ frisch in der Programmierwelt, also hab ein wenig 
nachsehen falls ich es nicht direkt verstehe.
Ich versuche mit einem C# Programm eine einzelne RGB LED anzusteuern. 
Das C# Programm läuft soweit und übermittelt auch den String an den 
Arduino, aber ich schaffe es nicht diesen zu verarbeiten. Der String 
kann folgendermaßen aussehen „ 255255255“ (RGB), das wäre der String 
damit die LED Weiß leuchtet.
Nun zu meiner Frage wie kann ich diesen String nun am besten 
verarbeiten?
mfg Jannick

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Jannick G. schrieb:
> Nun zu meiner Frage wie kann ich diesen String nun am besten
> verarbeiten?

 Und nun zu meiner Frage:
 Wie sieht der String für reines Rot oder Grün aus ?

von KeK (Gast)


Lesenswert?

Zeig mal dein komplettes Programm her.

von Joachim S. (oyo)


Lesenswert?

Jannick G. schrieb:
> Ich versuche mit einem C# Programm eine einzelne RGB LED anzusteuern.
> Das C# Programm läuft soweit und übermittelt auch den String an den
> Arduino, aber ich schaffe es nicht diesen zu verarbeiten. Der String
> kann folgendermaßen aussehen „ 255255255“ (RGB), das wäre der String
> damit die LED Weiß leuchtet.
> Nun zu meiner Frage wie kann ich diesen String nun am besten
> verarbeiten?

Wenn ich Dich richtig verstehe, dann überträgst Du die RGB-Farbangaben 
also so, dass Du für jeden Farbkanal (also R, G und B) je ein Byte 
vorsiehst, und jedes Byte dann immer als exakt 3 Zeichen überträgst, 
korrekt?
Die Farbe schwarz z.B. würdest Du als "000000000" übertragen?

Das erscheint zwar irgendwie suboptimal, weil Du für einen einzigen 
RGB-Wert dann stolze 9 Zeichen/Bytes übertragen und das ganze dann 
wieder zurückumwandeln musst - aber wenn Du das wirklich so machen 
willst/musst, dann ist es doch ganz einfach:
Du unterteilst den exakt 9 Zeichen langen RGB-Farbangabe-String in drei 
je drei Zeichen lange Strings, die dann dem Byte-Wert der einzelnen 
Farbkanäle entsprechen, und benutzt dann eine Funktion a la 
parse_integer, die einen als String kodierten Integer-Wert in den 
zugehörigen Integer-Wert umwandelt.

Sofern es keinen wirklich guten Grund gibt, die Farbangaben als 
Dezimal-Zahl-Strings zu übertragen, macht es aber vermutlich mehr Sinn, 
sie entweder direkt als Bytes zu übertragen (=3 Byte pro RGB-Wert) oder 
als Hexadezimal-Strings (=6 Zeichen/Bytes pro RGB-Wert, z.B. "FF0000" 
für rot).

von Einer K. (Gast)


Lesenswert?

Eine Brücke zwischen C# und Arduino gibt es schon fertig.
http://playground.arduino.cc/Code/CmdMessenger3

von Wolfgang H. (Gast)


Lesenswert?


von Jannick G. (jannick_g)


Lesenswert?

@Marc:
Rot: 255000000
Grün: 000255000
Blau: 000000255
@Joachim:
Ja da hast du mich richtig verstanden. Und der einzige Grund warum ich 
das dezimal übertrage ist, weil es mir als erstes eingefallen ist. (kann 
auf keine Erfahrungswerte zurückgreifen)
Aber mein Problem ist ich weiß nicht/ ich schaffe es nicht die 
ankommenden Daten ordentlich zu verarbeiten. Das heißt die einzelnen 
Werte zuzuordnen und sowas.

von Einer K. (Gast)


Lesenswert?

Falsches Format!

Tipp: (Vorschlag)
Sende für Rot:
> 255,0,0;
Dann kannst du das mit strtok() und atoi() recht einfach wieder 
zerlegen.
Und es bleibt menschenlesbar.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Arduino F. schrieb:
> Dann kannst du das mit strtok() und atoi() recht einfach wieder
> zerlegen.

 Du bist einfach zu schnell...

von Einer K. (Gast)


Lesenswert?

Danke, für die Blumen!

Jannick G. schrieb:
> 255000000

Mir gefallen solche Zahlenwürste nicht.
Außerdem tappe ich bei sowas immer wieder in die Oktal Falle...
Mittlerweile kenne ich sie, aber beim ersten Mal, da hat es richtig weh 
getan.

von Felix F. (wiesel8)


Lesenswert?

Ich würde nur die 3 Bytes senden, dann können sie direkt als uint8 in 
eine Variable gecastet werden und die Werte stehen ohne große 
Stringconvertierung etc. gleich zur Verfügung.

Als erfahrener Anwender würde man sich natürlich noch ein kleines 
Protokoll überlegen, damit es auch (immer) fehlerfrei funktioniert.

z.B.:

uint8_t rgb[3] = {255, 255, 255};
Serial.Send_Data(rgb, 3);

mfg

: Bearbeitet durch User
von Jannick G. (jannick_g)


Lesenswert?

Arduino F. schrieb:
> Dann kannst du das mit strtok() und atoi() recht einfach wieder
> zerlegen.
Ich habe mir mal die strtok() Methode durchgelesen und finde die recht 
passend. Ich werde diese mal ausprobieren!

Felix F. schrieb:
> Ich würde nur die 3 Bytes senden, dann können sie direkt als uint8 in
> eine Variable gecastet werden und die Werte stehen ohne große
> Stringconvertierung etc. gleich zur Verfügung.
Das hört sich auch nicht schlecht an! Ich probiere beides aus und schaue 
mal was ich praktischer finde.

Und ein dickes Lob an die Community. Ich hätte nicht mit so einer 
schnellen Antwort gerechnet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.