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
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 ?
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).
Eine Brücke zwischen C# und Arduino gibt es schon fertig. http://playground.arduino.cc/Code/CmdMessenger3
Direkt am RaspberryPI: https://developer.microsoft.com/en-us/windows/iot/samples/rgbled Per Bluetooth am Arduino: https://microsoft.hackster.io/en-US/windowsiot/basic-windows-remote-arduino-47eeb9?ref=channel&ref_id=4087_trending___&offset=2
@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.
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.
Arduino F. schrieb: > Dann kannst du das mit strtok() und atoi() recht einfach wieder > zerlegen. Du bist einfach zu schnell...
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.