#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <AccelStepper.h>

// OLED display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Rotary encoder pins
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4

// Stepper motor pins
#define MOTOR_PIN1 8
#define MOTOR_PIN2 9
#define MOTOR_PIN3 10
#define MOTOR_PIN4 11
AccelStepper stepper(AccelStepper::HALF4WIRE, MOTOR_PIN1, MOTOR_PIN3, MOTOR_PIN2, MOTOR_PIN4);

int speed = 350;  // Initial speed
int lastEncoderValue = 0;

void setup() {
  // OLED setup
  display.begin(SSD1306_I2C_ADDRESS, 0x3C);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Rotating Table");
  display.display();

  // Encoder setup
  pinMode(ENCODER_CLK, INPUT);
  pinMode(ENCODER_DT, INPUT);
  pinMode(ENCODER_SW, INPUT_PULLUP);

  // Stepper motor setup
  stepper.setMaxSpeed(1000);
  stepper.setSpeed(speed);

  attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, CHANGE);
}

void loop() {
  if (digitalRead(ENCODER_SW) == LOW) {
    stepper.setSpeed(0);
    displayMessage("Stopped");
    delay(500);
    while (digitalRead(ENCODER_SW) == LOW);
  } else {
    stepper.runSpeed();
  }
}

void readEncoder() {
  int clkValue = digitalRead(ENCODER_CLK);
  int dtValue = digitalRead(ENCODER_DT);
  if (clkValue == dtValue) {
    speed += 50;
  } else {
    speed -= 50;
  }
  if (speed < 0) speed = 0;
  stepper.setSpeed(speed);
  displayMessage("Speed: " + String(speed));
}

void displayMessage(String message) {
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("Rotating Table");
  display.setCursor(0, 10);
  display.println(message);
  display.display();
}
