#define step 12
#define dir 11
#define esquerda 10
#define direita 8
#define setIn 9
#define ledIn 13
#define setOut 7
#define reset 6
bool estadoEsquerda;
bool estadoDireita;
bool estadoIn;
bool estadoOut;
int pontoIn = 0;
int pontoOut = 0;
int x = 0;
int curso;
bool pontosOk = LOW;
bool alternaBotao = LOW;
int velocidadePadrao;
int velocidadeCena;
int soma;
int t;
int cortaRabo;
void setup() {
digitalWrite(reset, HIGH);
Serial.begin(9600);  
pinMode(step, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(ledIn, OUTPUT);
pinMode(esquerda, INPUT_PULLUP);
pinMode(direita, INPUT_PULLUP);
pinMode(setIn, INPUT_PULLUP);
pinMode(setOut, INPUT_PULLUP);
pinMode(reset, OUTPUT);
velocidadePadrao = 300;
velocidadeCena = 1000;
for (int i = 0; i<=1; i++){  //  zerar passos
  digitalWrite(dir, HIGH);
  digitalWrite(step, HIGH);
  delayMicroseconds(800);
  digitalWrite(step, LOW);
  delayMicroseconds(800);  
  }
  digitalWrite(ledIn, HIGH);          //       acende o led por 2 segundos
  delay(1000);
  digitalWrite(ledIn, LOW);
}
void loop() {
if (pontoOut==0){
  estadoDireita = !digitalRead(direita);
  estadoEsquerda = !digitalRead(esquerda);
  estadoIn = !digitalRead(setIn);
  estadoOut = !digitalRead(setOut);
    if (estadoDireita == HIGH){
      digitalWrite(dir, HIGH);
      digitalWrite(step, HIGH);
      delayMicroseconds(800);
      digitalWrite(step, LOW);
      delayMicroseconds(800);
      x=x+1;
      }
    if (estadoEsquerda == HIGH){
      digitalWrite(dir, LOW);
      digitalWrite(step, HIGH);
      delayMicroseconds(800);
      digitalWrite(step, LOW);
      delayMicroseconds(800);
      x=x-1;
      }
    //**********************************************************************************************
    if (estadoIn == HIGH && alternaBotao == LOW){
      alternaBotao = HIGH;
      pontoIn = x;
      pisca();
      delay(500);
      estadoIn = LOW;
      delay(500);
      }
      if (estadoIn == HIGH && alternaBotao == HIGH){
      pontoOut = x;
      soma=pontoOut-pontoIn;
      
      if (soma == 0){
        recarrega();
      }
      else{
      pisca();
      curso = pontoOut - pontoIn;
      pontosOk = HIGH;
      delay(1000);
      }
      }
    if (pontosOk == HIGH){                        //    indo para zero
        Serial.println("indo para zero");
          for (int i = 1; i <= curso; i++){
              digitalWrite(dir, LOW);
              digitalWrite(step, HIGH);
              delayMicroseconds(velocidadePadrao);
              digitalWrite(step, LOW);
              delayMicroseconds(velocidadePadrao);
              }
          delay(1000);
        Serial.println("fazendo a cena");           //   fazendo a cena
            int t=2000;
            for (int i = 1; i<= curso - (curso/5); i++){
              digitalWrite(dir, HIGH);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t-2;
              if (t <= 300){
                t=300;
              }
              }
              
              int cortaRabo = curso / 5;
            
              for (int i = 1; i<= cortaRabo; i++){
              digitalWrite(dir, HIGH);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t+4;
              }
               
        delay(1000);            //           Repete a cena
        if (pontosOk == HIGH){                        //    indo para zero
        Serial.println("Cena invertida");
          t=2000;
            for (int i = 1; i<= curso - (curso/5); i++){
              digitalWrite(dir, LOW);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t-2;
              if (t <= 300){
                t=300;
              }
              }
              
              cortaRabo = curso / 5;
            
              for (int i = 1; i<= cortaRabo; i++){
              digitalWrite(dir, LOW);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t+4;
              }
// ======================================================================================
        delay(1000);
        Serial.println("Repetindo a cena");           //   Repetindo a cena
            int t=2000;
            for (int i = 1; i<= curso - (curso/5); i++){
              digitalWrite(dir, HIGH);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t-2;
              if (t <= 300){
                t=300;
              }
              }
              
              cortaRabo = curso / 5;
            
              for (int i = 1; i<= cortaRabo; i++){
              digitalWrite(dir, HIGH);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t+4;
              }
//  ***********************************************************************
        delay(1000);
              
        Serial.println("Repetindo a Cena invertida");
          t=2000;
            for (int i = 1; i<= curso - (curso/5); i++){
              digitalWrite(dir, LOW);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t-2;
              if (t <= 300){
                t=300;
              }
              }
              
              cortaRabo = curso / 5;
            
              for (int i = 1; i<= cortaRabo; i++){
              digitalWrite(dir, LOW);
              digitalWrite(step, HIGH);
              delayMicroseconds(t);
              digitalWrite(step, LOW);
              delayMicroseconds(t);
              t=t+4;
              }
        Serial.println("FIM");
        delay(500);
        encerra();
    }
    }
}
}
void pisca(){
  for (int i = 1; i<=3; i++){
      digitalWrite(ledIn, HIGH);
      delay(150);
      digitalWrite(ledIn, LOW);
      delay(150);
  }
}
void recarrega(){
    for (int i = 1; i<=1; i++){
      digitalWrite(ledIn, HIGH);
      delay(1000);
      digitalWrite(ledIn, LOW);
      delay(500);
  }
  digitalWrite(reset, LOW);
}
void encerra(){
  digitalWrite(reset, LOW);
}