LED's mit einem Slider in C# ansprechen

Hallo Zusammen,

ich habe ein Mini-Programm geschrieben in c# um an ein Arduino Uno angeschlossene LED zu kontrollieren.
Bis auf eine Dimmer Funktion mit Hilfe eines Sliders in WPF funktioniert alles.
Ich habe eine WPF Benutzeroberfläche kreiert, die für drücken der buttons oder bewegen des Sliders unterschiedliche Zahlen an den Arduino gibt. Auf dem Arduino habe ich dann verschiedene Fälle erstellt, die für die verschiedenen buttons stehen.
Nun habe ich folgendes Problem:
Für jede Veränderung des Sliders wird die Methode “MeinSlider_left_ValueChanged” aufgerufen. Diese gibt mit “serialPort1.Write(“3”);” zuerst den Fall an, damit der Arduino die richtige Aktion ausführt.
Nun gebe ich den Wert des Slider an den Arduino.
Problem die LED gehen nur von aus oder an und ich erkenne kein wirklichen Zusammenhang vom Wert des Sliders und dem Status der LED.

Im Anhang findet ihr beide Codes. Vielen Dank für jede Hilfe.

Schone Grüße
Tim

LED_TEST.ino (2.47 KB)

Hallo Zusammen,

ich habe ein Mini-Programm geschrieben in c# um an ein Arduino Uno angeschlossene LED zu kontrollieren.
Bis auf eine Dimmer Funktion mit Hilfe eines Sliders in WPF funktioniert alles.
Ich habe eine WPF Benutzeroberfläche kreiert, die für drücken der buttons oder bewegen des Sliders unterschiedliche Zahlen an den Arduino gibt. Auf dem Arduino habe ich dann verschiedene Fälle erstellt, die für die verschiedenen buttons stehen.
Nun habe ich folgendes Problem:
Für jede Veränderung des Sliders wird die Methode “MeinSlider_left_ValueChanged” aufgerufen. Diese gibt mit “serialPort1.Write(“3”);” zuerst den Fall an, damit der Arduino die richtige Aktion ausführt.
Nun gebe ich den Wert des Slider an den Arduino.
Problem die LED gehen nur von aus oder an und ich erkenne kein wirklichen Zusammenhang vom Wert des Sliders und dem Status der LED.

Im Anhang findet ihr den Arduino Code sowie die Slider Methode. Vielen Dank für jede Hilfe.

Schone Grüße
Tim

<#define BaudRate 38400
#define BLUE 6
#define GREEN 5
#define RED 3
int DELAYHOCH = 10;
int DELAYRUNTER = 10;
int FAKTOR = 1;
int MAX = 255;
int MIN= 10;
int BRIFAKT = 1.5;
int WAIT= 0;
char incomingOption;
double brightness =1;
double brightnessSlide = 0;
int LED_State=0;

void setup()
{
pinMode(BLUE, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(RED, OUTPUT);
Serial.begin(BaudRate);
}
void loop()
{
incomingOption = Serial.read();
switch(incomingOption){
case ‘1’:
// Turn ON LED
digitalWrite(BLUE, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(RED, HIGH);
break;
case ‘0’:
// Turn OFF LED
digitalWrite(BLUE, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(RED, LOW);
break;
case ‘2’:
do
{
for (brightness = MINBRIFAKT; brightness < MAXBRIFAKT; brightness ++) {
analogWrite(BLUE, brightness);
analogWrite(GREEN, brightness);
analogWrite(RED, brightness);
if(!Serial.available()){
delay(DELAYHOCHFAKTOR);
}
analogWrite(BLUE, MAX
BRIFAKT);
analogWrite(GREEN, MAXBRIFAKT);
analogWrite(RED, MAX
BRIFAKT);
delay(WAIT);
}
for (brightness = MAXBRIFAKT; brightness > MINBRIFAKT; brightness --) {
analogWrite(BLUE, brightness);
analogWrite(GREEN, brightness);
analogWrite(RED, brightness);
if(!Serial.available()){
delay(DELAYRUNTERFAKTOR);
}
analogWrite(BLUE, MIN
BRIFAKT);
analogWrite(GREEN, MINBRIFAKT);
analogWrite(RED, MIN
BRIFAKT);
delay(1);
}
}while(!Serial.available());
break;
case’3’:
brightnessSlide=Serial.read();
analogWrite(BLUE, brightnessSlide);
analogWrite(GREEN, brightnessSlide);
analogWrite(RED, brightnessSlide);
break;
case’5’:
do {
digitalWrite(BLUE, HIGH);
digitalWrite(GREEN, HIGH);
digitalWrite(RED, HIGH);
delay(1000);
digitalWrite(BLUE, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(RED, LOW);
delay(1000);
}while(!Serial.available());
break;
}
}
/>

c#:
< private void MeinSlider_left_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
try
{
serialPort1.Write(“3”); //send 2 to Arduino
Value_LED_left.Text = MeinSlider_left.Value.ToString();
float umrechnung = 255 / 100;
double value = MeinSlider_left.Value * umrechnung;
serialPort1.Write(value.ToString());

// var slider = sender as Slider;
//double value = slider.Value;
//valG = value.ToString();
//serialTransmit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}/>

Slider_Methode.txt (771 Bytes)

LED_TEST.ino (2.47 KB)

1.) Den Kram mit den while-Schleifen braucht man nicht wenn das richtig gemacht ist. Mach das raus
2.) Mit den ganzen delay() Verzögerungen und for-Schleifen wird das nie richtig funktionieren. Um auf Eingaben immer sofort zu reagieren muss das verzögerungsfrei programmiert werden

Teste das Programm am seriellen Monitor. So kannst du Testen an welchem Ende der Fehler liegt.

Ich hatte mit Slidern und WindowsForms etwas Probleme, dass der Event Handler nicht so ausgelöst hat wie ich wollte (viel zu oft). Vielleicht ist das in WPF besser, aber ich bin dazu übergegangen im Event Handler nur eine Status-Variable zu setzten dass ein Ereignis eingetreten ist. Dann habe ich diese mit einem Timer abgefragt. So hat man regelmäßige Meldungen an den Arduino ob was zu tun ist.

serialPort1.Write(value.ToString());

Du schickst vom PC einen String an den Arduino, aber dieser erwartet ein einziges Byte.

Setze Deinen Code bitte in Codetags (</> oben links), dann ist er für alle lesbar. Als Anhang schauen nur wenige rein.

Gruß Tommy

Welchen Sinn soll es haben, dass Du das Thema 2 Mal hier einstellst?

Gruß Tommy

Welchen Sinn soll es haben, dass Du das Thema 2 Mal hier einstellst?

Gruß Tommy

Hab beide Topics zusammengefaßt.
Grüße Uwe

Hallo zusammen,

das zweimalige Posten war versehentlich. Die while's und for Schleifen im Arduino Programm sind richtig, da bei diesen case's das Programm so lange sich wiederholen soll bis einer neuer Befehl vom PC aus kommt.

Wie sende ich denn nur ein einzigen Byte? Ich kenne leider nur den Befehl serialport.write();

Schöne Grüße

Tim

Die while's und for Schleifen im Arduino Programm sind richtig, da bei diesen case's das Programm so lange sich wiederholen soll bis einer neuer Befehl vom PC aus kommt.

Das ist nicht die saubere Lösung für was du willst. Setze beim Empfang des Kommandos eine Statusvariable für den Modus den die durchführen willst. Auf die kann man dann ständig abfragen. Und praktisch gleichzeitig kann man die serielle Schnittstelle abfragen.

Das mag hier vielleicht so gehen mit den Delays, aber wenn du mal mehrere Aufgaben nebeneinander erledigen willst bekommst du damit massive Probleme

Kleinstein11:
Wie sende ich denn nur ein einzigen Byte? Ich kenne leider nur den Befehl serialport.write();

Hör am besten auf das als "Befehl" zu begreifen. Es ist eine Methode. Und Methoden können überladen werden, das heißt es gibt mehrere Versionen von write() mit unterschiedlichen Parametern. Das ist auf dem Arduino genauso.

Aber write("3") ist schon in Ordnung. Dabei wird nur ein einziges Zeichen gesendet. Wichtig ist aber dass der Slider nur von 0-9 bis geht

Wie sende ich denn nur ein einzigen Byte? Ich kenne leider nur den Befehl serialport.write();

Ich hoffe, Du hast für Dein C# eine Dokumentation, dort sollte sowas stehen. Da Du nur einen Auszug Deines Programms gepostet hast, kann ich nicht einmal die relevante Dokumentation googlen, selbst wenn ich genug Zeit dafür hätte.

pylon:
kann ich nicht einmal die relevante Dokumentation googlen, selbst wenn ich genug Zeit dafür hätte.

Das ist überhaupt kein Problem:

ganz unten bei "Methoden"

Geht nur mit Arrays und Strings. Eine Methode für ein Byte gibt es nicht

Geht nur mit Arrays und Strings. Eine Methode für ein Byte gibt es nicht

Also vorausgesetzt, das ist auch die Klasse, die der OP angewandt hat, so existiert zumindest eine Variante, die einen Byte-Array ausgibt. Er kann also das Byte in ein Array mit einem einzigen Element versorgen und das dann ausgeben. Soweit ich weiss, ist C# doch nur ein umgepinseltes Java, so schwer kann das also nicht sein.

pylon:
Er kann also das Byte in ein Array mit einem einzigen Element versorgen und das dann ausgeben.

Klar. Aber Write() mit "2", "3", etc. sollte auch nur ein einzelnes Zeichen senden. Jedenfalls wenn das Encoding auf ASCII steht, was standardmäßig der Fall ist

Soweit ich weiss, ist C# doch nur ein umgepinseltes Java, so schwer kann das also nicht sein.

Vom Konzept her hat es mal als Java Klon angefangen, aber Design-mäßig gibt es riesige Unterschiede bei vielen grundlegenden Konzepten:

z.B. signed/unsigned Datentypen, Delegates, unmanaged Code, Arrays, Operator Überladung, bestimmte Sonderfälle von Klassen und Methoden, virtuelle Methoden (in Java sind alle Methoden automatisch virtuell. In C# nicht), Referenzen (C# hat ref und out für Referenzen auf elementare Datentypen), Exceptions (Java hat checked exceptions die immer gefangen werden müssen). Generics gibt es in beiden Sprachen sind aber völlig anders implementiert.