CCCPaste

2RotaryEncoders_in_function blocks

/* Rotary Encoder example code, modified to
 *  read 2 rotary encoders (A,B) and thier switches.
 *  https://lastminuteengineers.com/rotary-encoder-arduino-tutorial/
*/
//Will need to change how images get drawn using the EthernatCleint,
// Rotary Encoder Inputs
#define CLKA 2
#define DTA 3
#define SWA 4

#define CLKB 5
#define DTB 6
#define SWB 7

int Acounter = 0;
int Bcounter = 0;

int AcurrentStateCLK;
int BcurrentStateCLK;

int AlastStateCLK;
int BlastStateCLK;

String AcurrentDir ="";  //just easier than cleverly combining this string for seprate IO
String BcurrentDir ="";

unsigned long AlastButtonPress = 0;
unsigned long BlastButtonPress = 0;

/*Function Defs*/
void rotorSense();
void rotorA();
void rotorB();

void setup() {
  
  // Set encoder pins as inputs
  pinMode(CLKA,INPUT);
  pinMode(DTA,INPUT);
  pinMode(SWA, INPUT_PULLUP);
  pinMode(CLKB,INPUT);
  pinMode(DTB,INPUT);
  pinMode(SWB, INPUT_PULLUP);

  // Setup Serial Monitor
  Serial.begin(9600);

  // Read the initial state of CLK
  AlastStateCLK = digitalRead(CLKA);
  BlastStateCLK = digitalRead(CLKB);

}

void loop() {
  rotorSense();
  //rotorA();
  //rotorB();

  
 // Put in a slight delay to help debounce the reading
  delay(1);
} //end loop

void rotorA(){
 // Read the current state of CLK
  AcurrentStateCLK = digitalRead(CLKA);

  // If last and current state of CLK are different, then pulse occurred
  // React to only 1 state change to avoid double count
  if (AcurrentStateCLK != AlastStateCLK  && AcurrentStateCLK == 1){

    // If the DT state is different than the CLK state then
    // the encoder is rotating CCW so decrement
    if (digitalRead(DTA) != AcurrentStateCLK) {
      Acounter --;
      AcurrentDir ="CCW";
    } else {
      // Encoder is rotating CW so increment
      Acounter ++;
      AcurrentDir ="CW";
    }
    Serial.print("A Direction: ");
    Serial.print(AcurrentDir);
    Serial.print(" | Counter: ");
    Serial.println(Acounter);
  }
  int AbtnState = digitalRead(SWA);

  //If we detect LOW signal, button is pressed
  if (AbtnState == LOW) {
    //if 50ms have passed since last LOW pulse, it means that the
    //button has been pressed, released and pressed again
    if (millis() - AlastButtonPress > 500) {
      Serial.println("Button A pressed!");
    }
  AlastButtonPress = millis();
  }
  // Remember last CLK state
  AlastStateCLK = AcurrentStateCLK;
//endA


  }
void rotorB(){
  
  BcurrentStateCLK = digitalRead(CLKB);
  // If last and current state of CLK are different, then pulse occurred
  // React to only 1 state change to avoid double count
  if (BcurrentStateCLK != BlastStateCLK  && BcurrentStateCLK == 1){

    // If the DT state is different than the CLK state then
    // the encoder is rotating CCW so decrement
    if (digitalRead(DTB) != BcurrentStateCLK) {
      Bcounter --;
      BcurrentDir ="CCW";
    } else {
      // Encoder is rotating CW so increment
      Bcounter ++;
      BcurrentDir ="CW";
    }

    Serial.print("B Direction: ");
    Serial.print(BcurrentDir);
    Serial.print(" | Counter: ");
    Serial.println(Bcounter);
  }  
  BlastStateCLK = BcurrentStateCLK;
  // Read the button state
  int BbtnState = digitalRead(SWB);
    if (BbtnState == LOW) {
    //if 50ms have passed since last LOW pulse, it means that the
    //button has been pressed, released and pressed again
    if (millis() - BlastButtonPress > 50) {
      Serial.println("Button B pressed!");
    }
  
 // Remember last button press event
    BlastButtonPress = millis();
  }
//endB
}
void rotorSense(){
  rotorA();
  rotorB();
  }