Steuerung per Bluetooth

Hallo zusammen.

mein Problem ist es , dass immer nur die erste If-Abfrage unter my.serial.available() abgerufen wird.
Also nur wenn der Empfänger eine 1 empfängt funktioniert alles. Aber wenn eine 2 empfangen wird, passiert nichts. Wenn ich aber die if Abfrage mit der Bedingung für den Wert 2 nach oben schiebe funtkioniert es.
Woran liegt das? Habe ich zu viele If Abfragen?

#include <MobaTools.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13);

const byte LED_LINEAR_HOCH = 8;
const byte LED_LINEAR_RUNTER = 9;
const byte LED_ROTATION_AUSROLLEN = 10;
const byte LED_ROTATION_EINROLLEN = 11;

boolean STOPWERT = false;
boolean ROTATIONSRICHTUNG = false;

enum : byte { WARTEN, STARTEN, LINHOCH, ROTATION, LINRUNTER, STOPPED };

byte motorState = WARTEN;
byte motorStopState = WARTEN;
byte motorSelectState = LED_LINEAR_HOCH;


MoToTimer laufZeit;
long stopZeit = 0;
long linearDauer = 8000;
long rotationDauer = 8000;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mySerial.begin(9600);
  while ( !mySerial);
  pinMode(LED_LINEAR_HOCH, OUTPUT);
  pinMode(LED_LINEAR_RUNTER, OUTPUT);
  pinMode(LED_ROTATION_AUSROLLEN, OUTPUT);
  pinMode(LED_ROTATION_EINROLLEN, OUTPUT);

}

void loop() {

  // put your main code here, to run repeatedly:
  if (mySerial.available()) {
    if ( mySerial.read() == '1' && STOPWERT == false )           // Ganz normaler Ablauf der Schrittkette beim Ausrollen
    {
      ROTATIONSRICHTUNG = false;                               // Um zu entscheiden welcher Motor auf 'HIGH' gesetzt wird. Hier MOTOR 'AUSROLLEN'
      motorState = STARTEN;
    }
    else if ( mySerial.read() == '1' && STOPWERT == true )        // Schrittkette wurde unterbrochen und muss auf den letzten Zustand zurückgesetzt werden
    {
      STOPWERT = false;
      ROTATIONSRICHTUNG = false;                                  // Um zu entscheiden welcher Motor auf 'HIGH' gesetzt wird. Hier MOTOR 'AUSROLLEN'
      motorState = motorStopState;
      digitalWrite(motorSelectState, HIGH );                     //Letzter Motor wird wieder gestartet
      laufZeit.setTime(stopZeit);                                // Neue Laufzeit wird gestartet
    }

    if ( mySerial.read() == '2' && STOPWERT == false )           // Ganz normaler Ablauf der Schrittkette beim Einrollen
    {
      ROTATIONSRICHTUNG = true;                               // Um zu entscheiden welcher Motor auf 'HIGH' gesetzt wird. Hier MOTOR 'EINROLLEN'
      motorState = STARTEN;
    }
    else if ( mySerial.read() == '2' && STOPWERT == true )     // Schrittkette wurde unterbrochen und muss auf den letzten Zustand zurückgesetzt werden
    { // Um zu entscheiden welcher Motor auf 'HIGH' gesetzt wird. Hier MOTOR 'EINROLLEN'
      STOPWERT = false;
      ROTATIONSRICHTUNG = true;
      motorState = motorStopState;
      digitalWrite(motorSelectState, HIGH );                 //Letzter Motor wird wieder gestartet
      laufZeit.setTime(stopZeit);                            // Neue Laufzeit wird gestartet
    }

    if ( mySerial.read() == '3' )               // Stop-Taste wurde gedrückt
    {
      motorStopState = motorState;           // merken des aktuellen Zustands
      motorState = STOPPED;                 // Zustand STOPPED wird aufgerufen
      STOPWERT = true;                      // Es wurde gestoppt
      stopZeit = laufZeit.getTime();        // Restlaufzeit für den Motor
    }
  }

  switch ( motorState ) {
    case WARTEN:
      // auf Kommando warten
      break;

    case STARTEN:
      laufZeit.setTime( linearDauer );
      digitalWrite( LED_LINEAR_HOCH , HIGH ); // Linearmotor starten
      motorSelectState = LED_LINEAR_HOCH;
      motorState = LINHOCH;
      break;

    case LINHOCH:
      if ( laufZeit.expired() ) {
        // Laufzeit Linearmotor abgelaufen
        digitalWrite( LED_LINEAR_HOCH , LOW ); // Linearmotor stoppen
        if ( ROTATIONSRICHTUNG == false )
        {
          digitalWrite( LED_ROTATION_AUSROLLEN , HIGH ); // Rotationsmotor_AUSROLLEN starten
          motorSelectState = LED_ROTATION_AUSROLLEN;
        }
        if ( ROTATIONSRICHTUNG == true)
        {
          digitalWrite( LED_ROTATION_EINROLLEN , HIGH ); // Rotationsmotor_EINROLLEN starten
          motorSelectState = LED_ROTATION_EINROLLEN;
        }
        laufZeit.setTime( rotationDauer );
        motorState = ROTATION;
      }
      break;

    case ROTATION:
      if ( laufZeit.expired() ) {
        // Laufzeit Rotationsrmotor abgelaufen
        digitalWrite( LED_ROTATION_AUSROLLEN , LOW );   // Rotationsmotor_AUSROLLEN stoppen
        digitalWrite( LED_ROTATION_EINROLLEN , LOW );  // Rotationsmotor_EINROLLEN stoppen
        digitalWrite( LED_LINEAR_RUNTER , HIGH );     // Linearmotor abwärtsstarten
        laufZeit.setTime( linearDauer );
        motorSelectState = LED_LINEAR_RUNTER;
        motorState = LINRUNTER;
      }
      break;

    case LINRUNTER:
      if ( laufZeit.expired() ) {
        // Laufzeit Linearmotor abgelaufen
        digitalWrite( LED_LINEAR_RUNTER , LOW ); // Linearmotor stoppen
        motorState = WARTEN;
      }
      break;

    case STOPPED:                           // Stop Tase wurde gedrückt
      digitalWrite(LED_LINEAR_HOCH, LOW);   // Aussschalten aller Antriebe
      digitalWrite(LED_LINEAR_RUNTER, LOW);
      digitalWrite(LED_ROTATION_AUSROLLEN, LOW);
      digitalWrite(LED_ROTATION_EINROLLEN, LOW);
      motorState = WARTEN;

  }
}

read() entfernt ein empfangenes Zeichen aus dem Eingangspuffer. Das darfst du erst mal nur einmal machen, das Ergebnis abspeichern und dann nur diesen abgespeicherten Wert vergleichen. Also nicht ständig read() machen

z.B. wenn du '2' empfängst liest du das ein und vergleichst mit '1'. Danach ist die '2' weg und das nächste read() liefert -1

Du kannst natürlich auch den Workarround versuchen:
1 ENTER,
22 ENTER,
333 ENTER,

Grüße Uwe

Serenifly:
read() entfernt ein empfangenes Zeichen aus dem Eingangspuffer. Das darfst du erst mal nur einmal machen, das Ergebnis abspeichern und dann nur diesen abgespeicherten Wert vergleichen. Also nicht ständig read() machen

z.B. wenn du '2' empfängst liest du das ein und vergleichst mit '1'. Danach ist die '2' weg und das nächste read() liefert -1

Ja natürlich stimmt. Habe es geändert und es funktioniert.
Vielen Dank

uwefed:
Du kannst natürlich auch den Workarround versuchen:
1 ENTER,
22 ENTER,
333 ENTER,

Grüße Uwe

Was meinst du damit ? Also ständiges senden?

mcfly_:
Was meinst du damit ? Also ständiges senden?

Hallo mcfly_ ,

nein, uwefed meint damit, wenn Du '1' senden möchtest, gibst Du '1' + ENTER ein. wenn Du '2' senden willst, gibst Du '22' + ENTER ein, und wenn Du '3' senden möchtest, gibst Du '333' + Enter ein.
So hätte es dann mit Deinem Code, ohne den Fehler des zu vielen 'mySerial.read...' zu beseitigen , auch funktioniert.
Ist aber sehr unbequem zum eingeben, und auch sehr fehlerträchtig.

LG Stefan

Achso, okay das wäre in der Tat sehr fehlerträchtig.
Aber danke für die Erklärung

Deltaflyer:
Hallo mcfly_ ,

nein, uwefed meint damit, wenn Du '1' senden möchtest, gibst Du '1' + ENTER ein. wenn Du '2' senden willst, gibst Du '22' + ENTER ein, und wenn Du '3' senden möchtest, gibst Du '333' + Enter ein.
So hätte es dann mit Deinem Code, ohne den Fehler des zu vielen 'mySerial.read...' zu beseitigen , auch funktioniert.
Ist aber sehr unbequem zum eingeben, und auch sehr fehlerträchtig.

LG Stefan