RotaryEncoder korrekt verdrahten

Hi zusammen,

ich habe einen RotaryEncoder (EC11) an einen ESP32 angeschlossen und folgenden Sketch ausprobiert (ist ein Extrakt aus einem Webradio Sketch...der es später auch mal werden soll):

#include "AiEsp32RotaryEncoder.h"

#define ROTARY_ENCODER_BUTTON_PIN 33
#define ROTARY_ENCODER_A_PIN 34
#define ROTARY_ENCODER_B_PIN 35
#define ROTARY_ENCODER_VCC_PIN -1
#define ROTARY_ENCODER_STEPS 4 

uint8_t curStation = 0;
uint8_t actStation = 0;
uint32_t lastchange = 0;
#define STATIONS 10

AiEsp32RotaryEncoder rotaryEncoder = AiEsp32RotaryEncoder(ROTARY_ENCODER_A_PIN, ROTARY_ENCODER_B_PIN, ROTARY_ENCODER_BUTTON_PIN, ROTARY_ENCODER_VCC_PIN, ROTARY_ENCODER_STEPS);

void IRAM_ATTR readEncoderISR()
{
  rotaryEncoder.readEncoder_ISR();
}


void setup() {
    Serial.begin(115200);

    rotaryEncoder.begin();
    rotaryEncoder.setup(readEncoderISR);
    rotaryEncoder.setBoundaries(0, STATIONS, true); //minValue, maxValue, circleValues true|false (when max go to min and vice versa)
    rotaryEncoder.disableAcceleration();
}




void rotary_loop()
{
  //dont do anything unless value changed
  if (rotaryEncoder.encoderChanged())
  {
    uint16_t v = rotaryEncoder.readEncoder();
    Serial.printf("Station: %i\n",v);
    //set new currtent station and show its name
    if (v < STATIONS) {
      curStation = v;
      lastchange = millis();
    }
  }
  //if no change happened within 10s set active station as current station
  if ((lastchange > 0) && ((millis()-lastchange) > 10000)){
    curStation = actStation;
    lastchange = 0;
  }
  //react on rotary encoder switch
  if (rotaryEncoder.isEncoderButtonClicked())
  {
    //set current station as active station and start streaming
    actStation = curStation;
    Serial.printf("Gedrückt!");
  }
}

void loop()
{
    rotary_loop();
}

Von der Verdrahtung her hab ich einen Button-Pin direkt auf GND und direkt mit dem Mittelabgriff des Potis verbunden (weil der ja auch auf GND muss).
Den anderen Button-Pin hab ich zum einen auf den GPIO 33 gehängt und zum anderen über einen 10K auf 5Volt gelegt (könnt ich mir evtl. sparen, oder? Wenn die Library einen INPUT_PULLUP schaltet?)

Der Poti höngt an 34 und 35 (und der Mittelabgriff wie geschrieben auf GND).

Problem: Sobald ich den Poti berühre, wird eine Drehung "erkannt".

Denkt ihr, dass es sich um ein Hardware-Problem handelt (Drehgeber = Schrott oder schlecht verdrahtet) oder kann es ein Fehler im Sketch sein?

LG Daniel

Hallo,
tausche mal die Drähte A und B eventuell beisst sich das gerade mit dem mechanischen Raster.
Heinz

Nachtrag
Was macht die Lib mit den Eingängen / Pullup ??? Entprellen ??
Quatsch wiso gibt es einen Pin für die VCC an dem Encoder.

Lass die blöde Lib weg und Zähle rauf und runter mehr barauchst Du Doch nicht.

Hallo,

sind da Interrupt Eingänge im Spiel?
Pullups/Pulldowns musst du sicherstellen bzw. prüfen.

Normalerweise haben Encoder keine Potentiometer verbaut.

Hi,

kann ich dann nicht auch einfach im Code die Pinbelegung tauschen?

Ich benutze halt die Bibliothek und habe gehofft, dass die das alles entsprechend regelt. Aber dann werd ich wohl nicht drum rum kommen, mir die mal genauer anzusehen;-)

geht auch

@Whandall ich hab pauschal für den "Dreh"-Anteil den Begriff "Poti" verwendet.

Den hier hab ich verwendet:

WayinTop 5 Set 360 Grad Rotary Encoder Modul EC11 Digital Potentiometer Drehgeber Drehwinkelgeber 5 Pin mit Schalter und Drehknopf für Automobilelektronik Multimedia-Audio https://amzn.eu/d/jm8Twx7

Dir ist bewusst, dass Worte eine Bedeutung haben?

Encoder sind normalerweise drei einfache Schalter,
von denen zwei versetzt über die Drehbewegung geschlossen und geöffnet werden,
der dritte schließt beim Drücken der Achse.

Zu deinem Problem:

Wenn du mit einer Berührung Interrupts auslöst,
scheint etwas mit den Pull-Ups der Pins nicht zu stimmen.

Die von dir verwandte Library kenne ich nicht,
die Übergabe eines ROTARY_ENCODER_VCC_PIN im Konstruktor erscheint mir suspekt.

Hast du mal eine andere Library versucht?

:rofl: Anscheinend nur manchmal

Werd ich probieren, Danke.

An den Pins an sich kann es nicht liegen, oder? 34 und 35?
Ansonten löt ich das einfach mal um...

Schau dir mal an wie die Dinger funktionieren:

Welche Methode (Polling/Interrupt) von wem bevorzugt wird,
ob Software oder Hardware zum Entprellen eingesetzt werden sollte,
ist hier sicher schon x-mal diskutiert worden.
Such mal nach Encoder, Drehgeber, oder ähnlichen Begriffen.

Edit: Das Video fand ich auch ganz interessant.

1 Like

Also! Das Amazon hat ein Bild - letztes Bild - da geht die Verdrahtung hervor.

Somit kommt am Encoder an derr Seite mit den drei Kontakten in der Mitte GND ran.
An den beiden äusseren jeweils der PIN des ESP.
Dann kommt zusätzlich jeweils ein Widerstand zwischen dem PIN und den 3,3V

Auf der Seite mit den zwei Kontakten geht ein Anschlusspin auf GND und der andere an den Eingangspin des ESP.
Auch hier kommt ein R zwischen 3,3V und dem PIN zusätzlich eingebaut.
Wie hier heute morgen gezeigt: Reihenfolge widerstand - #4 by my_xy_projekt
Du fragst dann alle switches auf aktiv LOW ab.

Natürlich kann man auch die internen Pull-Ups des Prozessors verwenden.

Es waren tatsächlich die fehlenden R's.
Ein einfaches "INPUT_PULLUP" der verwendeten GPIOs im Setup hat das Problem gelöst.

Edit: Und ich musste die GPIOs ändern. Denn anscheinen gehen die GPIO34 und 35 nicht mit INPU_PULLUP...

Danke für eure Hilfe und frohe Weichnachten schon mal :wink:

1 Like

image

hm... IO-pin 34, 35 Input only

Dann ist klar das man IO-pin 34,35 nicht als Ausgänge benutzen kann.
Aber an einem Encoder werden sie eigentlich als Eingänge benutzt
Wie auch immer der Artikel ist jedenfalls hilfreich wie kann man welchen IO-Pin benutzen
vgs

Hi Stefan,

die Seite ist bei mir in der Lesezeichenleiste fest integriert :smile: Aber diese GPIOS haben keinen internen Pullup verbaut. Ich hab die jetzt aber dann doch verwendet und externe Pullups verwendet.

Lg Daniel

Aus dem Text der genau darunter steht:

:wink:

@basementmedia ich musste auch erst dreimal schauen, warum das bei Dir nicht funktioniert wie sonst - bis ich drauf gekommen bin, das Du blanke Rotarys verwendest.
Ich nehm sonst immer die auf Breakoutboards. (Suchbegriff KY-040)
Da sind die R's für den Encoder immer mit drauf. Der für den Button überwiegend nicht...

1 Like

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