/*
   Nome do Projeto:  Bobinadeira
   Nome do Aquivo:   bobinadeira_Botao13.ino
   link: 			 http://labdegaragem.com/forum/topics/bobinadeira-autom-tica-controlada-com-arduino
   Dependencias:     funcoes13.ino
   MCU:              ATmega
   Board:            Arduino Uno/Mega/Mini
   Compilador        N/A
   IDE:              Arduino IDE 1.8.5
   Hardware:         Arduino UNO/MEGA/Mini
   Escrito por:      Rui Viana
   Modificado por:   N/A 
   Data:             23/06/2018
   Uso:              Didático
   Desenhos          CONTADOR2_SIMU.PDF
   Copyright @       N/A
   
   Este programa é software livre;
   e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
   mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
  
*/

//#define debug

#include <LiquidCrystal_I2C.h>                              // Biblioteca para uso LCD I2C
#include <Stepper.h>                                        // Biblioteca para uso do step motor
Stepper stepper(200, 12, 13);                               // Ports do step e steps por volta

//#ifdef  debug
//LiquidCrystal_I2C lcd(0x38,  2, 1, 0, 7, 6, 5, 4, 3, POSITIVE); // Debug
//#else
//LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//#endif
//LiquidCrystal lcd(11, 9, 6, 5, 4, 3);
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define brk 4                                               // Controle do break
#define BT1 5                                               // Botoes para controle do menu
#define BT2 6
#define BT3 7
#define BT4 8
#define BT5 9
#define encoder 10                                          // Entrada do encoder do motor principal
#define motor_carretel 11                                   // Port motor do carretel

int     numEsp         = 10;                                // Numero de espiras previstas
float   bitFio         =  1;                                // Bitola do fio em mm
float   carrLeng       = 10;                                // Comprimento do carretel
int     numEspAtual    =  0;                                // Numero de espirar atuais
bool    incrementou = false;                                // Controle de incremento de espiras
int     espFase        =  1;                                // N de espiras por etapa
int     espCam         =  0;                                // Calcula o numero de espira por camada
int     camf           =  0;                                // Numero de camada feita
float   dln            =  0;                                // Fator de correção de largura
float   dciclos        =  0;                                // Fator de correção passo
bool    isolador    = false;                                // Contrele de isolador de camada
int     menu           =  0;                                // Telas do sistema
int     conta          =  0;                                // Variavel encoder
int     conta_old      =  0;                                // Estado ant encoder
int     cstep          =  0;                                // Contador de passos
int     ciclos         =  0;                                // Calcula o numero de ciclos da guia linear para casa passo
bool    direct         =  1;                                // Sentido da guia
float   incrementa     =  1;                                // Offset de incremento
bool    pause       = false;                                // Contrele de pause
//---------------------------- SETUP -----------------------------
void setup()
{
  stepper.setSpeed(500);                                    // Define velocidade do step
  //lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  //lcd.begin(16, 2);  // Inicializa LCD
  pinMode(encoder, INPUT);                                  // Encoder como INPUT
  pinMode(brk, INPUT_PULLUP);                               // Break como INPUT
#ifdef  debug
  pinMode(encoder, INPUT_PULLUP);                           // Debug
#endif
  pinMode(BT1, INPUT_PULLUP);                               // Botoes como INPUT
  pinMode(BT2, INPUT_PULLUP);
  pinMode(BT3, INPUT_PULLUP);
  pinMode(BT4, INPUT_PULLUP);
  pinMode(BT5, INPUT_PULLUP);
  pinMode(motor_carretel, OUTPUT);                          // Port do motor do carretel como saida
  digitalWrite(motor_carretel, LOW);                        // Desliga motor do carretel
}
//---------------------------- LOOP -----------------------------
void loop()
{
  selecao();                                                // Rotina IHM
  cstep = 0;                                                // Zera contador de passos do step
  digitalWrite(motor_carretel, HIGH);                       // Liga motor de giro do carretel
  conta = digitalRead(encoder);                             // Atualiza a contagem de espiras
  if (conta == LOW and conta_old == HIGH)                   // Se sensor motor HIGH e conta_old LOW  (Houve ciclo do motor)
  {
    incrementou = true;                                     // Informa incremento de espiras
    numEspAtual++;                                          // Incrementa numero de espiras feitas
  }
  conta_old = conta;                                        // Atualiza contador de pulso
  if (incrementou == true)                                  // Houve incremento de espiras
  {
    LCDContagem();                                          // Mostra contagem de espiras e camadas
    incrementou = false;                                    // Desabilita informar incremento de espiras
    if (numEspAtual == numEsp)                              // Numero de espiras realizadas = num de espiras esperadas
    {
      digitalWrite(motor_carretel, LOW);                    // Desliga motor de giro do carretel
      endProcess();                                         // Para processo
    }
    if (numEspAtual < numEsp)                               // Numero de espiras realizadas < num de espiras esperadas
    {
      if (direct != LOW)                                    // Se direcao e CW
      {
        while (cstep < ciclos)                              // Enquanto contagem de passos for menor que ciclos
        {
          clockwise();                                      // Gira um step CW
          cstep = cstep + 1;                                // Incrementa contador de passos
        }
      }
      else                                                  // Se direcao e CCW
      {
        while (cstep < ciclos)                              // Enquanto contagem de passos for menor que ciclos
        {
          counterclockwise();                               // Gira um step CCW
          cstep = cstep + 1;                                // Incrementa contador de passos
        }
      }
      if (numEspAtual % espCam == 0)                        // Se modulo de qte de espiras por camada = 0
      {
        camf++;                                             // Incremen ta contador de camadas
        LCDContagem();                                      // Mostra contagem de espiras e camadas
        direct = not(direct);                               // Inverte direcao do step
        if (isolador == true)                               // Se precisa de isolador ligado
        {
          digitalWrite(motor_carretel, LOW);                // Desligue o motor do carretel
          int t = 0;                                        // Define t como inteiro e igual a zero  ??
          for (t = 0; t < 50;)                              // Faca 50 vezes ??
          {
            if (digitalRead(brk) == 0)                      // Se o brake foi pressionado
            {
              delay(500);                                   // Delay
              break;                                        // termine o for
            }
          }
        }
      }
      while (pause == HIGH)
      {
        digitalWrite(motor_carretel, LOW);                    // Desligue o motor do carretel
        if (digitalRead(brk) == 0)                            // Se o brake foi pressionado
        {
          delay(30);                                          // Debouncing
          if (digitalRead(brk) == 0)                          // Se o brake continua pressionado
          {
            pause = LOW;                                      // Desabilita pause
            delay(500);                                       // Delay
          }
        }
      }
    }
  }
  if (digitalRead(brk) == 0)                                // Se o brake foi pressionado
  {
    delay(30);                                              // Debouncing
    if (digitalRead(brk) == 0)                              // Se o brake continua pressionado
    {
      pause = HIGH;                                         // Habilita pause
    }
  }
}
//---------------------------- IMH -------------------------
void selecao()                                          // Seleciona parametros e menus
{
  if (menu == 0)                                        // Menu 0 - ajuste da guia
  { //                                                  // BT1 menu 1; BT2  5 steps; BT3 50 steps;  BT4 -5 steps;  BT5 -50 steps
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("Ajuste a guia de fio");                  // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print("e aperte ENTER para");                   // Print
    lcd.setCursor(0, 2);                                // Cursor LCD em 0,2
    lcd.print("     continuar");                        // Print
    lcd.setCursor(0, 2);                                // Cursor LCD em 0,2
    while (menu == 0)                                   // Enquanto for menu 0
    {
      if (digitalRead(BT1) == LOW)                      // Se muda de menu
      {
        menu = 1;                                       // Muda para o menu 1  seleciona funcao
        delay(600);                                     // Delay
      }
      else if (digitalRead(BT2) == LOW)                 // Se avança step em 5 steps
      {
        stepper.step(5);                                // 5 steps
        delay(20);                                      // Delay
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
      }
      else if (digitalRead(BT3) == LOW)                 // Se avança step em 50 steps
      {
        stepper.step(50);                               // 50 steps
        delay(20);                                      // Delay
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
      }
      else if (digitalRead(BT4) == LOW)                 // Se avança step em -5 steps
      {
        stepper.step(-5);                               // -5 steps
        delay(20);                                      // Delay
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
      }
      else if (digitalRead(BT5) == LOW)                 // Se avança step em -50 steps
      {
        stepper.step(-50);                              // -50 steps
        delay(20);                                      // Delay
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
      }
    }
  }
  if (menu == 1)                                        // Menu 1 - seleciona funcao
  { //                                                  // BT1; BT2 menu 8; BT3;  BT4 Configurar menu 2 ; BT5
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("ESCOLHA UMA OPCAO");                     // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print("ESQ.: configurar ");                     // Print
    lcd.setCursor(0, 2);                                // Cursor LCD em 0,2
    lcd.print("DIR.: iniciar ");                        // Print
    while (menu == 1)                                   // Enquanto menu = 1
    {
      if (digitalRead(BT2) == LOW)                      // Se Inicia processo
      {
        lcd.clear();                                    // LCD clear
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("****************************");      // Print
        lcd.clear();                                    // LCD clear
        lcd.setCursor(3, 1);                            // Cursor LCD em 3,1
        lcd.print("INICIA PROCESSO ");                  // Print
        delay(500);                                     // Delay
        menu = 8;                                       // Muda para o menu 8 Inicia processo / calculos
      }
      else if (digitalRead(BT4) == LOW)                 // Se selecionou configuracoes
      {
        lcd.clear();                                    // LCD clear
        lcd.setCursor(4, 0);                            // Cursor LCD em 4,0
        lcd.print("CONFIGURACOES");                     // Print
        delay(1000);                                    // Delay
        lcd.clear();                                    // LCD clear
        menu = 2;                                       // Muda para o menu 2 Numero de espiras
      }
    }
  }
  if (menu == 2)                                        // Menu 2 - Numero de espiras
  { //                                                  // BT1 menu 3; BT2 Incrementa * 10; BT3 Decrementa;  BT4 Incrementa / 10 ;  BT5 Incrementa
    incrementa = 1;                                     // Define incremento inicial
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("Num. de espiras:");                      // Numero de espiras
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print("       ");                               // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print(numEsp);                                  // Print
    lcd.setCursor(8, 1);                                // Cursor LCD em 8,1
    lcd.print(incrementa);                              // Print
    while (menu == 2)                                   // Enquanto menu  2
    { //                                                // Num. de espiras
      if (digitalRead(BT1) == LOW)
      {
        menu = 3;                                       // Muda para o menu 3 Bitola do fio
        delay(600);                                     // Delay
      }
      else if (digitalRead(BT2) == LOW)                 // Aumenta fator do incremento
      {
        incrementa = incrementa * 10;                   // Aumenta fator do incremento
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("      ");                            // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(numEsp);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT4) == LOW)                 // Diminui fator do incremento
      {
        incrementa = incrementa / 10;                   // Diminui fator do incremento
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("      ");                            // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(numEsp);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT3) == LOW)                 // Atualiza decremento
      {
        numEsp = numEsp - incrementa;                   // Atualiza decremento numero de espiras
        if (numEsp < 0)                                 // Se numero de espiras negativo
          numEsp = 0;                                   // Numero de espiras igual a zero
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("      ");                            // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(numEsp);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT5) == LOW)                 // Atualiza incremento
      {
        numEsp = numEsp + incrementa;
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("      ");                            // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(numEsp);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
    }
  }
  if (menu == 3)                                        // Menu 3 - Bitola do fio
  { //                                                  // BT1 menu 4; BT2 Incrementa * 10; BT3 Decrementa;  BT4 Incrementa / 10 ;  BT5 Incrementa
    incrementa = 1;                                     // Fator incrementa = 1
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("Bitola do fio (mm):");                   // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print(" ");                                     // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print(bitFio);                                  // Print
    lcd.setCursor(8, 1);                                // Cursor LCD em 8,1
    lcd.print(incrementa);                              // Print
    while (menu == 3)                                   // Enquanto menu 3
    { //                                                // Bitola do fio
      if (digitalRead(BT1) == LOW)                      // Muda para menu 4 Comprimento do carretel
      {
        menu = 4;                                       // Muda para menu 4 Comprimento do carretel
        delay(600);                                     // Delay
      }
      else if (digitalRead(BT2) == LOW)                 // Aumenta fator do incremento
      {
        incrementa = incrementa * 10;                   // Aumenta fator do incremento
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(bitFio);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT4) == LOW)                 // Diminui fator do incremento
      {
        incrementa = incrementa / 10;                   // Diminui fator do incremento
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(bitFio);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT3) == LOW)                 // Atualiza decremento
      {
        bitFio = bitFio - incrementa;                   // Atualiza decremento bitola do fio
        if (bitFio < 0)                                 // Se bitola do fio negativa
          bitFio = 0;                                   // Bitola do fio igual a 0
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(bitFio);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT5) == LOW)                 // Atualiza inecremento bitola do fio
      {
        bitFio = bitFio + incrementa;                   // Atualiza incremento
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(bitFio);                              // Print
        lcd.setCursor(8, 1);                            // Cursor LCD em 8,1
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
    }
  }
  if (menu == 4)                                        // Menu 4 - Comprimento do carretel
  { //                                                  // BT1 menu 5; BT2 Incrementa * 10; BT3 Incrementa;  BT4 Incrementa / 10 ;  BT5 Decrementa
    incrementa = 1;                                     // Fator incrementa = 1
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("Largura do carretel");                   // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print("   em milimetro:");                      // Print
    lcd.setCursor(0, 2);                                // Cursor LCD em 0,2
    lcd.print(" ");                                     // Print
    lcd.setCursor(0, 2);                                // Cursor LCD em 0,2
    lcd.print(carrLeng);                                // Print
    lcd.setCursor(8, 2);                                // Cursor LCD em 8,2
    lcd.print(incrementa);                              // Print
    while (menu == 4)                                   // Enquanto menu 4
    { //                                                // Largura do carretel
      if (digitalRead(BT1) == LOW)                      // Mudar para menu 5 Seleciona funcao
      {
        menu = 5;                                       // Muda para o menu 5 Seleciona funcao
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT2) == LOW)                 // Aumenta fator do incremento
      {
        incrementa = incrementa * 10;                   // Aumenta fator do incremento
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(carrLeng);                            // Print
        lcd.setCursor(8, 2);                            // Cursor LCD em 8,2
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT4) == LOW)                 // Diminui fator do incremento
      {
        incrementa = incrementa / 10;                   // Diminui fator do incremento
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(carrLeng);                            // Print
        lcd.setCursor(8, 2);                            // Cursor LCD em 8,2
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT3) == LOW)                 // Atualiza decremento
      {
        carrLeng = carrLeng - incrementa;               // Atualiza decremento largura carretel
        if (carrLeng < 0)                               // Se largura negativa
          carrLeng = 0;                                 // Largura igual a 0
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(carrLeng);                            // Print
        lcd.setCursor(8, 2);                            // Cursor LCD em 8,2
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
      else if ( digitalRead(BT5) == LOW)                // Atualiza incremento
      {
        carrLeng = carrLeng + incrementa;               // Atualiza incremento
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 2);                            // Cursor LCD em 0,2
        lcd.print(carrLeng);                            // Print
        lcd.setCursor(8, 2);                            // Cursor LCD em 8,2
        lcd.print(incrementa);                          // Print
        delay(500);                                     // Delay
      }
    }
  }
  if (menu == 5)                                        // Janela 5 - Seleciona funcao
  { //                                                  // BT1; BT2 menu 8; BT3;  BT4 inicio = 6;  BT5
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("ESCOLHA UMA OPCAO");                     // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print("ESQ.: + configuracao");                  // Print
    lcd.setCursor(0, 2);                                // Cursor LCD em 0,2
    lcd.print("DIR.: para iniciar ");                   // Print
    while (menu == 5)                                   // Enquanto menu = 5
    {
      if (digitalRead(BT2) == LOW)                      // Mudar para menu 9 Inicia processo
      {
        lcd.clear();                                    // LCD clear
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("****************************");      // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("INICIA PROCESSO ");                  // Print
        delay(500);                                     // Delay
        menu = 8;                                       // Muda para o menu 8
      }
      else if (digitalRead(BT4) == LOW)                 // Mudar para menu 6 define se tem isolação entre camadas
      {
        lcd.setCursor(0, 0);                            // Cursor LCD em 0,0
        delay(500);                                     // Delay
        lcd.clear();                                    // LCD clear
        menu = 6;                                       // Muda para o menu 6 define se tem isolação entre camadas
      }
    }
  }
  if (menu == 6)                                        // Menu 6 - define se tem isolação entre camadas
  { //                                                  // BT1 menu 7; BT2; BT3 NAO;  BT4;  BT5 SIM
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("ISOLACAO? +   -");                       // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.setCursor(5, 1);                                // Cursor LCD em 5,1
    lcd.print("    Sim Nao");                           // Print
    lcd.print(" ");                                     // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    while (menu == 6)                                   // Enquanto menu 6
    {
      if (digitalRead(BT1) == LOW)                      // Muda de menu
      {
        menu = 7;                                       // Muda para o menu 7 Fator de correcao de passo
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT3) == LOW)                 // Definir isolacao NAO
      {
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("NAO  ==");                           // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT5) == LOW)                 // Definir isolacao SIM
      {
        isolador = true;                                // Define audio ligado
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print("SIM  ==");                           // Print
        delay(500);                                     // Delay
      }
    }
  }
  if (menu == 7)                                        // Menu 7 - Fator de correcao de passo
  { //                                                  // BT1 menu 8; BT2; BT3 decrementa dciclos;  BT4;  BT5 Incrementa dciclos
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("Fcorrecao Avan % ");                     // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print(" ");                                     // Print
    lcd.setCursor(0, 1);                                // Cursor LCD em 0,1
    lcd.print(dciclos);                                 // Print
    while (menu == 7)                                   // Enquanto menu = 7
    { //                                                // Fcorrecao Avan %
      if (digitalRead(BT1) == LOW)                      // Muda de menu
      {
        menu = 8;                                       // Muda para o menu 8 Inicia processo / calculos
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT3) == LOW)                 // Decrementa fator de passo
      {
        dciclos = dciclos - 1;                          // Decrementa fator de passo
        if (dciclos < 0)                                // Se fator de passo negativo
          dciclos = 0;                                  // fator de passo igual a 0
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(dciclos);                             // Print
        delay(500);                                     // Delay
      }
      else if (digitalRead(BT5) == LOW )                // Incrementa fator de passo
      {
        dciclos = dciclos + 1;                          // Incrementa fator de passo
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(" ");                                 // Print
        lcd.setCursor(0, 1);                            // Cursor LCD em 0,1
        lcd.print(dciclos);                             // Print
        delay(500);                                     // Delay
      }
    }
  }
  if (menu == 8)                                        // Menu 8 - Inicia processo / calculos
  { //                                                  // BT1; BT2 direto = 0, menu 9; BT3;  BT4  direto = 1, menu 9;  BT5
    espCam = (carrLeng * 1 / bitFio) / (1 + dln / 100); // numero de espiras por camada
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("      SENTIDO");                         // Print
    lcd.setCursor(0, 2);                                // Cursor LCD em 0,2
    lcd.print(" ESQ <-- OU --> DIR");                   // Print
    while (menu == 8)                                   // Enquanto menu 8
    { //                                                // SENTIDO
      if (digitalRead(BT2) == LOW)                      // Define sentido CW
      {
        direct = 1;                                     // Sentido CW
        menu = 9;                                       // Inicia processo
      }
      else if (digitalRead(BT4) == LOW)                 // Define sentido CCW
      {
        direct = 0;                                     // Sentido CCW
        menu = 9;                                       // Inicia processo
      }
    }
    lcd.clear();                                        // LCD clear
    lcd.setCursor(0, 0);                                // Cursor LCD em 0,0
    lcd.print("PROCESSO ON ");                          // Print
    lcd.setCursor(3, 1);                                // Cursor LCD em 3,1
    lcd.print(" ");                                     // Print
    lcd.setCursor(2, 1);                                // Cursor LCD em 2,1
    lcd.setCursor(8, 1);                                // Cursor LCD em 08,1
    delay(1000);                                        // Delay
    lcd.clear();                                        // LCD clear
    lcd.setCursor(3, 1);                                // Cursor LCD em 3,1
    lcd.print(" ");                                     // Print
    lcd.setCursor(2, 0);                                // Cursor LCD em 2,0
    lcd.print("ESPIRAS  CAMADAS");                      // Print
    delay(500);                                         // Delay
    //                                                  // Calcula ciclos do step por espira
    ciclos = espFase * bitFio * 360 / (1 * 0.703125 * 1 * 3.14159 * 5) * 1.8 * (1 + dciclos / 100) / 0.2965;
    numEspAtual = 0;                                    // Zera contador de espiras feitas
    camf = 0;                                           // Zera contador de camadas feitas
    LCDContagem();                                      // Mostra contagem de espiras e camadas
  }
}
//--------------------------------------------------
void LCDContagem()                                      // Print contagem de espiras e camadas
{
  lcd.setCursor(3, 1);                                  // Cursor LCD em 3,1
  lcd.print(numEspAtual);                               // Print
  lcd.setCursor(12, 1);                                 // Cursor LCD em 12,1
  lcd.print(camf);                                      // Print
  lcd.setCursor(14, 1);                                 // Cursor LCD em 14,1
}
//---------------------------- FIM DE PROCESSO  --------------------------------
void endProcess()
{
  digitalWrite(motor_carretel, LOW );                     // Desliga motor do crretel
  lcd.clear();                                            // LCD clear
  lcd.print("Processo concluido");                        // Print
  lcd.setCursor(0, 1);                                    // Cursor LCD em 0,1
  lcd.print("com sucesso:");                              // Print
  lcd.setCursor(0, 2);                                    // Cursor LCD em 0,2
  lcd.print("Enrolamento com");                           // Print
  lcd.setCursor(0, 3);                                    // Cursor LCD em 0,3
  lcd.print(numEsp);                                      // Print
  lcd.setCursor(8, 3);                                    // Cursor LCD em 8,3
  lcd.print("Espiras");                                   // Print
  delay(300);                                             // Delay
  while (menu == 9)                                       // Enquanto menu 9
  {
    if (digitalRead(BT3) == LOW)                          // BT1;  BT2;  BT3 menu 0;  BT4;  BT5
    {
      menu = 0;                                           // menu inicial
    }
  }
}
//------------------------------- CCW --------------------------- // funcoes de acionamento do motor de passo
void counterclockwise ()                                    // Avanca step CCW
{
  stepper.step(1);                                          // Avanca um step CCW
}
//-------------------------------- CW ------------------------------
void clockwise()                                            // Avanca step CW
{
  stepper.step(-1);                                         // Avanca um step CW
}