Library in eigener Klasse verwenden

Hallo zusammen,

meine C Kenntnisse sind hier eher unterdurchnitt :smiling_face:

Ich möchte mehrere Rotary Encoder im Projekt verwenden. Dazu verwende ich folgende Library: GitHub - PaulStoffregen/Encoder: Quadrature Encoder Library for Arduino

Die Verwendung klappt sehr gut. Bei drei Encodern braucht man aber eine Menge an Variablen und doppelten Code. Also würde ich das gerne kappseln und am Ende eigentlich nur wissen in welche Richtung gedreht wurde.

Ich habe nun einiges ausprobiert und scheinbar scheitere ich an der Zeigergeschichte.

Mir geling es nicht in einer anderen Klasse eine Instanz von Encoder zu erstellen, oder diese im Konstruktor an meine Klasse zu übergeben und dort weiter zu verwenden.

Was ich hinbekommen habe:

Knob.h

#ifndef Knob_h
#define Knob_h

#include "Arduino.h"
#include <Encoder.h>


class Knob {

private:
  int pin_sw;

public:
  Knob(int sw, Encoder& encoder) ;
  int GetPosition();
  void loop();
};

#endif
Knob.ccp

#include "Arduino.h"
#include "Knob.h"

Knob::Knob(int sw, Encoder& encoder) {
  pinMode(sw, INPUT);
  pin_sw = sw;
}

void Knob::loop() {
}

Mein Probmlem ist nun dass ich es nicht hinbekomme den Encoder Parameter aus dem Kontruktor als Variable zu definieren um sie später in loop() auslesen zu können.

Alternativ hatte ich auch versucht nur die entsprechenden Pins an meine Klasse zu übergeben. Aber hier habe ich das gleiche Problem. Im Konstruktor kann ich zwar den Encoder erstellen, aber im loop() habe ich es dann nicht zur Verfügung.

Habt Ihr einen Tipp?

VG
Thorsten

machst du auch nicht.
wenn du eine Komposition machen willst, wirst du schon einen Membervariable Encoder in deiner Klasse brauchen.

Wenn du nur eine Referenz oder einen Pointer auf einen bestehenden Encoder haben willst, wirst eine Referenz oder einen Pointer für Encoder brauchen.

Wenn dein Encoder einfach ein paar zusätzliche Memberfunctions aufweisen soll, dann könnte auch eine Vererbung passen - aber da müsste man erst mal sehen was du alles von der Encoder Klasse brauchst.

Bevor du das in cpp und h aufteilst, mach dir mal eine Klasse in deinem Usersketch. Dann kann man das auch einfach im Forum posten.

Zeig mal einen compilierbaren Sketch mit einem Encoder und kennzeichne was in deine spezielle Klasse kommen soll.

edit:
nur mal so als Beispiel basierend auf das basic Beispiel, compiliert, aber ungetestet:

/* Encoder  - inherited in own class
   https://forum.arduino.cc/t/library-in-eigener-klasse-verwenden/1049819
*/

#include <Encoder.h>

// inherit from Encoder
class MyEncoder : public Encoder
{
  protected:
    uint8_t pinSwitch;
    int32_t oldPosition = -999;
  public:
    MyEncoder (uint8_t pin1, uint8_t pin2, uint8_t pinSwitch) : Encoder(pin1, pin2), pinSwitch{pinSwitch} {}

    void begin()  // to be called once in setup()
    {
      pinMode(pinSwitch, INPUT_PULLUP);
    }

    void update() // to be called in loop()
    {
      if (digitalRead(pinSwitch) == LOW) Serial.print("x");

      long newPosition = this->read();
      if (newPosition > oldPosition) {
        oldPosition = newPosition;
        Serial.print(F("higher "));
        Serial.println(newPosition);
      }
      else if (newPosition < oldPosition)
      {
        oldPosition = newPosition;
        Serial.print(F("lower "));
        Serial.println(newPosition);
      }
    }
};

//Encoder myEnc(5, 6);
MyEncoder myEnc(5, 6, 11); // enc, enc, button

void setup() {
  Serial.begin(9600);
  Serial.println("Basic Encoder Test:");
  myEnc.begin();
}

void loop() {
  myEnc.update();
}

Auf die Vererbung bin ich gar nicht gekommen.

Das Beispiel macht eigentlich alles was ich möchte.

MyEncoder (uint8_t pin1, uint8_t pin2, uint8_t pinSwitch) : Encoder(pin1, pin2), pinSwitch{pinSwitch} {}

Danach hatte ich gesucht.

VG
Thorsten

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.