Verständnisfrage

Hallo Arduino Gemeinde,
bin Neueinsteiger und fasse mich gerade an mit dem Arduino zu befassen.
Er soll hinterher die Steuerunmg einer Kamera mit 3 motorisierten Achsen (Pan/Tilt/Shift) übernehmen. Aber davon bin ich noch weit entfernt…

Aber man arbeitet ja auf sein Ziel hin, und nun habe ich eine Verständnisfrage…

Ich habe 4 Modus vorgesehen in dem die Kamera laufen soll, dieser Modus wird in der Variablen Modus festgehalten (1-4).
Frage ich den nun besser mit einer if/else oder einer switch methode ab? Im Augenblick habe ich es mal per switch versucht, da ich ihn mal ausprobieren wollte. Aber was ist besser? (Abschnitt " Anzeige des gewählten Modus im LCD Display")

Außerdem habe ich einen Teil meines Codes rot markiert, bei dem mir nicht ganz geläufig ist was da genau passiert. Wenn mir jemand etwas helfen könnte meinen Horizont zu erweitern wäre ich sehr dankbar.

/* Libraries */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

/* Display Adresse und Connections setzen */
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Display Adresse: 0x3F

/Servo Objekte zur Steuerung/
Servo ServoX; //Servo Objekt zur Steuerung des X-Achsen Servo´s
Servo ServoY; //Servo Objekt zur Steuerung des Y-Achsen Servo´s
Servo ServoZ; //Servo Objekt zur Steuerung des Z-Achsen Servo´s

/globale Variablen deklarieren/
int Modus;
int Servoarray[3];
int MAX_CMD_LENGTH = 10;
int cmdIndex=0;
char incomingByte;
char cmd[10];
int x=180;
int y=180;
int z=180;

/* setup() läuft einmal */
void setup()
{
Serial.begin(9600);
}
void loop()

/Uberprüfung ob Serielle Daten eingehen und die Auswertung**/
/Ausgabe an Konsole*************/

{ if (incomingByte=Serial.available()>0)
{
char byteIn = Serial.read();
cmd[cmdIndex] = byteIn;

if(byteIn==’\n’){ //was passier im rot markierten Bereich genau
//command finished
cmd[cmdIndex] = ‘\0’;
cmdIndex = 0;

if(strcmp(cmd, “m1”) == 0)
{
Serial.println(“Command received: m1”);
Modus = 1;
Serial.print("Modus wurde umgeschaltet auf ");
Serial.println(Modus);
}
else if (strcmp(cmd, “m2”) == 0)
{
Serial.println(“Command received: m2”);
Modus = 2;
Serial.print("Modus wurde umgeschaltet auf ");
Serial.println(Modus);
}
else if (strcmp(cmd, “m3”) == 0)
{
Serial.println(“Command received: m3”);
Modus = 3;
Serial.print("Modus wurde umgeschaltet auf ");
Serial.println(Modus);
}
else if (strcmp(cmd, “m4”) == 0)
{
Serial.println(“Command received: m4”);
Modus = 4;
Serial.print("Modus wurde umgeschaltet auf ");
Serial.println(Modus);
}
else if (strcmp(cmd, “s”) == 0)
{
Serial.println(“Command received: s”);
Serial.println("Statusausgabe: ");
Serial.print(“Modus=”);
Serial.println(Modus);
Serial.print(“x=”);
Serial.println(x);
Serial.print(“y=”);
Serial.println(y);
Serial.print(“z=”);
Serial.println(z);
}
else
{
Serial.println(“Command received: unknown!”);
}

}else{
if(cmdIndex++ >= MAX_CMD_LENGTH)
{
cmdIndex = 0;
}
}
}

/Anzeige des gewählten Modus im LCD Display**/

switch (Modus)
{
case 0:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Kamera Montage”);
break;
case 1:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Manuell”);
break;
case 2:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Gyroskop”);
break;
case 3:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Flat Panorama”);
break;
case 4:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Round Panorama”);
break;
}
}

Switch ist oft besser und schneller als if/else. Du brauchst aber durch das strcmp() sowieso eine if/else Kette.

Du solltest eher die Auswertung vom Einlesen richtig trennen statt alles in loop() zu schreiben:

void loop()
{
     if(readSerial() == true)
          parseSerial();
}

boolean readSerial()
{
   while(Serial.available()) 
   {
      static byte index;                //die Variable kann lokal sein aber muss dann static sein, damit sie ihren Wert behält

      char c = Serial.read();          //liest ein Byte ein

      if(c >= 32 && index < MAX_CMD_LENGTH - 1)    //falls kein Steuerzeichen und noch Platz im Array
      {
           cmd[index++] = c;        //speichert das Byte ab und inkrementiert danach den Index
      }
      else if(c == '\n')          //wenn Endezeichen (hier Newline/Linefeed) eingelesen
      {      
        cmd[index] = '\0';       //Strings müssen mit einem Null-Terminator abgeschlossen werden
        index = 0;               //Index zurücksetzen
        return true;                 //loop() melden, dass der String fertig eingelesen wurde
      }
   }

   return false;
}

void parseSerial()
{
     if(strcmp(cmd, "m1")  == 0)
     {
     }

     ....
}

Dann ist das wesentlich übersichtlicher

Noch was:
Mach überall wo du lcd.print() und Serial.print() mit String-Literalen verwendest ein F() um den String:

Serial.println(F("String im Flash"));

Dann bleibt der String im Flash und verschwendet kein RAM. Geht aber nur mit print()/println()

Danke Serenifly für deine Hilfe. Habe deine Verbesserungen eingepflegt und es funktioniert Super XD