/*
//https://wokwi.com/projects/329724051956171348
Справка
//https://3deshnik.ru/wiki/index.php/%D0%94%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80_A4988
//https://robototehnika.ru/e-store/catalog/356/949/
//https://lastminuteengineers.com/a4988-stepper-motor-driver-arduino-tutorial/ Пример с библиотекой
//https://github.com/waspinator/AccelStepper
//https://wokwi.com/projects/327414013584474708
//Пример https://arduino-tex.ru/news/14/kak-podklyuchit-a4988-drv8825-k-arduino-sketch-biblioteka.html
*/
/*Программа написана Федоровым Александром HOME LABORATORY ©
   https://fedoroffalexander.wixsite.com/smart,
  Написано для Сергея Листухина c использованием его кода, 
  оборудования и схем. Апрель 2022.
  Программа написана на основе свободно распространяемых в Интернет
  библиотек и кода. Распространяется свободно для частного и коммерческого
  испоьзования. Код не гарантирует надежной работы устройств управления.
  Ответственность за использование этого кода лежит на его пользователе.
*/
#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
#include "GyverButton.h"
#include "AnalogKey.h"
GButton btn_Left(27);
GButton btn_Right(12);
GButton btn_Up(13);
GButton btn_Down(14);
GButton btn_Enter(26);
#include "GyverTimer.h"
int Freq_signal = 1000;
GTimer myTimer(MS, Freq_signal);    // создать миллисекундный таймер
//GTimer myTimer(US);    // US - микросекундный
#define PIN_RECEIVER 2   // Signal Pin of IR receiver
#define UP 1
#define DOWN 0
#define ERASESCREEN true
#define NOERASESCREEN false
#define OffUpDown 3
IRrecv receiver(PIN_RECEIVER);
//1 - означает внешний шаговый драйвер с выводами Step и Direction
//NEMA 17 делает 200 шагов за оборот
//Параметры (режим, step, dir)
AccelStepper Stepper(1,10,11); 
float analogReadingA7 = 0; float analogReadingA0 = 0; float analogReadingA1 = 0; 
float analogReadingA2 = 0; float analogReadingA3 = 0; float analogReadingA4 = 0;
float analogReadingA5 = 0;
int activScreen = 0;
int menuPositionMain = 1; int menuPositionProtyazhka1 = 0; int menuPositionProtyazhka2 = 3;
int menuPositionSpaika = 0;
int selectColor = 0;
float setThickness = 0.3;
int setTemperatureProtyazhka = 200; int TemperatureProtyazhka = 200;
int setTemperatureSpaika = 150; int TemperatureSpaika = 0.0;
int setTemperatureSpaikaR = 160; int TemperatureSpaikaR = 600;
int selectSpeed = 100; int Speed = 0;
String ProtyazhkaOnOff = "OFF"; String SpaikaOnOff = "OFF"; 
String NamotkaOnOff = "OFF";
String NagrevD5 = "*";
bool ClickProtyazhkaOnOff = false; bool ClickSpaikaOnOff = false; 
bool ClickNamotkaOnOff = false;
bool edit = false;
int counter=0;
// указываем пин и количество кнопок
AnalogKey<A7, 5> keys;
GButton btnDown, btnLeft, btnOK, btnRight, btnUp;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void helloScreen(bool erase) {
  if(erase) lcd.clear();
  lcd.setCursor(2, 1); lcd.print("PET_ BULL");
  lcd.setCursor(2, 2); lcd.print("Project V 1.0.5");
  activScreen = 0;
}
void mainScreen(bool erase, int UpDown) {
  //Очистить если true
  if(erase) {
    lcd.clear();
    menuPositionMain = 1;
  }
  if(UpDown == UP) menuPositionMain--;
  if(UpDown == DOWN) menuPositionMain++;  
  lcd.setCursor(5, 0); lcd.print("MAIN MENU");
  lcd.setCursor(2, 1); lcd.print("PROTYZKA");
  lcd.setCursor(2, 2); lcd.print("SPAIKA");
  lcd.setCursor(2, 3); lcd.print("NAMOTKA");
  lcd.setCursor(17, 3); lcd.print(NamotkaOnOff);
  
  //"DOWN"
  if(UpDown == DOWN) {
    lcd.setCursor(0, menuPositionMain-1);
    lcd.print(" ");
    if(menuPositionMain > 3) menuPositionMain = 1;
    
  }
  if(UpDown == UP) {
    lcd.setCursor(0, menuPositionMain+1);
    lcd.print(" ");
    if(menuPositionMain < 1) menuPositionMain = 3;
    
  }
  lcd.setCursor(0, menuPositionMain);
  //lcd.print(">");
  lcd.print(char(126));
  activScreen = 1;
}
void protyazhka1Screen(bool erase, int UpDown) {
  if(erase) {
    lcd.clear();
    menuPositionProtyazhka1 = 0;
  }
  if(UpDown == UP) menuPositionProtyazhka1--;
  if(UpDown == DOWN) menuPositionProtyazhka1++;  
  lcd.setCursor(2, 0); lcd.print("COLOR = "); lcd.print(selectColor);
  lcd.setCursor(2, 1); lcd.print("TOLCHINA = "); lcd.print(setThickness); lcd.print(" mm"); 
  lcd.setCursor(2, 2); lcd.print("T  = "); lcd.print(setTemperatureProtyazhka); lcd.print(" C"); lcd.print((char)223);lcd.print(" ");
  lcd.setCursor(2, 3); lcd.print("Sp = "); lcd.print(selectSpeed); lcd.print(" step/s");
  //"DOWN"
  if(UpDown == DOWN) {
    lcd.setCursor(0, menuPositionProtyazhka1-1);
    lcd.print(" ");
    if(menuPositionProtyazhka1 > 3) menuPositionProtyazhka1 = 0;
    
  }
  if(UpDown == UP) {
    lcd.setCursor(0, menuPositionProtyazhka1+1);
    lcd.print(" ");
    if(menuPositionProtyazhka1 < 0) menuPositionProtyazhka1 = 3;
    
  }
  //Serial.println(menuPositionProtyazhka1);
  lcd.setCursor(0, menuPositionProtyazhka1);
  //lcd.print(">");
  lcd.print(char(126));
  activScreen = 2;
}
void protyazhka2Screen(bool erase, int UpDown) {
  if(erase) {
    lcd.clear();
    menuPositionProtyazhka2 = 3;
  }
  if(UpDown == UP) menuPositionProtyazhka2--;
  if(UpDown == DOWN) menuPositionProtyazhka2++;  
  lcd.setCursor(2, 0); lcd.print("T  "); lcd.print(setTemperatureProtyazhka); lcd.print("/ ");
  lcd.print(TemperatureProtyazhka); lcd.print(" C"); lcd.print((char)223);lcd.print(" ");
  lcd.setCursor(19, 0); lcd.print(NagrevD5);
  lcd.setCursor(2, 1); lcd.print("Sp "); lcd.print(selectSpeed); lcd.print("/ "); lcd.print(Speed); lcd.print(" step/s");
  lcd.setCursor(2, 2); lcd.print("COUNTER "); lcd.print(counter); lcd.print(" m");
  lcd.setCursor(8, 3); lcd.print(ProtyazhkaOnOff);
  
  //"DOWN"
  if(UpDown == DOWN) {
    lcd.setCursor(0, menuPositionProtyazhka2-1);
    lcd.print(" ");
    //Serial.println()
    if(menuPositionProtyazhka2 > 3) menuPositionProtyazhka2 = 2;
    
  }
  if(UpDown == UP) {
    lcd.setCursor(0, menuPositionProtyazhka2+1);
    lcd.print(" ");
    if(menuPositionProtyazhka2 < 2) menuPositionProtyazhka2 = 3;
    
  }
  lcd.setCursor(0, menuPositionProtyazhka2);
  //lcd.print(">");
  lcd.print(char(126));
  activScreen = 3; 
  
}
void spaikaScreen(bool erase, int UpDown) {
  if(erase) {
    lcd.clear();
    menuPositionSpaika = 0;
  }
  if(UpDown == UP) menuPositionSpaika--;
  if(UpDown == DOWN) menuPositionSpaika++;
  lcd.setCursor(2, 0); lcd.print("Tn = "); lcd.print(setTemperatureSpaika); 
    lcd.print(" / "); lcd.print(TemperatureSpaika); lcd.print(" C "); 
    lcd.print((char)223);
  lcd.setCursor(19, 0); lcd.print(NagrevD5);
  lcd.setCursor(2, 1); lcd.print("Tr = "); lcd.print(setTemperatureSpaikaR); 
    lcd.print(" / "); lcd.print(TemperatureSpaikaR); lcd.print(" C"); 
    lcd.print((char)223); lcd.print(" ");
  lcd.setCursor(8, 2); lcd.print(SpaikaOnOff);
  lcd.setCursor(0, menuPositionSpaika);
  //"DOWN"
  if(UpDown == DOWN) {
    lcd.setCursor(0, menuPositionSpaika-1);
    lcd.print(" ");
    if(menuPositionSpaika > 2) menuPositionSpaika = 0;
  }
  if(UpDown == UP) {
    lcd.setCursor(0, menuPositionSpaika+1);
    lcd.print(" ");
    if(menuPositionSpaika < 0) menuPositionSpaika = 2;
  }
  lcd.setCursor(0, menuPositionSpaika);
  lcd.print(char(126)); //lcd.print(">");
  activScreen = 4; 
}
void translateIR()
{
  // Takes command based on IR code received
  switch (receiver.decodedIRData.command) {
    case 2:
      // "PLUS" UP**************
      if(edit == false) {
        if(activScreen == 1) { mainScreen(NOERASESCREEN, UP); break; }
        if(activScreen == 2) { protyazhka1Screen(NOERASESCREEN, UP); break; }
        if(activScreen == 3) {protyazhka2Screen(NOERASESCREEN, UP); break;}
        if(activScreen == 4) {spaikaScreen(NOERASESCREEN, UP); break;}
      }
      if(edit == true) {
        if(activScreen == 2) {
          if(menuPositionProtyazhka1 == 0) ++selectColor;
          if(menuPositionProtyazhka1 == 1) setThickness = setThickness+0.1;
          if(menuPositionProtyazhka1 == 2) ++setTemperatureProtyazhka;
          if(menuPositionProtyazhka1 == 3) ++selectSpeed;
          protyazhka1Screen(NOERASESCREEN, OffUpDown); break;
        }
        if(activScreen == 4) {
          if(menuPositionSpaika == 0) ++setTemperatureSpaika; 
          if(menuPositionSpaika == 1) ++setTemperatureSpaikaR;
          spaikaScreen(NOERASESCREEN, OffUpDown); break;
        }
      }
    break;
    //************************UP
    case 224:
      //"PREV." LEFT
      if(edit == false) {
        if(activScreen == 3) { protyazhka1Screen(ERASESCREEN, OffUpDown); break; }
        if(activScreen == 2) { mainScreen(ERASESCREEN, OffUpDown); break; }
        if(activScreen == 1) { helloScreen(ERASESCREEN); break; }
        if(activScreen == 4) { mainScreen(ERASESCREEN, OffUpDown); break; }
      }
    break;
 
    case 168:
      //"PLAY" ВЫБОР
      //MAIN экран******************************************************
      //****************************************************************
      if(activScreen == 1) {
        if(menuPositionMain == 1) { protyazhka1Screen(ERASESCREEN, OffUpDown); break; }
        if(menuPositionMain == 2) { spaikaScreen(ERASESCREEN, OffUpDown); break; }
        //Включить/выключить кнопку ON/OFF
        if(menuPositionMain == 3) {
          ClickNamotkaOnOff = !ClickNamotkaOnOff;
          if(ClickNamotkaOnOff == true) NamotkaOnOff = "ON ";
          if(ClickNamotkaOnOff == false) NamotkaOnOff = "OFF";
          mainScreen(NOERASESCREEN, OffUpDown);
          break;
        }
      }
       //Экран ПРОТЯЖКА1 **********************************************
      //**************************************************************
      if(activScreen == 2) {
         if(menuPositionProtyazhka1 == 0) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 0); lcd.blink(); break; }
          if(edit == false) { lcd.noBlink(); break; }
        }
        if(menuPositionProtyazhka1 == 1) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 1); lcd.blink(); break; }
          if(edit == false) { lcd.noBlink(); break; }
        }
        if(menuPositionProtyazhka1 == 2) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 2); lcd.blink(); break; }
          if(edit == false) { lcd.noBlink(); break; }
        }
        if(menuPositionProtyazhka1 == 3) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 3); lcd.blink(); break; }
          if(edit == false) { lcd.noBlink(); break; }
        }
        break;
      }
      //Экран ПРОТЯЖКА2 **********************************************
      if(activScreen == 3) {
         //Очистить/сбросить счетчик
         if(menuPositionProtyazhka2 == 2) {
          lcd.setCursor(2, 2); lcd.print("COUNTER "); lcd.print("     ");
          counter = 0;
          break;
        }
        //Включить/выключить кнопку ON/OFF
        if(menuPositionProtyazhka2 == 3) {
          ClickProtyazhkaOnOff = !ClickProtyazhkaOnOff;
          lcd.setCursor(8, 3); lcd.print("    ");
          if(ClickProtyazhkaOnOff == true) {
            ProtyazhkaOnOff = "ON";
          }
          if(ClickProtyazhkaOnOff == false) {
            ProtyazhkaOnOff = "OFF";
          }
          break;
        }
        break;
      }
      //Экран СПАЙКА************************************************** 
      if(activScreen == 4) {
        //Включить/выключить кнопку ON\OFF
        if(menuPositionSpaika == 2) {
          ClickSpaikaOnOff = !ClickSpaikaOnOff;
          lcd.setCursor(8, 2); lcd.print("    ");
          if(ClickSpaikaOnOff == true) SpaikaOnOff = "ON";
          if(ClickSpaikaOnOff == false) SpaikaOnOff = "OFF";
          break;
        }
        //Маркер 1 строчки Экрана СПАЙКА
        if(menuPositionSpaika == 0) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 0); lcd.blink(); break; }
          if(edit == false) { lcd.noBlink(); break; }
        }
        //Маркер 2 строчки Экрана СПАЙКА
        if(menuPositionSpaika == 1) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 1); lcd.blink(); break; }
          if(edit == false) { lcd.noBlink(); break; }
        }
      }
    //************************************************Экран СПАЙКА
    break;
    case 144:
      //"NEXT" RIGHT
      if(edit == false) {
        if(activScreen == 2) { protyazhka2Screen(ERASESCREEN, OffUpDown); break;}
        if(activScreen == 0) { mainScreen(ERASESCREEN, OffUpDown); break;}
      }
    break;
    case 152:
      //"MINUS" DOWN
    if(edit == false) {
      if(activScreen == 1) { mainScreen(NOERASESCREEN, DOWN); break;}
      if(activScreen == 2) { protyazhka1Screen(NOERASESCREEN, DOWN); break;}
      if(activScreen == 3) { protyazhka2Screen(NOERASESCREEN, DOWN); break;}
      if(activScreen == 4) { spaikaScreen(NOERASESCREEN, DOWN); break;}
    }
    if(edit == true) {
      if(activScreen == 2) {
        if(menuPositionProtyazhka1 == 0) --selectColor;
        if(menuPositionProtyazhka1 == 1) setThickness = setThickness-0.1;
        if(menuPositionProtyazhka1 == 2) --setTemperatureProtyazhka;
        if(menuPositionProtyazhka1 == 3) --selectSpeed;
        protyazhka1Screen(NOERASESCREEN, OffUpDown); break;
      }
      if(activScreen == 4) {
        if(menuPositionSpaika == 0) --setTemperatureSpaika;
        if(menuPositionSpaika == 1) --setTemperatureSpaikaR;
        spaikaScreen(NOERASESCREEN, OffUpDown); break;
      }
    }
    break;
  }
  
}
void reciveButton() {
   //UP*********************************************************************************
  if( btnUp.isClick() ) {
         
      if(edit == false) {
        if(activScreen == 1) { mainScreen(NOERASESCREEN, UP); return; }
        if(activScreen == 2) { protyazhka1Screen(NOERASESCREEN, UP); return; }
        if(activScreen == 3) {protyazhka2Screen(NOERASESCREEN, UP); return;}
        if(activScreen == 4) {spaikaScreen(NOERASESCREEN, UP); return;}
      }
      if(edit == true) {
        if(activScreen == 2) {
          if(menuPositionProtyazhka1 == 0) ++selectColor; 
          if(menuPositionProtyazhka1 == 1) setThickness = setThickness+0.1; 
          if(menuPositionProtyazhka1 == 2) ++setTemperatureProtyazhka; 
          if(menuPositionProtyazhka1 == 3) ++selectSpeed;
          protyazhka1Screen(NOERASESCREEN, OffUpDown); return;
        }
        if(activScreen == 4) {
          if(menuPositionSpaika == 0) ++setTemperatureSpaika; 
          if(menuPositionSpaika == 1) ++setTemperatureSpaikaR; 
          spaikaScreen(NOERASESCREEN, OffUpDown); return;
        }
      }
  }
  
  if( btnLeft.isClick() ) {
    if(edit == false) {
        if(activScreen == 3) { protyazhka1Screen(ERASESCREEN, OffUpDown); return; }
        if(activScreen == 2) { mainScreen(ERASESCREEN, OffUpDown); return; }
        if(activScreen == 1) { helloScreen(ERASESCREEN); return; }
        if(activScreen == 4) { mainScreen(ERASESCREEN, OffUpDown); return; }
    }
  }
//*****************************************************************************
  if( btnOK.isClick() ) {
    //"PLAY" ВЫБОР
      //MAIN экран******************************************************
      //****************************************************************
      if(activScreen == 1) {
        if(menuPositionMain == 1) { protyazhka1Screen(ERASESCREEN, OffUpDown); return; }
        if(menuPositionMain == 2) { spaikaScreen(ERASESCREEN, OffUpDown); return; }
        //Включить/выключить кнопку ON/OFF
        if(menuPositionMain == 3) {
          ClickNamotkaOnOff = !ClickNamotkaOnOff;
          if(ClickNamotkaOnOff == true) NamotkaOnOff = "ON ";
          if(ClickNamotkaOnOff == false) NamotkaOnOff = "OFF";
          mainScreen(NOERASESCREEN, OffUpDown);
          return;
        }
      }
       //Экран ПРОТЯЖКА1 **********************************************
      //**************************************************************
      if(activScreen == 2) {
         if(menuPositionProtyazhka1 == 0) {
          edit = !edit;
          Serial.println(edit);
          if(edit == true) { lcd.setCursor(1, 0); lcd.blink(); return; }
          if(edit == false) { lcd.noBlink(); return; }
        }
        if(menuPositionProtyazhka1 == 1) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 1); lcd.blink(); return; }
          if(edit == false) { lcd.noBlink(); return; }
        }
        if(menuPositionProtyazhka1 == 2) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 2); lcd.blink(); return; }
          if(edit == false) { lcd.noBlink(); return; }
        }
        if(menuPositionProtyazhka1 == 3) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 3); lcd.blink(); return; }
          if(edit == false) { lcd.noBlink(); return; }
        }
        return;
      }
      //Экран ПРОТЯЖКА2 **********************************************
      if(activScreen == 3) {
         //Очистить/сбросить счетчик
         if(menuPositionProtyazhka2 == 2) {
          lcd.setCursor(2, 2); lcd.print("COUNTER "); lcd.print("     ");
          counter = 0;
          return;
        }
        //Включить/выключить кнопку ON/OFF
        if(menuPositionProtyazhka2 == 3) {
          ClickProtyazhkaOnOff = !ClickProtyazhkaOnOff;
          lcd.setCursor(8, 3); lcd.print("    ");
          if(ClickProtyazhkaOnOff == true) {
            ProtyazhkaOnOff = "ON";
          }
          if(ClickProtyazhkaOnOff == false) {
            ProtyazhkaOnOff = "OFF";
          }
          return;
        }
        return;
      }
      //Экран СПАЙКА************************************************** 
      if(activScreen == 4) {
        //Включить/выключить кнопку ON\OFF
        if(menuPositionSpaika == 2) {
          ClickSpaikaOnOff = !ClickSpaikaOnOff;
          lcd.setCursor(8, 2); lcd.print("    ");
          if(ClickSpaikaOnOff == true) SpaikaOnOff = "ON";
          if(ClickSpaikaOnOff == false) SpaikaOnOff = "OFF";
          return;
        }
        //Маркер 1 строчки Экрана СПАЙКА
        if(menuPositionSpaika == 0) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 0); lcd.blink(); return; }
          if(edit == false) { lcd.noBlink(); return; }
        }
        //Маркер 2 строчки Экрана СПАЙКА
        if(menuPositionSpaika == 1) {
          edit = !edit;
          if(edit == true) { lcd.setCursor(1, 1); lcd.blink(); return; }
          if(edit == false) { lcd.noBlink(); return; }
        }
      }
    //************************************************Экран СПАЙКА
  }
  //**************************************************************************
  if( btnRight.isClick() ) {
    //"NEXT" RIGHT
      if(edit == false) {
        if(activScreen == 2) { protyazhka2Screen(ERASESCREEN, OffUpDown); return;}
        if(activScreen == 0) { mainScreen(ERASESCREEN, OffUpDown); return;}
      }
  }
  if( btnDown.isClick() ) {
      //"MINUS" DOWN
    if(edit == false) {
      if(activScreen == 1) { mainScreen(NOERASESCREEN, DOWN); return;}
      if(activScreen == 2) { protyazhka1Screen(NOERASESCREEN, DOWN); return;}
      if(activScreen == 3) { protyazhka2Screen(NOERASESCREEN, DOWN); return;}
      if(activScreen == 4) { spaikaScreen(NOERASESCREEN, DOWN); return;}
    }
    if(edit == true) {
      if(activScreen == 2) {
        if(menuPositionProtyazhka1 == 0) --selectColor;
        if(menuPositionProtyazhka1 == 1) setThickness = setThickness-0.1;
        if(menuPositionProtyazhka1 == 2) --setTemperatureProtyazhka;
        if(menuPositionProtyazhka1 == 3) --selectSpeed;
        protyazhka1Screen(NOERASESCREEN, OffUpDown); return;
      }
      if(activScreen == 4) {
        if(menuPositionSpaika == 0) --setTemperatureSpaika;
        if(menuPositionSpaika == 1) --setTemperatureSpaikaR;
        spaikaScreen(NOERASESCREEN, OffUpDown); return;
      }
    }
  }
}
/*
*****************************************************************
Блок функций  и кода пользователя
Здесь можно вставлять свои функции. В другой код вносить правки не
рекомендуется.
Переменные которые можно ТОЛЬКО читать:
int activScreen Отображает номер текущего экрана:
0 - helloScreen; 1 - MainScreen; 2 - Protyazhka1Screen; 3 - Protyazhka2Screen;
4 - SpaikaScreen.
Номер активной строки в меню соответствующего экрана:
int menuPositionMain; int menuPositionProtyazhka1; 
int menuPositionProtyazhka2; int menuPositionSpaika.
Состояние функциональных переключателей:
bool ClickProtyazhkaOnOff = false; bool ClickSpaikaOnOff = false; 
bool ClickNamotkaOnOff = false;
bool edit = false;
Переменные которые можно менять. Автоматически будет изменятся значение 
в соответствующих экранах. В начале программы можно изменить значения по умолчанию
или здесь :
int selectColor = 0;
float setThickness = 0.3;
int setTemperatureProtyazhka = 200; int TemperatureProtyazhka = 200;
int setTemperatureSpaika = 150; int TemperatureSpaika = 0.0;
int setTemperatureSpaikaR = 160; int TemperatureSpaikaR = 600;
int selectSpeed = 100; int Speed = 0;
Надписи кнопок на соответствующих экранах:
String ProtyazhkaOnOff = "OFF"; String SpaikaOnOff = "OFF"; 
String NamotkaOnOff = "OFF";
Индикация подачи питание на ногу нагрева:
String NagrevD5 = "*";
Счетчик намотки нити:
int counter=0;
*****************************************************************
*/
void funcProtyazhka() {
  double  TeO = analogRead(A6);
  double voltage = TeO * 5.0 / 1024.0;
  double r1 = voltage / (5.0 - voltage);
  TeO = 1. / ( 1. / (3950) * log(r1) + 1. / (25. + 273.) ) - 273; //4300
  TemperatureProtyazhka = (int)TeO;
  
  //Скорость протяжки  нити. Тест. Подставить свою обработку
  Speed = counter+2;
  if(Speed==999) Speed=10;
}
void funcSpaikaOn() {
  double  TeO = analogRead(A2);
  double voltage = TeO * 5.0 / 1024.0;
  double r1 = voltage / (5.0 - voltage);
  TeO = 1. / ( 1. / (3950) * log(r1) + 1. / (25. + 273.) ) - 273; //4300
  TemperatureSpaika = (int)TeO;
    
  TemperatureSpaikaR = analogRead(A3);
}
void funcNamotka() {
}
int mycnt = 0; //Для удобства так можно определять внешние переменные
//будет видна для всего что ниже
void funcStepeer() {
  if (Stepper.distanceToGo() == 0) Stepper.moveTo(-Stepper.currentPosition());
  Stepper.run(); // Передвинуть на 1 шаг
  //Stepper.runSpeed(); //Передвинуть со скоростью Stepper.setSpeed(200);
  counter++; //Не удалять, автоматически отразится на экране
  
  //Счетчик нити. Тест. Подставить свою обработку
  //Пример остановки протяжки/намотки нити
  mycnt++; //используйте свои переменные, можно объявить перед функцией
  if(mycnt==15) {
    mycnt=0; 
    ClickProtyazhkaOnOff = !ClickProtyazhkaOnOff; //щелкнуть выключатель ПРОТЯЖКА
    ProtyazhkaOnOff = "OFF"; //Остановит работу и отобразится на экране
  }
}
//*****************************************************************
//*****************************************************************
//*****************************************************************
void setup() {
  Serial.begin(9600);
  lcd.init(); // This is the I2C LCD object initialization. 
  lcd.backlight();
  // прописываем кнопки и указываем сигналы кнопок аналоговой клавы
  // параметры кнопок "Down" - 1023, "+" - 505, "OK" - 335, "-" - 250, "Up" - 200
  btnDown.setType(LOW_PULL);  btnLeft.setType(LOW_PULL);
  btnOK.setType(LOW_PULL);  btnRight.setType(LOW_PULL);  btnUp.setType(LOW_PULL);
  keys.attach(0, 1023);  keys.attach(1, 505);
  keys.attach(2, 335);  keys.attach(3, 250);  keys.attach(4, 200);
  receiver.enableIRIn(); //Старт IR связь
  helloScreen(true);
  delay(3000);
  mainScreen(ERASESCREEN, OffUpDown);
  
  Stepper.setMaxSpeed(1000);      //максимальная скорость (шагов/секунду)
  Stepper.setAcceleration(50);    //коэффициент ускорения (шагов/секунду^2)
  Stepper.setSpeed(selectSpeed);  //начальная скорость (шагов/секунду)
  Stepper.moveTo(100);            //целевая позиция (шагов)
  
}
void loop() {
  if(ProtyazhkaOnOff == "ON") {
    funcProtyazhka(); //Не трогать. Обработчик ПРОТЯЖКА
    //Демо работы настраиваемого таймера срабатывания функции.
    //Таймер настроен 1 в секунду = 1 шаг в секунду
    //Когда двигатель достигнет заданного положения Stepper.moveTo(100)
    //Изменение направления вращения,
    if (myTimer.isReady()) {
      funcStepeer();
      myTimer.start(); //Перезапуск таймера
    }
  }
  else { /*Пользовательская логика обработки чего либо */  }
  if(SpaikaOnOff == "ON")     funcSpaikaOn();
  else { /*Пользовательская логика обработки чего либо */ }
  if(NamotkaOnOff == "ON ")   funcNamotka();
  else { /*Пользовательская логика обработки чего либо */ }    
  //Не трогать, обновления экранов
  if(edit == false) {
    if(activScreen == 3) protyazhka2Screen(NOERASESCREEN, OffUpDown);
    if(activScreen == 4) spaikaScreen(NOERASESCREEN, OffUpDown);
  }
  //Не трогать, обработчик. Какая кнопка нажата на IR пульте
  if (receiver.decode()) {
    translateIR(); //Функция-обработчик кнопок IR пульта
    receiver.resume();  //Готовы читать следующую кнопку
  }
  //Использовать функию опроса кнопок ********************************
  // тикаем кнопки как статусы аналоговых isClick  isPress  isHold
  btnDown.tick(keys.status(0));  btnLeft.tick(keys.status(1));
  btnOK.tick(keys.status(2));  btnRight.tick(keys.status(3));  
  btnUp.tick(keys.status(4));
  //reciveButton();
  //******************************************************************
}