/* Based on Oleg Mazurov's code for Reading rotary encoder on Arduino, here
https://chome.nerpa.tech/mcu/reading-rotary-encoder-on-arduino/ and here
https://chome.nerpa.tech/mcu/rotary-encoder-interrupt-service-routine-for-avr-micros/
This example does not use the port read method. Tested with Nano and ESP32
Connections
===========
Encoder | ESP32 | Nano
--------------------------
A | D5 | Nano D2
B | D21 | Nano D3
GND | GND | GND
*/
// Define rotary encoder pins
#define ENC_A 23
#define ENC_B 18
volatile int counter = 0;
void setup() {
// Set encoder pins
pinMode(ENC_A, INPUT_PULLUP);
pinMode(ENC_B, INPUT_PULLUP);
// Start the serial monitor to show output
Serial.begin(115200); // Change to 9600 for Nano, 115200 for ESP32
delay(500); // Wait for serial to start
Serial.println("Start");
}
void loop() {
static int lastCounter = 0;
read_encoder();
// If count has changed print the new value to serial
if(counter != lastCounter){
Serial.println(counter);
lastCounter = counter;
}
}
void read_encoder() {
// Encoder routine. Updates counter if they are valid
// and if rotated a full indent
static uint8_t old_AB = 3; // Lookup table index
static int8_t encval = 0; // Encoder value
static const int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; // Lookup table
old_AB <<=2; // Remember previous state
if (digitalRead(ENC_A)) old_AB |= 0x02; // Add current state of pin A
if (digitalRead(ENC_B)) old_AB |= 0x01; // Add current state of pin B
encval += enc_states[( old_AB & 0x0f )];
// Update counter if encoder has rotated a full indent, that is at least 4 steps
if( encval > 3 ) { // Four steps forward
counter++; // Increase counter
encval = 0;
}
else if( encval < -3 ) { // Four steps backwards
counter--; // Decrease counter
encval = 0;
}
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
drv1:ENABLE
drv1:MS1
drv1:MS2
drv1:MS3
drv1:RESET
drv1:SLEEP
drv1:STEP
drv1:DIR
drv1:GND.1
drv1:VDD
drv1:1B
drv1:1A
drv1:2A
drv1:2B
drv1:GND.2
drv1:VMOT
stepper1:A-
stepper1:A+
stepper1:B+
stepper1:B-
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
encoder1:CLK
encoder1:DT
encoder1:SW
encoder1:VCC
encoder1:GND
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA
led1:A
led1:C