/*
  Einstellungen am TB6600 für 200 Schritte pro Umdrehung
  und für den Nema 17 Motor mit 1,0 bis 1,2 Amp.
  Dippschalter 6   5   4   3   2   1
  Stellungen   0n  off on  off on  on
  und für den Nema 17 Motor mit 1,5 bis 1,7 Amp.
  Dippschalter 6   5   4   3   2   1
  Stellungen   off on  on  off on  on
*/
#include <Wire.h> // Kommunikation mit Arduino IDE
#include <LiquidCrystal_I2C.h> // LCD Display

// LCD Display´s haben Adresse 0x27 oder 0x3F !!
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define BAUD (115200)

//------Steuerung für den ersten Schrittmotor------------------
word x1 = 0;
word schritte1 = 3200;
byte richtung1 = HIGH;
byte schrittposition1 = 1;
// Der Microwert für pwzeit & whzeit nicht unter 200 !
unsigned long pwablauf1 = 0;// Pulswechselablaufzeit1
unsigned long whablauf1 = 0;// Wiederhohlablaufzeit1
unsigned long rampenstart1 = 500;// Microsekundenx2 pro Impuls bei Anfahrt
unsigned long rampenende1 = 200;//   Microsekundenx2 pro Impuls bei Voller Fahrt
unsigned long stopbeginn1 = 0;
unsigned long stopzeit1 = 5000;// Pausezeit von Stopp bis Anfahrt
word rampenrichtung1 = 1;
unsigned long mini1 = rampenstart1;
unsigned long maxi1 = rampenende1;
byte enabl1 = 6;
byte dir1 = 5;
byte puls1 = 4;
//--------------------------------------------------------------
//------Steuerung für den zweiten Schrittmotor------------------
word x2 = 0;
word schritte2 = 3200;
byte richtung2 = HIGH;
byte schrittposition2 = 1;
// Der Microwert für pwzeit & whzeit nicht unter 200 !!
unsigned long pwablauf2 = 0;// Pulswechselablaufzeit2
unsigned long whablauf2 = 0;// Wiederhohlablaufzeit2
unsigned long rampenstart2 = 500;   // Microsekundenx2 pro Impuls bei Anfahrt
unsigned long rampenende2 = 200;     // Microsekundenx2 pro Impuls bei Voller Fahrt
unsigned long stopbeginn2 = 0;
unsigned long stopzeit2 = 5000;
word rampenrichtung2 = 1;
unsigned long mini2 = rampenstart2;
unsigned long maxi2 = rampenende2;
byte enabl2 = 10;
byte dir2 = 9;
byte puls2 = 8;
//--------------------------------------------------------------
//------Steuerung für den dritten Schrittmotor------------------
word x3 = 0;
word schritte3 = 3200;
byte richtung3 = HIGH;
byte schrittposition3 = 1;
// Der Microwert für pwzeit & whzeit nicht unter 200 !!
unsigned long pwablauf3 = 0;// Pulswechselablaufzeit3
unsigned long whablauf3 = 0;// Wiederhohlablaufzeit3
unsigned long rampenstart3 = 500;  // Microsekundenx2 pro Impuls bei Anfahrt
unsigned long rampenende3 = 200;    // Microsekundenx2 pro Impuls bei Voller Fahrt
unsigned long stopbeginn3 = 0;
unsigned long stopzeit3 = 5000;
word rampenrichtung3 = 1;
unsigned long mini3 = rampenstart3;
unsigned long maxi3 = rampenende3;
byte enabl3 = 45;
byte dir3 = 44;
byte puls3 = 43;
unsigned long laufzeit = 0;
unsigned long laufzeitEnde = 0;
//--------------------------------------------------------------
void setup()
{
  Wire.begin();
  lcd.begin(20, 4);  // initialize the lcd for 20 chars 4 lines, turn on backlight
  lcd.backlight();   // LCD Beleuchtung ein
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Mot.1 ");
  lcd.print(schritte1);
  lcd.print(" Schritte");
  lcd.setCursor(0, 1);
  lcd.print("Temp1 ");
  lcd.print(rampenstart1);
  lcd.print("-");
  lcd.print(rampenende1);
  lcd.print(" Micro");
  lcd.setCursor(0, 2);
  lcd.print("Mot.2 ");
  lcd.print(schritte2);
  lcd.print(" Schritte");
  lcd.setCursor(0, 3);
  lcd.print("Temp2 ");
  lcd.print(rampenstart2);
  lcd.print("-");
  lcd.print(rampenende2);
  lcd.print(" Micro");
  Serial.begin(115200);
  //----------Steuerpins für den ersten Treiber aktivieren-------
  pinMode(enabl1, OUTPUT); // Enable1
  pinMode(dir1, OUTPUT); // Step1
  pinMode(puls1, OUTPUT); // Dir1
  digitalWrite(enabl1, HIGH); // Set Enable1 High
  //---------------------------------------------------------------
  //----------Steuerpins für den zweiten Treiber aktivieren--------
  pinMode(enabl2, OUTPUT); // Enable2
  pinMode(dir2, OUTPUT); // Step2
  pinMode(puls2, OUTPUT); // Dir2
  digitalWrite(enabl2, HIGH); // Set Enable2 High
  //---------------------------------------------------------------
  //----------Steuerpins für den dritten Treiber aktivieren--------
  pinMode(enabl3, OUTPUT); // Enable3
  pinMode(dir3, OUTPUT); // Step3
  pinMode(puls3, OUTPUT); // Dir3
  digitalWrite(enabl3, HIGH); // Set Enable3 High
  //---------------------------------------------------------------
}
void loop()
{
  laufzeit = micros();
  //---------------------------------------------------------------------
  //----------Treiber 1 aktivieren---------------------------------------
  //---------------------------------------------------------------------
  if (millis() - stopbeginn1 >= stopzeit1) {
    digitalWrite(enabl1, LOW); // Treiber Motor1 ein
    digitalWrite(dir1, richtung1); // Set Dir
    if (x1 < schritte1)    // Ziel noch nicht erreicht?
    {
      //----------------------Motor 1----------------------------------------
      //---------------------Schritt 1---------------------------------------
      if ((schrittposition1 == 1) && (micros() - whablauf1 >= mini1)) {
        digitalWrite(puls1, HIGH); // Step auf high
        schrittposition1 = 2;  // Steuerung für Schritt 1 einstellen
        pwablauf1 = micros(); // Timer für Schritt 1 starten
      }
      //----------------------Motor 1----------------------------------------
      //---------------------Schritt 2---------------------------------------
      if ((schrittposition1 == 2) && (micros() - pwablauf1 >= mini1)) {
        digitalWrite(puls1, LOW); // Step auf low
        schrittposition1 = 1;  // Steuerung für Schritt 0 einstellen
        whablauf1 = micros(); // Timer für Schritt 0 starten
        x1++;
        //-----------------------------------------------------------------
        //-----------------Rampensteuerung Motor1--------------------------
        if (x1 <= rampenstart1) {
          rampenrichtung1 = HIGH;
        } else {
          rampenrichtung1 = LOW;
        }
        if (rampenrichtung1 == HIGH) {
          if (mini1 > maxi1) {
            mini1 = mini1 - 1; // Rampe für Motor 1 Gas geben
          }
        }
        if (rampenrichtung1 == LOW) {
          if (x1 + rampenstart1 > schritte1) {
            mini1 = mini1 + 2; // Rampe für Motor 1 bremsen
          }
        }
        //-----------------------------------------------------------------
      }
    }
    //-------------------------Motor 1-------------------------------------
    //----------------------Ziel erreicht ?--------------------------------
    if (x1 == schritte1) {
      x1 = 0;
      richtung1 = !richtung1; // Dir Richtung wechseln
      mini1 = rampenstart1; //Rampe für Motor 1 Neustart
      digitalWrite(enabl1, HIGH);//Motor1 aus
      stopbeginn1 = millis();
    }
  }
  //---------------------------------------------------------------------


  //---------------------------------------------------------------------
  //----------Treiber 2 aktivieren---------------------------------------
  //---------------------------------------------------------------------
  if (millis() - stopbeginn2 >= stopzeit2) {
    digitalWrite(enabl2, LOW); // Treiber Motor2 ein
    digitalWrite(dir2, richtung2); // Set Dir
    if (x2 < schritte2)    // Ziel noch nicht erreicht?
    {
      //----------------------Motor 2--------------------------------------
      //---------------------Schritt 1-------------------------------------
      if ((schrittposition2 == 1) && (micros() - whablauf2 >= mini2)) {
        digitalWrite(puls2, HIGH); // Step auf HIGH
        schrittposition2 = 2;  // Steuerung für Schritt 1 einstellen
        pwablauf2 = micros(); // Timer für Schritt 1 starten
      }
      //----------------------Motor 2--------------------------------------
      //---------------------Schritt 2-------------------------------------
      if ((schrittposition2 == 2) && (micros() - pwablauf2 >= mini2)) {
        digitalWrite(puls2, LOW); // Step auf low
        schrittposition2 = 1;  // Steuerung für Schritt 0 einstellen
        whablauf2 = micros(); // Timer für Schritt 0 starten
        x2++;
        //-----------------------------------------------------------------
        //-----------------Rampensteuerung Motor2--------------------------
        if (x2 <= rampenstart2) {
          rampenrichtung2 = HIGH;
        } else {
          rampenrichtung2 = LOW;
        }
        if (rampenrichtung2 == HIGH) {
          if (mini2 > maxi2) {
            mini2 = mini2 - 1; // Rampe für Motor 1 Gas geben
          }
        }
        if (rampenrichtung2 == LOW) {
          if (x2 + rampenstart2 > schritte2) {
            mini2 = mini2 + 2; // Rampe für Motor 1 bremsen
          }
        }
        //----------------------------------------------------------------
      }
    }
    //-------------------------Motor 2------------------------------------
    //----------------------Ziel erreicht ?-------------------------------
    if (x2 == schritte2) {
      x2 = 0;
      mini2 = rampenstart2; //Rampe für Motor 2 Neustart
      richtung2 = !richtung2; // Dir Richtung wechseln
      digitalWrite(enabl2, HIGH);//Motor2 aus
      stopbeginn2 = millis();
    }
  }
  //--------------------------------------------------------------------

  //---------------------------------------------------------------------
  //----------Treiber 3 aktivieren---------------------------------------
  //---------------------------------------------------------------------
  if (millis() - stopbeginn3 >= stopzeit3) {
    digitalWrite(enabl3, LOW); // Treiber Motor3 ein
    digitalWrite(dir3, richtung3); // Set Dir
    if (x3 < schritte3)    // Ziel noch nicht erreicht?
    {
      //----------------------Motor 3--------------------------------------
      //---------------------Schritt 1-------------------------------------
      if ((schrittposition3 == 1) && (micros() - whablauf3 >= mini3)) {
        digitalWrite(puls3, HIGH); // Step auf high
        schrittposition3 = 2;  // Steuerung für Schritt 1 einstellen
        pwablauf3 = micros(); // Timer für Schritt 1 starten
      }
      //----------------------Motor 3--------------------------------------
      //---------------------Schritt 2-------------------------------------
      if ((schrittposition3 == 2) && (micros() - pwablauf3 >= mini3)) {
        digitalWrite(puls3, LOW); // Step auf low
        schrittposition3 = 1;  // Steuerung für Schritt 0 einstellen
        whablauf3 = micros(); // Timer für Schritt 0 starten
        x3++;
        //-----------------------------------------------------------------
        //-----------------Rampensteuerung Motor3--------------------------
        if (x3 <= rampenstart3) {
          rampenrichtung3 = HIGH;
        } else {
          rampenrichtung3 = LOW;
        }
        if (rampenrichtung3 == HIGH) {
          if (mini3 > maxi3) {
            mini3 = mini3 - 1; // Rampe für Motor 1 Gas geben
          }
        }
        if (rampenrichtung3 == LOW) {
          if (x3 + rampenstart3 > schritte3) {
            mini3 = mini3 + 2; // Rampe für Motor 1 bremsen
          }
        }
        //----------------------------------------------------------------
      }
    }
    //-------------------------Motor 3------------------------------------
    //----------------------Ziel erreicht ?-------------------------------
    if (x3 == schritte3) 
    {
      laufzeitEnde = micros();
      Serial.println("test");
      Serial.println(laufzeitEnde - laufzeit);  // 40
      Serial.println(mini3);                    // 1200
      Serial.println(maxi3);                    //  200
      Serial.println(x3);                       // 3200
      x3 = 0;
      mini3 = rampenstart3; //Rampe für Motor 3 Neustart
      richtung3 = !richtung3; // Dir Richtung wechseln
      digitalWrite(enabl3, HIGH);//Motor3 aus
      stopbeginn3 = millis();
    }
  }
  //--------------------------------------------------------------------

}