/*
//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
Настройка драйверов TMC 2209, подключение по UART к robin nano
https://sergey1560.github.io/fb4s_howto/tmc_uart/
https://alexgyver.ru/gyverstepper/
*/
/*Программа написана Федоровым Александром 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();
//******************************************************************
}