#include <AccelStepper.h>
#include <Arduino.h>
#include <Wire.h>

// ================================================================================================================
// *********************           Code to set Hall sensor     V1.0.1      05/12/2025         *********************
//
const int stepsPerMin = 1537;  // increase value if clock display falls behind, reduce if gaining.           ******
//
// ================================================================================================================
//

#define STEPPER_A 26  // 32
#define STEPPER_B 25  // 33
#define STEPPER_C 33  // 25
#define STEPPER_D 32  // 26
AccelStepper stepper(AccelStepper::FULL4WIRE, STEPPER_A, STEPPER_C, STEPPER_B, STEPPER_D);

#define nudgeButton 0
#define minuteButton 27
#define sensorInput 34
#define LED 2

bool currentSensorState;
bool previousSensorState;

void setup() {
  pinMode(nudgeButton, INPUT_PULLUP);   // enable/external button on ESP32 set to input
  pinMode(minuteButton, INPUT_PULLUP);  // external button on ESP32 set to input
  pinMode(sensorInput, INPUT);          // enable pin set to input
  pinMode(LED, OUTPUT);                 // in_built LED

  Wire.begin(21, 22);    // start iic
  Serial.begin(115200);  // start output to pc screen
  while (!Serial) {};
  // settup stepper parameters. Change these to suit your stepper if you want
  stepper.setMinPulseWidth(20);
  stepper.setMaxSpeed(600.0);
  stepper.setSpeed(600);
  stepper.setAcceleration(2000.0);
  stepper.setCurrentPosition(0);

  currentSensorState = digitalRead(sensorInput);  // read the value of the photo sensor
  previousSensorState != currentSensorState;      // set opposite state so code sets LED
}  // end setup

void loop() {
  stepper.run();  // run stepper function. Moves stepper 1 step if motion required.

  bool running = stepper.run();  // turn off stepper output if not running, reduce current and heat.
  if (!running)
    stepper.disableOutputs();

  bool nudgeButtonState = digitalRead(nudgeButton);  // test if nudge button pushed
  if (!nudgeButtonState && !running) {               // if nudge button pushed & stepper not rotaing, nudge stepper
    Serial.println("nudge button presssed");
    stepper.setSpeed(600);
    stepper.move(10);
  }

  bool minuteButtonState = digitalRead(minuteButton);  // test if advance 1 minute button pushed
  if (!minuteButtonState && !running) {                // if adv 1 min button pushed & stepper not rotaing, rotate stepper
    Serial.println("minute button presssed");
    stepper.setSpeed(600);
    stepper.setCurrentPosition(0);
    stepper.moveTo(stepsPerMin);
  }

  currentSensorState = digitalRead(sensorInput);   // read the value of the Hall sensor
  if (currentSensorState != previousSensorState) {  // if state changed, update LED
    previousSensorState = currentSensorState;     // update state

    if (currentSensorState == HIGH) {  // magnet not sensed
      Serial.println("Hall sensor clear");
      //  digitalWrite(LED, LOW); // turn on off
    }

    else  // sensor is clear
    {
      Serial.println("Hall sensor near magnet");
      //  digitalWrite(LED, HIGH); // turn on LED
    }
  }


  if (!nudgeButtonState || !minuteButtonState || !currentSensorState) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}
