Zum Inhalt springen

Methoden

    Methoden sind Programmanweisungsblöcke. Wiederkehrende Abfolgen von Befehlen können in Methoden sinnvoll strukturiert werden. Parameter können an Methoden übergeben und Werte zurückgeliefert werden.

    Eine einfache Methode könnte so aussehen:

    void blinken(){  // Anweisungsblock Start
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
      delay(500);
      // Anweisungsblock Ende
    }

    Nun kann man die Methode z.B. aus dem void loop() aufrufen mit blinken();.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Parameter lassen sich auch an Methoden übergeben. Die Struktur sieht so aus:

    void blinken(int thePin, int dauer){
      digitalWrite(thePin, HIGH);
      delay(500);
      digitalWrite(thePin, LOW);
      delay(500);
    }

    Hierbei wird der Parameter thePin und Dauer übergeben. Der Aufruf kann dann so erfolgen: blinken(3,1000);.

    Man kann auch einen Wert von der Methode zurückgeben lassen. Dafür verwendet man anstelle von void den Variablentyp, den das Ergebnis haben wird und liefert es am Ende des Anweisungsblockes mit dem Schlüsselwort return an die Methode.

    float quadrat(float x){
      float ergebnis = x*x;
      return ergebnis;
    }

    Der Aufruf wäre z.B.:

    wert = quadrat(12.3);
    0 0 votes
    Article Rating
    12 Comments
    Newest
    Oldest Most Voted
    Inline Feedbacks
    Alle Kommentare anzeigen
    Ardu_Noob
    7 Jahre zuvor

    Hi

    Hätte diese ‚Dinger‘ eher Funktionen genannt, habe Diese auch so benannt kennen gelernt.
    Aber warum nicht, jedem Tierchen, Sein Pläsierchen.

    @Alex
    Die ‚Methode‘ muß dem Programm bekannt sein, BEVOR Diese aufgerufen wird.
    Das kannst Du hinbekommen, indem Du Diese VOR setup() schreibst – lässt Dich aber den Überblick über das eigentliche Programm vollkommen verlieren.

    Deshalb meine Variante:
    VOR setup() kommt eine Art Bekanntmachung:
    void meine_methode(int a, intb);
    Durch den Strichpunkt ist die ‚Methode‘ nur bekannt gemacht und wird vom Compiler in den Tiefen Deines Quelltextes gesucht, irgendwo findet Der dann:
    void meine_methode[int a, int b){
    Also mit öffnender Klammer – hier wird die Methode ‚ganz normal‘ geschrieben, da void (also OHNE Rückgabewert) muß Da auch kein return rein.
    Wenn Du statt Dessen einen Wert zurück haben willst, dann mit return.
    Kleines Beispiel:

    int plus(byte a, byte b); //Funktion bekannt machen
    byte wert_A=0;wert_B=0; //Variablen erstellen

    void setup(){
    … setupcode … //Setup-Zeug
    Serial.begin(9600);
    }

    void loop(){
    wert_A++;
    wert_B++;
    int ergebnis=plus(wert_A, wert_B);
    Serial.print(wert_A);
    Serial.print(„+“);
    Serial.print(wert_B);
    Serial.print(„=“);
    Serial.println(ergebnis);
    }

    int plus(byte a, byte b){ //Funktion definieren
    … Zeug machen, wofür die Funktion gedacht ist …
    return (a+b);
    }

    Das sollte so lauffähig sein.
    Float sollte man, wenn nicht unbedingt benötigt, vermeiden – solange der Code aber in den µC rein passt und tut, was Er soll – passt’s.

    Alex
    7 Jahre zuvor

    Wo stehen Methoden? Noch vor dem Setupteil? Oder im Programm void loop?

    8 Jahre zuvor

    Danke, mal.
    Hier der Code:
    void setup() {
    #define LEDws 3
    #define Motor 4
    #define LEDor 5
    #define LEDbl 6
    #define LEDrt 7
    #define LEDgn 8
    #define Tstart 11
    #define Tspirale 12
    #define Tart 13

    Serial.begin (9600);
    pinMode(LEDws, OUTPUT);
    pinMode(Motor, OUTPUT);
    pinMode(LEDor, OUTPUT);
    pinMode(LEDbl, OUTPUT);
    pinMode(LEDrt, OUTPUT);
    pinMode(LEDgn, OUTPUT);
    digitalWrite(Tstart, INPUT);
    digitalWrite(Tspirale, INPUT);
    digitalWrite(Tart, INPUT);
    digitalWrite(Tstart, HIGH);
    digitalWrite(Tspirale, HIGH);
    digitalWrite(Tart, HIGH);
    }
    void starten(int a) {
    digitalWrite(LEDbl, HIGH);
    for (int a=0; a<1000; a++) {
    if (digitalRead(Tstart) == HIGH) { digitalWrite(LEDbl, LOW); return; }
    }
    digitalWrite(LEDbl, LOW);
    delay(1000);
    digitalWrite(LEDbl, HIGH);
    for (int a=0; a<5000; a++) {
    if (digitalRead(Tstart) == HIGH) { digitalWrite(LEDbl, LOW); return; }
    }
    digitalWrite(LEDbl, LOW);
    return;
    }

    void loop() {

    if (digitalRead (Tart)== HIGH)
    { // Taster Betrieb
    while (1) {
    digitalWrite(LEDor, HIGH);
    digitalWrite(LEDws, HIGH);
    starten(5);
    digitalWrite(Motor, HIGH);
    delay(1000);
    digitalWrite(Motor, LOW);
    delay(3000);
    } }
    Mit der Funktion habs mal geschafft, meinen eigentlichen Zweck noch nicht. Aber es muss glaub ich nur mit if Anweisung einfacher gehen. Oder gibts noch was einfacheres?

    8 Jahre zuvor

    Oder gibts eine bessere Lösung?
    Möchte daß LEDs an 3 Ausgängen blinken, bis ein Schalter – Eingang HIGH ist.
    Robert

    Tim Sparla
    8 Jahre zuvor

    Hallo,
    dieser Moment wenn man vier/fünf Stunden an einem Programm schreibt und dann einen von tausenden Befehlen nicht kennt. Ich hatte diesesmal vergessen, wie ich einen Void-Teil im Hauptprogramm öffne. Naja, dank dir weiß ichs wieder.
    Vielen Dank für das Tutorial.

    PS: Hab mehr gelernt als ich brauchte ;)

    Antworte an  Tim Sparla
    8 Jahre zuvor

    Haha! Geil. Vielen Dank für Deinen netten Kommentar!

    9 Jahre zuvor

    Also ich würde ja die nachfolgende Methode so ändern:

    statt:
    void blinken(int thePin, int dauer){
    digitalWrite(thePin, HIGH);
    delay(500);
    digitalWrite(thePin, LOW);
    delay(500);
    }

    eben:
    void blinken(int thePin, int dauer){
    digitalWrite(thePin, HIGH);
    delay(dauer);
    digitalWrite(thePin, LOW);
    delay(dauer);
    }

    ansonsten ist die delay Zeit dauerhaft 500ms.

    Ansonsten gutes Beispiel.

    Tom
    9 Jahre zuvor

    Hallo Jörg
    void blinken(int thePin, int dauer){
    digitalWrite(thePin, HIGH);
    digitalWrite(dauer, LOW);
    }
    ist falsch, da du ja nicht den Pin (3000 haste ja eh nicht ) änder möchtest.

    und Manne
    Wenn du etwas übergeben und zurück bekommen möchtest dann versuch doch mal
    float( int Übergabe,float was)
    .
    .
    return ErgebnisZurück
    Habe leider keinen Aduino ( noch nicht )

    Manne
    9 Jahre zuvor

    Hallole,
    ich hatte mal ne Frage. Wie sieht das ganze aus wenn ich einen Paarmeter übergeben möchte und auch einen zurückbekommen möchte.
    Gruß
    Manfred

    10 Jahre zuvor

    The backend part of your company supports these profit centers.
    Then consider yourself one of the few, true internet marketers.
    It’s probably some mix of the two, so I have to
    give him props for not going too far in either direction.

    jörg
    11 Jahre zuvor

    Hallo,

    ichdenke:

    void blinken(int thePin, int dauer){
    digitalWrite(thePin, HIGH);
    digitalWrite(dauer, LOW);
    }

    mich würde bei der Anleitung interessieren, od die Schleife nur ein Mal durchlaufen wird.
    Muss ich das mit Return erzwingen?

    Grüße,
    Jörg