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?
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;-)
@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
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.
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.
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.
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
die Seite ist bei mir in der Lesezeichenleiste fest integriert Aber diese GPIOS haben keinen internen Pullup verbaut. Ich hab die jetzt aber dann doch verwendet und externe Pullups verwendet.
@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...