Probleme mit Funktionen

Hallo, ich glaube ich habe ein grundsätzliches Problem mit Funktionen.

Ich möchte einen Drehender einen wert hoch und runter regeln lassen.

Aufgebaut Code gesucht....gefunden

Ausprobiert
geht.

das ist der Code

#define encoderPinA A1 // CLK pin of Rotary Enocoder
#define encoderPinB A2 // DT pin of Rotary Enocoder
int encoderPos = 0;
int encoderPinALast = LOW;
int encoderPinANow = LOW;
void setup() {
  pinMode (encoderPinA, INPUT_PULLUP);
  pinMode (encoderPinB, INPUT_PULLUP);
  Serial.begin (9600);
}
void loop() {
  encoderPinANow = digitalRead(encoderPinA);
  if ((encoderPinALast == HIGH) && (encoderPinANow == LOW)) {
    if (digitalRead(encoderPinB) == HIGH) {
      encoderPos++;
    } else {
      encoderPos--;
    }
    Serial.println(encoderPos);
  }
  encoderPinALast = encoderPinANow;
}

dann wollte ich diesen code als Funktion weiterverwenden und es geht nichts mehr.
die Idee war das ja die Funktion Encode entweder 1 0 oder nichts zurückgibt und daher sich der wert für Counter ändert.

aber das Serial.print in der Funktion wird nicht mehr gecalled

#define encoderPinA A1 // CLK pin of Rotary Enocoder
#define encoderPinB A2 // DT pin of Rotary Enocoder
int counter = 0;
int encoderPinALast = LOW;
int encoderPinANow = LOW;
void setup() {
  pinMode (encoderPinA, INPUT_PULLUP);
  pinMode (encoderPinB, INPUT_PULLUP);
  Serial.begin (9600);
}
void loop() {
counter=+encode();
}


int encode () {
  int encoderPos=0;
  encoderPinANow = digitalRead(encoderPinA);
  if ((encoderPinALast == HIGH) && (encoderPinANow == LOW)) {
    if (digitalRead(encoderPinB) == HIGH) {
      encoderPos++;
    } else {
      encoderPos--;
    }
    return(encoderPos);
    Serial.println(encoderPos);
  }
  encoderPinALast = encoderPinANow;
}

Also warum von Hand machen wen es ausgereifte Bibliotheken gibt?
ZB.

1 Like

Natürlich nicht!
https://en.cppreference.com/w/cpp/language/return

Dazu:

E:\Programme\arduino\portable\sketchbook\sketch_aug12f\sketch_aug12f.ino: In function 'int encode()':
E:\Programme\arduino\portable\sketchbook\sketch_aug12f\sketch_aug12f.ino:28:19: warning: control reaches end of non-void function [-Wreturn-type]
   28 |   encoderPinALast = encoderPinANow;
      |   ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~

1 Like

Lass das + weg
counter = encoder();

Die variable encoderPos solltest du innerhalb der function als static definieren.

int static encoderPos;

Locale Variable gehen verloren nach Beendigung der Funktion

Ich rate allgemein von statischen Variablen in Funktionen, Methoden und Klassen ab.
Dafür muss es schon "richtige" Gründe geben.
Einen solchen Grund sehe ich hier nicht.

An dieser Stelle verlässt du die Funktion encode() mit return(encoderPos), d.h. Serial.println() wird dann nicht mehr aufgerufen.

1 Like