Verständnisfrage


hallo arduino gemeinde,
bin neueinsteiger und fasse mich gerade 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 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 da genau passiert. wenn mir jemand etwas helfen könnte meinen horizont zu erweitern wäre ich sehr dankbar.

quote

/* 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 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:
code: [select]

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:
code: [select]

serial.println(f("string im flash"));

dann bleibt der string im flash und verschwendet kein ram. geht aber nur mit print()/println()


Arduino Forum > International > Deutsch (Moderator: uwefed) > Verständnisfrage


arduino

Comments

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

TypeError: <unknown> is not a numpy array - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support