Weird behaviour of rotary encoder values
Unfortunately, I couldn't find the issue.
BUT I used another approach which worked fine.

I used the ClickEncoder library.
This time, my rotary encoder triggered 4 events per notch.

After a little research I found out, that it's possible to set the steps per notch with this library.
I used this code to initiate the ClickEncoder:

encoder = new ClickEncoder(A15, A14, A13, 4);


The first three arguments define the pins the encoder is connected to. The last argument sets the steps per notch. Now it works like a charm!

Full code:

#include &lt;ClickEncoder.h&gt;
#include &lt;TimerOne.h&gt;

ClickEncoder *encoder;
int16_t last, value;

void timerIsr() {
  encoder-&gt;service();
}

void setup() {
  Serial.begin(9600);
  encoder = new ClickEncoder(A15, A14, A13, 4);

  Timer1.initialize(1000);
  Timer1.attachInterrupt(timerIsr); 

  last = -1;
}

void loop() {  
  value += encoder-&gt;getValue();

  if (value != last) {
    last = value;
    Serial.print("Encoder Value: ");
    Serial.println(value);
  }

  ClickEncoder::Button b = encoder-&gt;getButton();
  if (b != ClickEncoder::Open) {
    Serial.print("Button: ");
    #define VERBOSECASE(label) case label: Serial.println(#label); break;
    switch (b) {
      VERBOSECASE(ClickEncoder::Pressed);
      VERBOSECASE(ClickEncoder::Held)
      VERBOSECASE(ClickEncoder::Released)
      VERBOSECASE(ClickEncoder::Clicked)
      case ClickEncoder::DoubleClicked:
          Serial.println("ClickEncoder::DoubleClicked");
          encoder-&gt;setAccelerationEnabled(!encoder-&gt;getAccelerationEnabled());
          Serial.print("  Acceleration is ");
          Serial.println((encoder-&gt;getAccelerationEnabled()) ? "enabled" : "disabled");
        break;
    }
  }    
}