Begrenzung des Wertebereichs Encoder (Drehgeber) und Anwendung

Man nehme die library NewEncoder und konfiguriere beim Erzeugen der Instanz die untere und obere Grenze der Werte und den Startwert.

NewEncoder encoder(2, 3, -20, 20, 0, FULL_PULSE);

2,3 IO-Pins,
-20,20 unterer und oberer Grenzwert
0 Startwert
FULL_PULSE oder HALF_PULSE je nach encoder-Bauart

NewEncoder funktioniert sehr zuverlässig selbst mit prellendem mechanischen Encodern

Democode:

#include "Arduino.h"
#include "NewEncoder.h"

// Pins 2 and 3 should work for many processors, including Uno. See README for meaning of constructor arguments.
// Use FULL_PULSE for encoders that produce one complete quadrature pulse per detnet, such as: https://www.adafruit.com/product/377
// Use HALF_PULSE for endoders that produce one complete quadrature pulse for every two detents, such as: https://www.mouser.com/ProductDetail/alps/ec11e15244g1/?qs=YMSFtX0bdJDiV4LBO61anw==&countrycode=US&currencycode=USD
NewEncoder encoder(2, 3, -20, 20, 0, FULL_PULSE);
int16_t prevEncoderValue;

void setup() {
  NewEncoder::EncoderState state;

  Serial.begin(115200);
  delay(2000);
  Serial.println("Starting");

  if (!encoder.begin()) {
    Serial.println("Encoder Failed to Start. Check pin assignments and available interrupts. Aborting.");
    while (1) {
      yield();
    }
  } else {
    encoder.getState(state);
    Serial.print("Encoder Successfully Started at value = ");
    prevEncoderValue = state.currentValue;
    Serial.println(prevEncoderValue);
  }
}

void loop() {
  int16_t currentValue;
  NewEncoder::EncoderState currentEncoderState;

  if (encoder.getState(currentEncoderState)) {
    Serial.print("Encoder: ");
    currentValue = currentEncoderState.currentValue;
    if (currentValue != prevEncoderValue) {
      Serial.println(currentValue);
      prevEncoderValue = currentValue;
    } else
      switch (currentEncoderState.currentClick) {
        case NewEncoder::UpClick:
          Serial.println("at upper limit.");
          break;

        case NewEncoder::DownClick:
          Serial.println("at lower limit.");
          break;

        default:
          break;
      }
  }
}

vgs

Hallo Zusammen,

ich möchte jetzt zunächst einmal erreichen, dass der Wert (0-123) auf dem Display vernünftig wählbar ist bzw. sich gleichmäßig ändert. Aktuell habe ich folgendes Problem:
Drehe ich den Encoder beispielsweise nach rechts, ist der Wert 123 ziemlich schnell erreicht (2-3 Umdrehungen). Drehe ich dann wieder nach links, ist der Wert nach 2-3 Umdrehungen bei ca.100 d.h. er sinkt sehr sehr langsam. Außerdem kommt es vor, dass der Wert steigt wenn ich mit dem Encoder nach links drehe, obwohl er zuvor auch gestiegen ist, wenn ich nach rechts gedreht habe (D.h. der Wert steigt beim Drehen in beide Richtungen!?).

Mir ist bereits bewusst, dass dies nur auftritt, wenn das LCD-Display angeschlossen ist. (Ohne Display werden im Seriellen Monitor die Werte genauso angezeigt und sind durch drehen justierbar, wie ich es möchte).

Habt ihr Ideen woran das liegen könnte? Habe euch den Code angehängt.

#include <Encoder.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C meinLCD(0x27,16,2);

int oldPosition  = -999; //


Encoder meinEncoder(5, 6);


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


void loop() {
  int newPosition = meinEncoder.read();
  newPosition = constrain(newPosition,0,123);
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
    meinLCD.setCursor(0,0);
    meinLCD.print("Hallo");
    meinLCD.setCursor(0,1);
    meinLCD.println(newPosition);
  }
}

Beste Grüße

mdziad:
Mir ist bereits bewusst, dass dies nur auftritt, wenn das LCD-Display angeschlossen ist.

Was hesist das?
Nicht angeschlossen UND die Lib deaktiviert oder Display abgenommen bei AKTIVER Lib?

Bitte für BEIDE Zustände sagen, wo die Reise hingeht.

my_xy_projekt:
Was hesist das?
Nicht angeschlossen UND die Lib deaktiviert oder Display abgenommen bei AKTIVER Lib?

Bitte für BEIDE Zustände sagen, wo die Reise hingeht.

Die Lib habe ich nicht deaktiviert/ gelöscht. Das einzige was ich mit // herausgenommen habe, waren die "print"-Befehle für das Display. Dann ändern sich die Zahlen im Seriellen Monitor optimal.
Also wenn ich die Lib lösche, funktioniert es auch. Ich muss nur diesen Part des Codes deaktivieren:

    meinLCD.setCursor(0,0);
    meinLCD.print("Hallo");
    meinLCD.setCursor(0,1);
    meinLCD.println(newPosition);

mdziad:
Die Lib habe ich nicht deaktiviert/ gelöscht. Das einzige was ich mit // herausgenommen habe, waren die "print"-Befehle für das Display.

Dir funkt möglicherweise ein Interrupt dazwischen.
Die encoder.lib lässt sich auch ohne interrupt bedienen.

Da ich nicht weiss, welche encoder.lib:
https://github.com/PaulStoffregen/Encoder/blob/master/examples/NoInterrupts/NoInterrupts.pde

An dem Interrupt liegt es auch nicht, konnte das Problem bisher leider nicht lösen...

Aber einen Link zu der Encoder-Lib, die Du benutzt, könntest Du uns schon geben.
Das war die nebenläufige Frage von my_xy_projekt.

Gruß Tommy

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