rotary encoder

common example

this example doesn't read the inputs fast enough and isn't a functional option for rotary encoder use.


// Rotary Encoder Inputs

#define CLK 2

#define DT 3

#define SW 4


int counter = 0;

int currentStateCLK;

int lastStateCLK;

String currentDir ="";

unsigned long lastButtonPress = 0;


void setup() {

        

// Set encoder pins as inputs

pinMode(CLK,INPUT);

pinMode(DT,INPUT);

pinMode(SW, INPUT_PULLUP);


// Setup Serial Monitor

Serial.begin(9600);


// Read the initial state of CLK

lastStateCLK = digitalRead(CLK);

}


void loop() {

        

// Read the current state of CLK

currentStateCLK = digitalRead(CLK);


// If last and current state of CLK are different, then pulse occurred

// React to only 1 state change to avoid double count

if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){


// If the DT state is different than the CLK state then

// the encoder is rotating CCW so decrement

if (digitalRead(DT) != currentStateCLK) {

counter --;

currentDir ="CCW";

} else {

// Encoder is rotating CW so increment

counter ++;

currentDir ="CW";

}


Serial.print("Direction: ");

Serial.print(currentDir);

Serial.print(" | Counter: ");

Serial.println(counter);

}


// Remember last CLK state

lastStateCLK = currentStateCLK;


// Read the button state

int btnState = digitalRead(SW);


//If we detect LOW signal, button is pressed

if (btnState == LOW) {

//if 50ms have passed since last LOW pulse, it means that the

//button has been pressed, released and pressed again

if (millis() - lastButtonPress > 50) {

Serial.println("Button pressed!");

}


// Remember last button press event

lastButtonPress = millis();

}


// Put in a slight delay to help debounce the reading

delay(1);

}


superior example

this code works for my purposes; this is a test format and the clock directions might be backwards. I don't care enough to check.


// Rotary Encoder Inputs

#define CLK 3

#define DT 1

#define SW 0

int counter = 0;

int currentStateCLK;

int lastStateCLK;

String currentDir ="";

unsigned long lastButtonPress = 0;

void setup() {       

  // Set encoder pins as inputs

  pinMode(CLK,INPUT);

  pinMode(DT,INPUT);

  pinMode(SW, INPUT_PULLUP);

  // Setup Serial Monitor

  Serial.begin(9600);

  // Read the initial state of CLK

  lastStateCLK = digitalRead(CLK);

}

void loop() {       

  // Read the current state of CLK

  currentStateCLK = digitalRead(CLK);

  // If last and current state of CLK are different, then pulse occurred

  // React to only 1 state change to avoid double count

  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){

    // If the DT state is different than the CLK state then

    // the encoder is rotating CCW so decrement

    if (digitalRead(DT) != currentStateCLK) {

      counter --;

      currentDir ="CCW";

    } else {

      // Encoder is rotating CW so increment

      counter ++;

      currentDir ="CW";

    }

    Serial.print("Direction: ");

    Serial.print(currentDir);

    Serial.print(" | Counter: ");

    Serial.println(counter);

  }

  // Remember last CLK state

  lastStateCLK = currentStateCLK;

  // Read the button state

  int btnState = digitalRead(SW);

  //If we detect LOW signal, button is pressed

  if (btnState == LOW) {

    //if 50ms have passed since last LOW pulse, it means that the

    //button has been pressed, released and pressed again

    if (millis() - lastButtonPress > 50) {

      Serial.println("Button pressed!");

    }

    // Remember last button press event

    lastButtonPress = millis();

  }

  // Put in a slight delay to help debounce the reading

  delay(1);

}