#include <Servo.h>

#define ENCODER_CLK 2
#define ENCODER_DT  3
#define ENCODER_SW  4

int servoPin = 11;
int servoPos = 90;
Servo servo1;

volatile int lastClkState = HIGH;
volatile int lastDtState = HIGH;
volatile int lastButtonState = HIGH;

void setup() {
  Serial.begin(115200);
  pinMode(ENCODER_CLK, INPUT);
  pinMode(ENCODER_DT, INPUT);
  pinMode(ENCODER_SW, INPUT_PULLUP); // Enable internal pull-up resistor for the switch
  servo1.attach(servoPin);

  attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), clkISR, FALLING);
}

void loop() {
  servo1.write(servoPos);

  int buttonState = digitalRead(ENCODER_SW);

  if (buttonState != lastButtonState) {
    servoPos = 90; // Reset servo position when button is pressed
    lastButtonState = buttonState;
  }
}

void clkISR() {
  int dtState = digitalRead(ENCODER_DT);
  
  if (dtState == HIGH) {
    Serial.println("Rotated clockwise ⏩");
    if (servoPos < 180) {
      servoPos += 10;
    }
  } else {
    Serial.println("Rotated counterclockwise ⏪");
    if (servoPos > 0) {
      servoPos -= 10;
    }
  }
  servo1.write(servoPos);
}