// definiert Pin-Nummern

const  int stepPin = 6 ;
const  int dirPin = 7 ;
const  int enPin = 8 ;
const int tasterlinks = 10;
int wertalt10 = LOW;
const int tasterrechts = 11;
int wertalt11 = LOW;
int Geschwindigkeit;
int Geschwindigkeit1 = 100 ;
int Geschwindigkeit2 = 1000 ;
long zaehler = 0;
//------------------------------------
/* www.electronicsprojectshub.com */
/*Import following Libraries*/
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//I2C pins declaration
LiquidCrystal_I2C lcd(0x27, 16, 2);
//------------------------------------
#define encoderPinA 2
#define encoderPinB 3

long encoderPos = 100000;
float encoderPoslcd = 1.00000;
float encoderPoslcderr;
float encoderPostausch = 0.00000;
unsigned int lastReportedPos = 1;   // change management
static boolean rotating = false;    // debounce management

// interrupt service routine vars
boolean A_set = false;
boolean B_set = false;

//Taster vom Drehschalter
int pin_drehschalter = 4;
int Richtung = 5;

String text1 = "";
int anzahl_der_drehungen = 10;
int i, k = 0;
bool taster = false;
bool tasteralt = false;
bool richtung = false;
//int zeit = 0;//encoderPos ist der Startwert

int frei, tast;
int veraendern=0;
int aendern=0;
long schritte=0;
//------------------------------------
#define ledPin 13
void  setup () {

  Serial.begin(115200);  
  // Legt die beiden Pins als Ausgänge fest
  pinMode (stepPin, OUTPUT);
  pinMode (dirPin, OUTPUT);

  pinMode (enPin, OUTPUT);
  digitalWrite (enPin, LOW);
  //------------------------------------
  lcd.init(); //Initializing display
  lcd.backlight(); //To Power ON the back light
  lcd.print("   Controller");
  lcd.setCursor(0, 1);
  lcd.print("   Teilapperat");
  delay(2000);
  lcd.clear();
  //------------------------------------

  pinMode(ledPin, OUTPUT);  // Ausgabe LED festlegen
  pinMode(tasterlinks, INPUT);
  pinMode(tasterrechts, INPUT);
  // Timer 2
  noInterrupts();           // Alle Interrupts temporär abschalten
  TCCR2A = 0;
  TCCR2B = 0;

  TCNT2 = 34286;            // Timer nach obiger Rechnung vorbelegen
  TCCR2B |= (1 << CS22) | (1 << CS21);    // 256 als Prescale-Wert spezifizieren
  TIMSK2 |= (1 << TOIE2);   // Timer Overflow Interrupt aktivieren
  interrupts();             // alle Interrupts scharf schalten

  //------------------------------------

    //Drehschalter
  pinMode(encoderPinA, INPUT);
  pinMode(encoderPinB, INPUT);

  digitalWrite(encoderPinA, HIGH);  // turn on pullup resistors
  digitalWrite(encoderPinB, HIGH);  // turn on pullup resistors

  attachInterrupt(0, doEncoderA, CHANGE); // encoder pin on interrupt 0 (pin 2)
  attachInterrupt(1, doEncoderB, CHANGE); // encoder pin on interrupt 1 (pin 3)

  //Taster vom Drehschalter
  pinMode(pin_drehschalter, INPUT_PULLUP);
}
   

void loop () {
Display(); 
Encoder();
//Schrittmotor();
Geschwindigkeit = 6553;

   if (aendern==1)
{
  aendern=0;
  //schritte=encoderPos / 1125;
  
  //schritte=3200;
} 
  encoderPostausch=encoderPos;
  encoderPoslcd=encoderPostausch / 100000;
 //schritte=veraendern;
 //encoderPoslcderr=encoderPoslcderr+zaehler;
 encoderPoslcderr=zaehler;

richtung = !digitalRead(Richtung);

if (richtung == HIGH)
{
  digitalWrite (dirPin, HIGH);
} else digitalWrite (dirPin, LOW);

int wertneu10 = digitalRead(tasterlinks);
int wertneu11 = digitalRead(tasterrechts);

if(wertneu10 != wertalt10)
  {
    if(wertneu10 == HIGH)
    {
      Serial.println("Taster Links gedrückt");
    }
    else
    {
      Serial.println("Taster Links losgelassen");
    }
    // Remember the value for the next time.
    wertalt10 = wertneu10;
  }

if(wertneu11 != wertalt11)
  {
    if(wertneu11 == HIGH)
    {
      Serial.println("Taster Rechts gedrückt");
    }
    else
    {
      Serial.println("Taster Rechts losgelassen");
    }
    // Remember the value for the next time.
    wertalt11 = wertneu11;
  }
delay(100);
}
A4988