Простейший код но я завис, сначала все работало, но после определённого времени и клацания по кнопка ардуина зависла и постоянно обновляет экран, возможно где то я напартачил с кодом, так как при загрузке других скетчей, все работает стабильно, я конечно не полное дерево но реально не вижу в чем может быть проблема, может кто сможет подсказать, к ардуино подключен драйвер постоянного тока на 24 вольта, управляется 3 пинами, два отвечает за STEP и один за DIR, так же 3 сенсорные кнопки, и один кликер подтягиваю встроенным резистором, да, код ужасен, но это первая версия, ещё не “причесана”, но все ни как не пойму где мог накосячить, что по истечению времени начал сходить с ума. надеюсь на помощь
//***********************************************Проект медогонки, V1****************************************
#include <UTFT.h>
#include <EEPROM.h>
#define klcL 2 //пин левого сенсора
#define klcR 3 //пин правого сенсора
#define klcC 4 //пин центрального сенсора
#define STRBTN 9 //пин главной пускающей кнопки
#define indStart 8 //пин светодиода, в кнопке старт
#define DIR_R 5
#define DIR_L 7
#define STEP_D 6
//Подключаем и настраиваем дисплей
UTFT myGLCD (ILI9486,38,39,40,41);
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
// переменные
boolean buttonC, buttonL, buttonR, batclik, flagr = false, flagl = false, orentir;
float i;
float TM, ckl, sdO;
int pos, str_sdO, strtm, strckl, str_sdO_D;
uint64_t btnTL, btnTC, btnTR, STBf, otshet;
void setup(){
// настройка пинов
pinMode(klcL, INPUT);
pinMode(klcR, INPUT);
pinMode(klcC, INPUT);
pinMode(STRBTN, INPUT_PULLUP);
pinMode(indStart, OUTPUT);
pinMode(DIR_R, OUTPUT);
pinMode(DIR_L, OUTPUT);
pinMode(STEP_D, OUTPUT);
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
//Считываем данные из дампа памяти и записи в переменные
TM = EEPROM.read(10);
sdO = EEPROM.read(20);
ckl = EEPROM.read(30);
//очистка дисплея и заливка фона
myGLCD.InitLCD();
myGLCD.clrScr();
myGLCD.setBackColor(VGA_BLACK );
menu_draw();}
void loop(){
if(pos > 4 && strckl != ckl){
prstart(str_sdO,60);
prstart(strtm,120);
prstart(strckl,180);
if(str_sdO < sdO && pos == 5){
str_sdO = str_sdO + ( 10*(sdO / 100));
str_sdO = constrain(str_sdO, 0, sdO);
str_sdO_D = map(str_sdO, 0, 400, 40, 255);
analogWrite(STEP_D, str_sdO_D);}
if(str_sdO != 0 && pos == 6){
str_sdO = str_sdO - ( 10*(sdO / 100));
str_sdO = constrain(str_sdO, 0, sdO);
str_sdO_D = map(str_sdO, 0, 400, 40, 255);
analogWrite(STEP_D, str_sdO_D);}
if(str_sdO == sdO && pos == 5 && strckl != ckl && millis() - otshet > 1000){
otshet = millis();
strtm = strtm-1;
strtm = constrain(strtm, 0,TM);
if(strtm == 0){
pos = 6;
strtm = TM;
strckl++;}}
if(str_sdO == 0 && strckl != ckl && pos == 6){
delay(2000);
if( strckl%2 ==1){digitalWrite(DIR_R, 1);
digitalWrite(DIR_L, 0);}
else {digitalWrite(DIR_R, 0);
digitalWrite(DIR_L, 1);}
pos = 5;
strtm = TM;}
}if(strckl == ckl){
digitalWrite(indStart,0);
str_sdO_D = 0;
analogWrite(STEP_D, str_sdO_D);
menu_draw();
strckl = 0;
}else{
buttonR = digitalRead(klcR);
if(buttonR && !flagr && millis() - btnTR > 150){
btnTR = millis();
flagr = true;
if(pos == 0 ){menu_povtor();
return;}
if(pos == 1 ){TM ++;
TM = constrain(TM, 0,40);
prNom(TM);}
if(pos == 2){sdO ++;
sdO = constrain(sdO, 0,400);
prNom(sdO);}
if(pos == 3){ckl ++;
ckl = constrain(ckl, 0,10);
prNom(ckl);}}
if(buttonR && flagr && millis() - btnTR > 500){
btnTR = millis();
if(pos == 1 ){TM = TM + 5;
TM = constrain(TM, 0,40);
prNom(TM);}
if(pos == 2){sdO = sdO + 10;
sdO = constrain(sdO, 0,400);
prNom(sdO);}
if(pos == 3){ckl = ckl + 3;
ckl = constrain(ckl, 0,10);
prNom(ckl);}}
if(!buttonR && flagr && millis() - btnTR > 150){
flagr = false;
btnTR = millis();
}
buttonL = digitalRead(klcL);
if(buttonL && !flagl && millis() - btnTL >150){
btnTL = millis();
flagl = true;
if(pos == 0){ menu_vremya();
return;}
if(pos == 1){TM --;
TM = constrain(TM, 0,40);
prNom(TM);}
if(pos == 2){sdO --;
sdO = constrain(sdO, 0,400);
prNom(sdO);}
if(pos == 3){ckl --;
ckl = constrain(ckl, 0,10);
prNom(ckl);}}
if(buttonL && flagl && millis() - btnTL > 500){
btnTL = millis();
if(pos == 1 ){TM = TM - 5;
TM = constrain(TM, 0,40);
prNom(TM);}
if(pos == 2){sdO = sdO - 10;
sdO = constrain(sdO, 0,400);
prNom(sdO);}
if(pos == 3){ckl = ckl - 3;
ckl = constrain(ckl, 0,10);
prNom(ckl);}}
if(!buttonL && flagl && millis() - btnTL > 150){
flagl = false;
btnTL = millis();
}
buttonC = digitalRead(klcC);
if(buttonC == HIGH && millis() - btnTC > 300){
btnTC = millis();
if(pos == 0){ menu_oborot();
return;}
else{ EEPROM.update(10 ,TM);
EEPROM.update(20 ,sdO);
EEPROM.update(30 ,ckl);
menu_draw();}}}
batclik = !digitalRead(STRBTN);
if(batclik == HIGH && millis() - STBf > 400){
strtm = TM;
str_sdO = 0;
STBf == millis();
if(pos < 5){
digitalWrite(indStart,1);
star_med();}
else{
digitalWrite(indStart,0);
str_sdO_D = 0;
analogWrite(STEP_D, str_sdO_D);
menu_draw();}}
}
void prstart(int peremen, int posi){
myGLCD.setBackColor(VGA_BLACK);
myGLCD.setColor(VGA_SILVER);
myGLCD.setFont(SevenSegNumFont);
myGLCD.printNumI(peremen, CENTER, posi,3,'0');}
// вывод числа на дисплей для настроек
void prNom(int peremen){
myGLCD.setBackColor(VGA_BLACK);
myGLCD.setColor(VGA_SILVER);
myGLCD.setFont(SevenSegNumFont);
myGLCD.printNumI(peremen, CENTER, 100, 3, '0');}
// основное меню
void menu_draw(){
myGLCD.clrScr();
myGLCD.setColor(VGA_SILVER);
myGLCD.setFont(SevenSegNumFont);
myGLCD.setBackColor(VGA_BLACK );
myGLCD.printNumI(TM, 350, 50, 2,'0');
myGLCD.printNumI(sdO, 320, 125, 3,'0');
myGLCD.printNumI(ckl, 350, 200, 2,'0');
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_RED);
myGLCD.print("BPEM\x95", 30, 75);
myGLCD.print("O\x80OPOT\x91", 30, 150);
myGLCD.print("\x89OBTOP", 30, 225);
myGLCD.setColor(VGA_RED);
myGLCD.print("ME\x82O\x81OHKA_V1", CENTER, 15);
myGLCD.setColor(VGA_SILVER);
myGLCD.fillRect(0, 270, 145, 320);
myGLCD.fillRect(165, 270, 315, 320);
myGLCD.fillRect(335, 270, 475, 320);
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_RED);
myGLCD.setBackColor(VGA_SILVER );
myGLCD.print("BPEM\x95", 30, 285);
myGLCD.print("O\x80OPOT\x91", CENTER, 285);
myGLCD.print("\x89OBTOP\x91", 355, 285);
pos = 0;}
// меню время
void menu_vremya(){
myGLCD.clrScr();
prNom(TM);
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_RED);
myGLCD.print("BPEM\x95", CENTER, 15);
myGLCD.setColor(VGA_SILVER);
myGLCD.fillRect(0, 270, 145, 320);
myGLCD.fillRect(165, 270, 315, 320);
myGLCD.fillRect(335, 270, 475, 320);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(VGA_SILVER );
myGLCD.setColor(VGA_RED);
myGLCD.print("-", 65, 285);
myGLCD.print("MEH\x94", CENTER, 285);
myGLCD.print("+", 395, 285);
pos = 1;}
// меню оборотов
void menu_oborot(){
myGLCD.clrScr();
prNom(sdO);
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_RED);
myGLCD.print("O\x80OPOT\x91", CENTER, 15);
myGLCD.setColor(VGA_SILVER);
myGLCD.fillRect(0, 270, 145, 320);
myGLCD.fillRect(165, 270, 315, 320);
myGLCD.fillRect(335, 270, 475, 320);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(VGA_SILVER );
myGLCD.setColor(VGA_RED);
myGLCD.print("-", 65, 285);
myGLCD.print("MEH\x94", CENTER, 285);
myGLCD.print("+", 395, 285);
pos = 2;}
// Меню повторнерия реверса
void menu_povtor(){
myGLCD.clrScr();
prNom(ckl);
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_RED);
myGLCD.print("\x89OBTOP", CENTER, 15);
myGLCD.setColor(VGA_SILVER);
myGLCD.fillRect(0, 270, 145, 320);
myGLCD.fillRect(165, 270, 315, 320);
myGLCD.fillRect(335, 270, 475, 320);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(VGA_SILVER );
myGLCD.setColor(VGA_RED);
myGLCD.print("-", 65, 285);
myGLCD.print("MEH\x94", CENTER, 285);
myGLCD.print("+", 395, 285);
pos = 3;}
//отрисовка меню запуска и отслеживание работы медогонки
void star_med(){
myGLCD.clrScr();
pos = 5;
if(pos>4){digitalWrite(DIR_L, 1);}}
void yield() {
digitalWrite(DIR_R, 0);
digitalWrite(DIR_L, 0);
}