#include <MobaTools.h>
#include <EEPROM.h>

#define STEPS 4096 // Anzahl der Schritte des Motores ( 28BYJ-48 )

const byte Geschwindigkeit = 70; // Geschwindigkeit vom Stepper
int untererEndpunkt = -540;
const long obererEndpunkt = -20;


const byte endschalterPin = 3; // Zur Feststellung der Endposition - der Schalter verbindet den Pin mit GDN, wenn der Stepper die Lichtschranke erreicht hat
const byte Taster = 4; // Lichtschranke für Referenz
const byte JustageTaster = 18;
byte tasterState = HIGH;

MoToStepper stepper(STEPS, HALFSTEP); // Einrichten des Steppers

void setup() {
  Serial.begin(115200);
  stepper.attach(14, 15, 16, 17); // Nr. der Pins für den Stepper
  stepper.attachEnable(100);
  pinMode(endschalterPin, INPUT_PULLUP); // Lichtschranke schaltet nach Gnd
  pinMode(Taster, INPUT_PULLUP); // Taster für Stepperbewegung schaltet nach Gnd
  pinMode(JustageTaster, INPUT_PULLUP);


  stepper.setSpeed(10); // Geschwindigkeit in RPM*10
  stepper.rotate(1); // Die Drehrichtung muss hin zum Schalter sein! 1 = gegen den UZS, -1 = im UZS
  while (digitalRead(endschalterPin) == HIGH); // Warten bis der Endschalter anspricht
  stepper.rotate(0); // anhalten
  delay(500);
  stepper.setZero(); // Momentane Position als Nullpunkt einrichten
  stepper.writeSteps(obererEndpunkt); // zum oberen Endpunkt bewegen

  EEPROM.get(0, untererEndpunkt); // Initialisierung der Stepper-Positionen aus dem EEPROM
}

void loop() {

  // ------------------------- Justage -------------------------------

  if (digitalRead(JustageTaster) == LOW) {
    stepper.setSpeed(3); // Geschwindigkeit in RPM*10
    stepper.rotate(-1); // Langsames Weiterdrehen des Steppers während Justage
    while (digitalRead(JustageTaster) == LOW );
    stepper.stop();
    untererEndpunkt = stepper.readSteps(); // Speichern der neuen Position in der Variablen
    EEPROM.put(0, untererEndpunkt); // Speichern der neuen Position im EEPROM Nummer "0"
    stepper.setSpeed(Geschwindigkeit);
    stepper.writeSteps(obererEndpunkt); // zum oberen Endpunkt bewegen
  }

  // ------------------------ normaler Ablauf -------------------------

  if (digitalRead(Taster) == LOW && tasterState == HIGH) {
    tasterState = LOW;
    Serial.print("zum unteren Endpunkt: "); Serial.println(stepper.readSteps() );
    stepper.setSpeed(Geschwindigkeit / 2);
    stepper.writeSteps(untererEndpunkt); // zum unteren Endpunkt bewegen
  }

  if (digitalRead(Taster) == HIGH && tasterState == LOW) {
    tasterState = HIGH;
    Serial.println("zum oberen Endpunkt");
    stepper.setSpeed(Geschwindigkeit);
    stepper.writeSteps(obererEndpunkt); // zum oberen Endpunkt bewegen
  }
  //delay(20); //Taster entprellen
}