INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
KY-040 Rotary Encoder
07.01.2021, 18:53
Beitrag #9
RE: KY-040 Rotary Encoder
(07.01.2021 12:01)Harry schrieb:  @Toni
So etwas ähnliches hatte ich auch gefunden, die Erkennung der Drehrichtung war aber nicht immer richtig.

Ok, hatte keine Probleme damit.

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.01.2021, 17:52 (Dieser Beitrag wurde zuletzt bearbeitet: 09.01.2021 10:34 von Bitklopfer.)
Beitrag #10
RE: KY-040 Rotary Encoder
Ich benutze die Encoder-Bibliothek nicht, habe aber mittels eines digitalen Filters das Prellproblem gelöst.
Hier ist mein Code.
Zuerst die Settings:
Code:
// --------------------------- Settings für Rotary Encoder --------------------------
#define CLK 16                                              // CLK am rotary encoder (= A2)
#define DT 17                                               // DT am rotary encoder (=A3)
#define SW 2                                                // SW am rotary encoder (2 wegen Interrupt)
int old_button = LOW;                                       // Merker für button
int rotary = 0;                                             // encoder value für CLK und DT
int old_rotary = 0;                                         // Merker für encoder value
Dann das Setup mitsamt der Interrupt-Service-Routine im Bereich Setup:
Code:
// Setup Rotary Encoder
  pinMode(CLK, INPUT_PULLUP);                // Turn on pullup resistor
  pinMode(DT, INPUT_PULLUP);                 // Turn on pullup resistor
  pinMode(SW, INPUT_PULLUP);                 // Turn on pullup resistor
  attachInterrupt(digitalPinToInterrupt(SW), ISR_SW, CHANGE);
Dann der Aufruf für den Drehgeber im Bereich Loop:
Code:
rotary += read_rotary();
  if (rotary != old_rotary) {              // werde aktiv nur wenn sich etwas geändert hat
    old_rotary = rotary;
    Serial.println(rotary);
  }
Die ISR für das Drücken:
Code:
// -------------------------- ISR für Rotary Encoder Button -------------------------
void ISR_SW() {
  int button = !digitalRead(SW);                    // sobald gedrückt wird -> ein
  if (button != old_button) {
    delay(20);
    old_button = button;
    if (button == HIGH) {
      Serial.println("high");
    }
  }
}
und schließlich die Function für das entprellen des Drehgebers mit dem Hinweis, woher ich das habe:
Code:
// ----------------------- Rotary Encoder lesen und entprellen ----------------------
// zum Verständnis: John Main - best-microcontroller-projects.com
int8_t read_rotary() {
  static int8_t rot_enc_table[] = {0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0};
  static uint8_t prevNextCode = 0;             // uint8_t = unsigned integer 8bit
  static uint16_t store=0;                     // uint16_t = unsigned integer 16bit

  prevNextCode <<= 2;
  if (digitalRead(DT)) prevNextCode |= 0x02;
  if (digitalRead(CLK)) prevNextCode |= 0x01;
  prevNextCode &= 0x0f;

   // If valid then store as 16 bit data.
   if  (rot_enc_table[prevNextCode] ) {
      store <<= 4;
      store |= prevNextCode;
      if ((store&0xff)==0x2b) return -1;     // valid CCW (clock counter wise)
      if ((store&0xff)==0x17) return 1;      // valid CW (counter wise)
   }
   return 0;                                 // invalid
}

Bei uns heißt das code und nicht php.
lgbk Moderator

Karl Stanger
www.stangerweb.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.01.2021, 17:56
Beitrag #11
RE: KY-040 Rotary Encoder
Den Interrupt gerade für den Schalter zu verwenden halte ich für Unsinn.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.01.2021, 01:14
Beitrag #12
RE: KY-040 Rotary Encoder
Hab für den Taster auch keinen Interrupt benötigt, aber hab ich ja bereits in einem Posting vorher kundgetan. Und obwohl ich auch dabei die Fastled in Verwendung hatte, war das kein Problem (war keine Zeitkritische Anwendung!).

Gruß aus Wiener Neustadt
Toni

=================================================================
Seit die Mathematiker über die Relativitätstheorie hergefallen sind, verstehe ich sie selbst nicht mehr.

Wer Rechtschreibfehler findet darf sie behalten Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Encoder in Lüftersteuern integrieren Hilbus 8 684 05.02.2021 16:18
Letzter Beitrag: Hilbus
  Konflikt bei Rotary Encoder Karl Stanger 9 696 02.01.2021 13:39
Letzter Beitrag: hotsystems
  Rotary Encoder und I2C Display gleichzeitig verwenden BenGroll 3 1.132 27.07.2020 10:23
Letzter Beitrag: hotsystems
  7 Segment Display mit Rotary Encoder SA154 2 954 26.05.2020 13:40
Letzter Beitrag: MicroBahner
  Konfiguration i2c Encoder Igom 4 1.170 01.03.2020 13:23
Letzter Beitrag: bytecook
  Rotary Encoder - gedrückt und gleichzeitig drehen Gerdchen03 6 1.529 29.10.2019 10:49
Letzter Beitrag: Tommy56
  Menue und klick-Encoder bojojo 2 1.726 23.11.2018 13:46
Letzter Beitrag: bojojo
  Probleme mit Umstellung von Tastern auf Encoder MasterOfPuppets 5 1.799 09.11.2018 22:29
Letzter Beitrag: hotsystems
Wink per Rotary Encoder Bewegungsmelder aktivieren Davidsen74 34 8.123 09.03.2017 18:17
Letzter Beitrag: Davidsen74
  Dc Getriebemotor mit encoder clemens5555 3 3.002 12.02.2017 14:07
Letzter Beitrag: Binatone

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste