Wie Zahlenbereich aus Serialread filtern, um einen Analogwrite"Wert" zu bekommen

Ich benutze einen Arduino Uno, ein I/O Shield, und einen BlueTooth Modul HC-06.
Als App fürs Handy benutze ich den BlueToothSerialController.
Der Digitalwrite funktioniert gut.
Nun wollte ich den Fader der App nutzen, um auf Pin 6 ein PWM Signal
auszugeben. (es werden Werte zwischen 0 und 255 übertragen)
Während ich bei der Abfrage des Serialread für die Pins 8-13 nur EINEN
Buchstaben berücksichtigen muss, ist es bei dem AnalogWrite ein 3 Digit Wert.

Ich habe meinen Code angehängt.
Da ich Anfänger bin, ist der Code wahrscheinlich irre umständlich.
Er funktioniert aber bis auf den "Faderteil" am Schluss.

Ich würde mich sehr über Tipps freuen, wie man den Code
professioneller aufzieht.

char blueToothVal;           //value sent over via bluetooth
char lastValue;              //stores last state of device (on/off)
int pwmPin = 6;      // LED connected to digital pin 6
int val = 0;         // variable to store the read value


void setup()
{
 Serial.begin(9600); 
 pinMode(13,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(pwmPin, OUTPUT);   // sets the pin as output
}
 
 
void loop()
{

  if(Serial.available())
  {//if there is data being recieved
    blueToothVal=Serial.read(); //read it
  }
  if (blueToothVal=='a')
  {//if value from bluetooth serial is n
    digitalWrite(13,HIGH);            //switch on LED
    if (lastValue!='a')
      Serial.println(F("Kanal 13 is on")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='b')
  {//if value from bluetooth serial is n
    digitalWrite(13,LOW);             //turn off LED
    if (lastValue!='b')
      Serial.println(F("Kanal 13 is off")); //print LED is on
    lastValue=blueToothVal;
  }
   if (blueToothVal=='c')
  {//if value from bluetooth serial is n
    digitalWrite(12,HIGH);            //switch on LED
    if (lastValue!='c')
      Serial.println(F("Kanal 12 is on")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='d')
  {//if value from bluetooth serial is n
    digitalWrite(12,LOW);             //turn off LED
    if (lastValue!='d')
      Serial.println(F("Kanal 12 is off")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='e')
  {//if value from bluetooth serial is n
    digitalWrite(11,HIGH);            //switch on LED
    if (lastValue!='e')
      Serial.println(F("Kanal 11 is on")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='f')
  {//if value from bluetooth serial is n
    digitalWrite(11,LOW);             //turn off LED
    if (lastValue!='f')
      Serial.println(F("Kanal 11 is off")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='g')
  {//if value from bluetooth serial is n
    digitalWrite(10,HIGH);            //switch on LED
    if (lastValue!='g')
      Serial.println(F("Kanal 10 is on")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='h')
  {//if value from bluetooth serial is n
    digitalWrite(10,LOW);             //turn off LED
    if (lastValue!='h')
      Serial.println(F("Kanal 10 is off")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='i')
  {//if value from bluetooth serial is n
    digitalWrite(9,HIGH);            //switch on LED
    if (lastValue!='i')
      Serial.println(F("Kanal 9 is on")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='j')
  {//if value from bluetooth serial is n
    digitalWrite(9,LOW);             //turn off LED
    if (lastValue!='j')
      Serial.println(F("Kanal 9 is off")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='k')
  {//if value from bluetooth serial is n
    digitalWrite(8,HIGH);            //switch on LED
    if (lastValue!='k')
      Serial.println(F("Kanal 8 is on")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal=='l')
  {//if value from bluetooth serial is n
    digitalWrite(8,LOW);             //turn off LED
    if (lastValue!='l')
      Serial.println(F("Kanal 8 is off")); //print LED is on
    lastValue=blueToothVal;
  }
  if (blueToothVal > 0 && blueToothVal<256)
  {
  val = (blueToothVal);
  //if value from bluetooth serial is >0&<256
    analogWrite(6,(val));             //feed Analogwrite with val
  
  //  lastValue=blueToothVal;
  }
  delay(100);
}

Lieben Dank schon mal für Alle Tipps !

Stefan

BT_mit_Fader.ino (3.65 KB)

Wie man Strings einliest und in Zahlen konvertiert habe ich gerade erst wieder mal hier gezeigt:
http://forum.arduino.cc/index.php?topic=311941.msg2162464#msg2162464

Es geht um die readSerial() Funktion. Die liest erst mal alle Zeichen in ein Array ein bis ein Linefeed kommt. Dann weiß man dass man fertig ist und kann was mit dem String machen.

Die Puffergröße kann in dem Fall natürlich kleiner sein. Du hast keine 20 Zeichen.

Die Parse-Funktion da ist für einen Komma-separierten String. Das hast du bei dir nicht. Du würdest eher sowas senden: "w123" (+ Linefeed). Und so ähnlich auswerten:

switch(serialBuffer[0])
{
   case 'w':
     int value = atoi(serialBuffer + 1);
     analogWrite(..., value);
     break;
}

Also das erste Zeichen überprüfen. serialBuffer + 1 ist dann die Zahl dahinter und die wird mit atoi() in einen Integer gewandelt.

Wenn du den Pin noch angeben willst kannst du auch das senden:
"w6,123"

Und z.B. so auswerten:

switch(serialBuffer[0])
{
   case 'w':
     int pin = atoi(strtok(serialBuffer + 1, ","));
     int value = atoi(strtok(NULL, ","));
     analogWrite(pin, value);
     break;
}

Err???
Das heißt, dass die "Zahl" die übermittelt wird, durch den SerialRead bedingt
gar nicht als Zahl (Zahlenwert), sondern als Buchstabe interpretiert wird?

Stefan

Kommt drauf an. Es geht beides. Man kann auch direkt Binärdaten übertragen, aber du hantierst ja auch mit Buchstaben. Das ist ASCII. Und du überträgst da einzelne Ziffern. Also die Zahl "123" sind dann drei ASCII Zeichen. Deshalb liest man das erst mal in ein char Array und konvertiert es dann.

Man kann das auch anders machen und die Ziffern on-the-fly aufaddieren, aber gerade bei deiner Anwendung würde ich dir zu meiner Variante raten. Da ist man nämlich sehr, sehr flexibel. Du willst je nach Kommando verschiedene Sachen machen. Also nimmt man so ähnlich wie du es schon gemacht hast, den ersten Buchstaben als Kommando und je nachdem was das ist kann man dann die Zeichen dahinter unterschiedlich behandeln.