sorry about the delay in answering, but I have been really busy with my real life job.

The rotary encoder (ALPS STEC12E07) is connected to pins 2 and 3 of the M5Stack and GND.

I also have used pins 22 and 23 in the past, but those can crash the app as soon as you are using the TFT of the M5Stack (looked into the header files of M5Stack and found that pin 22 is connected to the TFT).

I am using the following code, which you can find in variations on the web:

/* Read Quadrature Encoder
Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V.

Sketch by max wolf / www.meso.net
v. 0.1 - very basic functions - mw 20061220


int encoder0PinA = 2;
int encoder0PinB = 3;

int encoderPos = 0;
int lastReportedPos = 0;

int aValue = LOW;
int bValue = LOW;
int aValueLast = LOW;

void setup() {
pinMode (encoder0PinA, INPUT);
pinMode (encoder0PinB, INPUT);
digitalWrite(encoder0PinA, LOW);
digitalWrite(encoder0PinB, LOW);

encoderPos = 2000;

Serial.begin (115200);


void loop() {


aValue = digitalRead(encoder0PinA);
bValue = digitalRead(encoder0PinB);

if ((aValue != aValueLast) && (aValue == LOW)) { //knob rotated, when aValues changes, BUT use only if aValue is LOW

if (bValue == LOW) { encoderPos++; } else { encoderPos--; }


aValueLast = aValue;

if(lastReportedPos != encoderPos)

Serial.print("Position: "); Serial.println(encoderPos, DEC); lastReportedPos = encoderPos;


The code works from time to time, but its not reliable on the M5Stack. Tomorrow I will buy another rotary encoder just to exclude any hardware issues.

Kind regards