Encoder richtig auslesen

Hallo Zusammen,

ich benötige leider nochmals Hilfe bei meinem aktuellen Projekt. Unter anderem möchte ich zwei Encoder (Joy-It aus dem Starter-Kit) auslesen. Das funktioniert soweit ganz gut bis ich in meinem Sketch das Display einfüge. Dann bekomme ich keine realistischen Werte mehr angezeigt. Soweit auch logisch da der Ablauf natürlich länger dauert.

Ich habe nun über einen Interrupt versucht. So läuft mir der Zähler aber durchgehend bis sich der Arduino aufhängt.... Wo habe ich hier den Fehler eingebaut?

Ebenso habe ich immer das Problem mit dem Entprellen. Hierzu habe ich verschiedene Anleitungen gefunden mit Pull_up Widerständen oder Kondensatoren konnte aber keine brauchbare Lösung aufbauen...

Leider bin ich mit meinem Latein am Ende und komme seit Tagen nicht weiter daher bitte ich die Experten hier nochmals um Hilfe. Vielen Dank

//DISPLAY
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

const int Knopf=22;                //Eingang Schusszähler
int KnopfJETZT = 0;     //Knopf aktuell
int KnopfALT = 0;     //Knopf Zustand ALT

//Variable
int counter;        //Zähler
volatile int encoderWert = 0; //INTERRUPT TEST

void setup() {

  
  pinMode(2, INPUT);   //INTERRUPT
  pinMode(3, INPUT);
  attachInterrupt(2, encoderLesen, FALLING);

  
   u8g2.begin(); //DISPLAY
    Serial.begin(9600);

}

void loop() {


  KnopfJETZT = digitalRead(Knopf);
  
  if (KnopfJETZT != KnopfALT) {
    if (KnopfJETZT == HIGH) {
      counter++;
      Serial.println(counter);
   
    } else {

     
    }
    delay(50);
  }

//DISPLAY
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_7x14B_mf); // choose a suitable font
  u8g2.drawStr(0, 16, "Schuss = "); // write something to the internal memory
  u8g2.setCursor(85, 16);
  u8g2.print(encoderWert); // write something to the internal memory
  u8g2.drawStr(0, 38, "Taktung = "); // write something to the internal memory
  u8g2.setCursor(85, 38);
  u8g2.print(counter); // write something to the internal memory
  u8g2.drawStr(0, 62, "Laufzeit = "); // write something to the internal memory
  u8g2.setCursor(85, 62);
  u8g2.print(counter); // write something to the internal memory
  u8g2.sendBuffer();          // transfer internal memory to the display


}

void encoderLesen(){
  if(digitalRead(3) == HIGH) { encoderWert++;}
  else {encoderWert--;}
}

Hi

Dann sollte Das wohl ein Dreh-Encoder sein (quadratur-Encoder).
Für Handbetrieb reicht Pollen im Allgemeinen dicke aus.

WENN Du schon auf Interrupts gehst, solltest Du die beteiligten Variablen (nur Die, Die Innen UND Außen benutzt werden) als volatile deklarieren - damit wird der Kompiler angewiesen, den Wert IMMER frisch aus dem Speicher auszulesen (es könnte zwischen zwei Zeilen der Interrupt zugeschlagen haben).

WAS soll dieser Sketch machen?

MfG

Lies dir mal diesen Beitragdurch, da findest du einige Infos, wie du es richtig machen kannst.

(deleted)

Danke für die Tipps.

Habe das mit dem Two Knobs umgesetzt und das Auslesen der Encoder funktioniert ganz gut. Jetzt hängt sich das Board immer wieder auf. Bin mir nicht sicher wo der Fehler jetzt liegt.

Hierfür habe ich aber einen neuen Thread geöffnet...

Viele Grüße

(deleted)