Eigene Funktionen, wie den Code kürzen/optimieren?

hallo alle zusammen,

habe eine frage zur programmierung. in meinem projekt steuere ich 2 servos mit einer infrarotfernbedienung. dazu frage ich mit switch() mehrere tasten ab. jedesmal wird fast der gleiche code ausgeführt, er unterscheidet sich nur in den zahlen und vorzeichen. hier ein ausschnitt:

if (irrecv.decode(&results)) {
    switch (results.value) {
       case 0x20DF40BF:
          digitalWrite(led_pin1, HIGH);
          servoval1 = servoval1+grad;
          myservo1.write(servoval1);
          digitalWrite(led_pin1, LOW);  
          lastcase = 1;
          break;
      case 0x20DFC03F:
          digitalWrite(led_pin1, HIGH);
          servoval1 = servoval1-grad;
          myservo1.write(servoval1);
          digitalWrite(led_pin1, LOW);
          lastcase = 2;
          break;
     case 0x20DF00FF:
          digitalWrite(led_pin2, HIGH);
          servoval2 = servoval2+grad;
          myservo2.write(servoval2);
          digitalWrite(led_pin2, LOW);
          lastcase = 3;
          break;
     case 0x20DF807F:
          digitalWrite(led_pin2, HIGH);
          servoval2 = servoval2-grad;
          myservo2.write(servoval2);
          digitalWrite(led_pin2, LOW);
          lastcase = 4;
          break;
     }
}

ich würde gerne

digitalWrite(led_pin1, HIGH);
          servoval1 = servoval1+grad;
          myservo1.write(servoval1);
          digitalWrite(led_pin1, LOW);

in eine eigene funktion auslagern. es ändert sich ja immer nur servoval1 zu z.b. servoval2 oder das + bei den werten in ein -.

habe so begonnen (und mit dem digitalWrite funktionierts auch schon):

void adjust(char nummer) {
    digitalWrite("led_pin"[nummer], HIGH);
    digitalWrite("led_pin"[nummer], LOW);
}

leider klappt das nicht mit diesem, teil...

servoval1 = servoval1+grad;
myservo1.write(servoval1);

wenn ich "myservo"[nummer].write("servoval"[nummer]); schreibe, kommt folgender fehler: servo_ir.cpp: In function 'void adjust(char)': servo_ir:27: error: request for member 'write' in '"myservo"[((int)nummer)]', which is of non-class type 'const char'.

meine funktion möchte ich so aufrufen: adjust(1,+); ... servo 1 soll seine position vergrößern. was mache ich falsch, bzw. ist das überhaupt möglich? =)

vielen dank schonmal!! stefan

Hallo Stefan

So wird das nichts. Aber Du könntest es so machen (nicht getestet):

int ledPins[] = (led_pin1, led_pin2);
int servoval[2];
Servo myservo[2];

...

void adjust(int idx, int degree, int c)
{
    digitalWrite(ledPins[idx], HIGH);
    servoval[idx] = servoval[idx]+degree;
    myservo[idx].write(servoval[idx]);
    digitalWrite(ledPins[idx], LOW);
    lastcase = c;
}

void setup()
{
  ...

  myservo[0].attach(...)
  myservo[1].attach(...)

  ...
}

void loop()
{
  ...

  if (irrecv.decode(&results)) {
    switch (results.value) {
       case 0x20DF40BF:
          adjust(0, grad, 1);
          break;
      case 0x20DFC03F:
          adjust(0, -grad, 2);
          break;
     case 0x20DF00FF:
          adjust(1, grad, 3);
          break;
     case 0x20DF807F:
          adjust(1, -grad, 4);
          break;
     }
  }

  ...
}

Hallo tres

Wie es besser geht hat Dir MaFu gezeigt.

Dazu noch die Erklährung: Programmteile die sich öfter wiederholen sollten einmal als Funktion definiert werden. Die Funktionen haben Übergabeparameter die Du als Variablen im Funktionsaufruf übergibst. So kannst Du das Programmm übersichtlicher und kürzer machen. Der Namen der Funktion ist frei wählbar, einzige Bedingung, daß der Namen noch nicht für andere Funktionen oder Befehle verwendet wird. Eine 2. Limitierung ist, daß die Funktion nicht sich selbst aufrufen darf. Da dadurch ziemlich schnell das RAM knapp wird und der Controller abstürzt.

Grüße Uwe

danke MaFu, danke uwe!

schnell zusammenschustern ist ganz einfach, den code aber effizient und speicherschonend zu machen leider nicht so ganz :astonished: ich werde das heute abend gleich mal testen!

lg, stefan

hey MaFu,

dein code hat funktioniert, allerdings erst nachdem ich hier int ledPins[] = (led_pin1, led_pin2); die runden klammern durch geschweifte ersetzt habe. aber ansonsten macht das meinen code schon sehr viel schlanker so! ;)

danke, stefan

Uuups, hast recht. :blush: Da ich ständig zwischen Pascal und C++ wechsle, kommt das schon mal vor.