Помогите уменьшить код
- Войдите на сайт для отправки комментариев
Чт, 24/06/2021 - 13:58
Здравствуйте, помогите уменьшить код, чуток не влезает в ATMEGA8. Надо задействовать Stepper3, без него код помещается, а с ним нет. Что можно сделать?
//Настройка шаового двиателя------------------------------------------------ #include <CustomStepper.h> // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V //#include <LiquidCrystal.h> #include <DS1307RTC.h> #include <TimeLib.h> //tmElements_t tm; //CustomStepper stepper1(5, 4, 3, 2); //CustomStepper stepper2(9, 8, 7, 6); //CustomStepper stepper3(13, 12, 11, 10); CustomStepper stepper1(5, 4, 3, 2, (byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 10, CW);// боковые шторы CustomStepper stepper2(9, 8, 7, 6, (byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 10, CW);// передние шторы //CustomStepper stepper3(13, 12, 11, 10, (byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 10, CW);// балкон //const int rs = 5, en = 6, d4 = 7, d5 = 3, d6 = 2, d7 = 8; //LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // stepper1-боковые шторы //stepper2-передние шторы //stepper3-балкон //-------------------------------------------------------------------------- //Настройка верхнего положения штор--------------------------------------------------------------------------------------------------- // //#define verx 61427 //Число шагов для верхнего положения #define verx_pered 46780 #define verx_bok 61427 #define verx_balkon 46780 //---------------------------------------------------------------------------------------------------------------------------------------------- //Настройка кнопок---------------------------------------------------------- #include <GyverButton.h> //Библиотека управления кнопками #define BTN1 16 // кнопка1 ВЫПУСК УБОРКА всех штор #define BTN2 14 // кнопка2 ВЫПУСК-УБОРКА боковых штор #define BTN3 17 // кнопка3 ВЫПУСК-УБОРКА передних штор и балкона #define BTN4 15 // кнопка СТОП-УПРАВЛЕНИЕ //#define BTN2 14 GButton Pered_shtory(BTN3); GButton Stop(BTN4); GButton Vse_shtory(BTN1); GButton Bok_shtory(BTN2); byte flag = 0; byte value = 0; long schet_pered = 0; //Счетчик шагов первой шторы long schet_bok = 0; //Счетчик шагов второй шторы long schet_balkon = 0; //Счетчик шагов третьей шторы long hagi_pered=0; long hagi_bok=0; long hagi_balkon=0; unsigned long time2; //переменная для второго таймера //unsigned long time1; //переменная для второго таймера byte kalibrovka=0; void setup() { //pinMode (14,INPUT_PULLUP); //ВНИЗ //pinMode (15,INPUT_PULLUP); //ДЕНЬ-НОЧЬ //pinMode (16,INPUT_PULLUP); //ВЫПУСК // pinMode (17,INPUT_PULLUP); //СТОП-УПРАВЛЕНИЕ //pinMode (0,OUTPUT); //pinMode (1, OUTPUT); //светодиод DDRC &= ~ (1<<0); DDRC &= ~ (1<<1); DDRC &= ~ (1<<2); DDRC &= ~ (1<<3); DDRD |= (1<<1); //Выставляем опрос кнопок в режим АВТО Pered_shtory.setTickMode(AUTO); Stop.setTickMode(AUTO); Vse_shtory.setTickMode(AUTO); Bok_shtory.setTickMode(AUTO); Stop.setDebounce(90); // настройка антидребезга (по умолчанию 80 мс) Stop.setTimeout(300); // настройка таймаута на удержание (по умолчанию 500 мс) Stop.setStepTimeout(1000); /* //Настраиваем дисплей lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.setCursor(2,0); //Установить курсор на первый символ 1 строки lcd.print("Kalibrovka"); // Вывести показания первого датчика delay(1000); */ stepper1.setRPM(10); // Устанавливаем количество оборотов в минуту stepper1.setSPR(4075.7728395); // Устанавливаем колочество шагов на полный оборот. Максимальное значение 4075.7728395 stepper2.setRPM(10); stepper2.setSPR(4075.7728395); //stepper3.setRPM(10); //stepper3.setSPR(4075.7728395); // Set sketch compiling time //clock.setDateTime(__DATE__, __TIME__); //RTC.read(tm); //_delay_ms(2000); } void loop() { //////режим калибровки////////////////// if (value==0 ) { if (millis() - time2>500) { time2 = millis(); //digitalWrite(1,!digitalRead(1)); PORTD ^= (1 << PD1); } } tmElements_t tm; if (RTC.read(tm)) { if( tm.Hour==12 && tm.Minute==51 && tm.Second==0 ) //////время включения насосов 7 часов { if(value==1 ) { PORTD |= (1 << PD0); //digitalWrite(0,HIGH); hagi_pered = verx_pered; hagi_bok = verx_bok; // hagi_balkon = verx_balkon; } } if( tm.Hour==12 && tm.Minute==52 && tm.Second==0 ) //////время включения насосов 7 часов { if(value==1 ) { PORTD &= ~ (1 << PD0); //digitalWrite(0,HIGH); hagi_pered = 0; hagi_bok = 0; // hagi_balkon = verx_balkon; } } } /* if (RTC.read(tm)) { if( tm.Hour==12 && tm.Minute==22 ) //////время включения насосов 7 часов { if(value==1 && flag==1) { PORTD &= ~ (1 << PD0); //digitalWrite(0,HIGH); hagi_pered = 0; hagi_bok = 0; // hagi_balkon = verx_balkon; } } } */ if (Vse_shtory.isClick() && value==0) //калибровка { kalibrovka=1; } if (Stop.isPress() && kalibrovka==1) { hagi_pered=0; hagi_bok=0; hagi_balkon=0; schet_pered = 0; schet_bok = 0; schet_balkon = 0; kalibrovka=0; } // режим ВЫПУСК-УБОРКА всех штор///// if (Vse_shtory.isPress()&& value==1 ) { hagi_pered = 0; hagi_bok = 0; hagi_balkon = 0; } if (Stop.isClick()) { hagi_pered = schet_pered; hagi_bok = schet_bok; hagi_balkon = schet_balkon; } if (Vse_shtory.isHolded() && value==1) //уборка всех штор { hagi_pered = verx_pered; hagi_bok = verx_bok; hagi_balkon = verx_balkon; } // режим ВЫПУСК-УБОРКА передних штор///// if (Pered_shtory.isClick() ) { hagi_pered = 0; //hagi_bok = 0; hagi_balkon = 0; } if (Pered_shtory.isHolded()) //уборка всех штор { hagi_pered = verx_pered; //hagi_bok = verx_bok; hagi_balkon = verx_balkon; } // режим ВЫПУСК-УБОРКА боковых штор///// if (Bok_shtory.isClick() ) { //hagi_pered = 0; hagi_bok = 0; //hagi_balkon = 0; } if (Bok_shtory.isHolded()) //уборка всех штор { //hagi_pered = verx_pered; hagi_bok = verx_bok; //hagi_balkon = verx_balkon; } // УПРАВЛЕНИЕ/////// if (Stop.isStep()) { // если кнопка была удержана (это для инкремента) value++; // увеличивать/уменьшать переменную value с шагом и интервалом switch (value) { case 1: // value=1 режим автоматический( управление 3 шторами) //digitalWrite(1,LOW); PORTD &= ~ (1 << PD1); flag=1; break; case 2: //value=2 режим ручной( передними шторами) одна вспышка //digitalWrite(1,HIGH); PORTD |= (1 << PD1); _delay_ms(200); //digitalWrite(1,LOW); PORTD &= ~ (1 << PD1); _delay_ms(200); //digitalWrite(1,HIGH); PORTD |= (1 << PD1); flag=2; _delay_ms(500); break; case 3: //value=3 режим ручной( управление боковыми шторами) //digitalWrite(1,HIGH); PORTD |= (1 << PD1); _delay_ms(200); //digitalWrite(1,LOW); PORTD &= ~ (1 << PD1); _delay_ms(200); //digitalWrite(1,HIGH); PORTD |= (1 << PD1); _delay_ms(200); //digitalWrite(1,LOW); PORTD &= ~ (1 << PD1); _delay_ms(200); //digitalWrite(1,HIGH); PORTD |= (1 << PD1); flag=3; _delay_ms(500); break; case 4: //digitalWrite(1,LOW); PORTD &= ~ (1 << PD1); flag=4; break; } } if (value==4) value=0; //value=0 режим калибровки // Исполнительный код движения штор----------------------------------------------------- if (value==0 && kalibrovka==1 ) { stepper1.setDirection(CCW); stepper1.rotate(); schet_pered++; stepper2.setDirection(CCW); stepper2.rotate(); schet_bok++; //stepper3.setDirection(CCW); //stepper3.rotate(); // schet_balkon++; //delayMicroseconds(800); } if (value==1 && flag==1) //автоматический режим { if (schet_pered <hagi_pered ) //Подъем всех штор по удержанию кнопки { stepper2.setDirection(CW); stepper2.rotate(); schet_pered++; //delayMicroseconds(800); } if (schet_bok < hagi_bok) { stepper1.setDirection(CW); stepper1.rotate(); schet_bok++; //delayMicroseconds(800); } /* if( schet_balkon < hagi_balkon) { stepper3.setDirection(CW); stepper3.rotate(); schet_balkon++; //delayMicroseconds(800); } */ if (schet_pered > hagi_pered ) //ОПУСКАНИЕ ВСЕХ ШТОР нажатию КНОПКИ { stepper2.setDirection(CCW); stepper2.rotate(); schet_pered--; //delayMicroseconds(800); } if (schet_bok > hagi_bok ) { stepper1.setDirection(CCW); stepper1.rotate(); schet_bok--; //delayMicroseconds(800); } /* if (schet_balkon >hagi_balkon ) { stepper3.setDirection(CCW); stepper3.rotate(); schet_balkon--; //delayMicroseconds(800); } */ if (schet_pered == hagi_pered ) //СТОП { stepper2.setDirection(STOP); stepper2.rotate(); } if (schet_bok == hagi_bok ) //СТОП { stepper1.setDirection(STOP); stepper1.rotate(); } /* if (schet_balkon == hagi_balkon ) //СТОП { stepper3.setDirection(STOP); stepper3.rotate(); } */ } if (value==2 && flag==2 ){ //ручное управление передними шторами kalibrovka=0; if (schet_pered > hagi_pered) //опускание шторы { stepper2.setDirection(CCW); stepper2.rotate(); schet_pered--; stepper1.setDirection(STOP); stepper1.rotate(); //stepper3.setDirection(STOP); //stepper3.rotate(); //delayMicroseconds(800); } if (schet_pered < hagi_pered) //подъем шторы { stepper2.setDirection(CW); stepper2.rotate(); schet_pered++; stepper1.setDirection(STOP); stepper1.rotate(); //stepper3.setDirection(STOP); //stepper3.rotate(); //delayMicroseconds(800); } if (schet_pered == hagi_pered) //СТОП { stepper2.setDirection(STOP); stepper2.rotate(); stepper1.setDirection(STOP); stepper1.rotate(); //stepper3.setDirection(STOP); //stepper3.rotate(); } } if (value==3 && flag==3 ){ //ручное управление боковыми шторами kalibrovka=0; if (schet_bok > hagi_bok) //Опускание шторы { stepper1.setDirection(CCW); stepper1.rotate(); schet_bok--; stepper2.setDirection(STOP); stepper2.rotate(); //stepper3.setDirection(STOP); //stepper3.rotate(); //delayMicroseconds(800); } if (schet_bok < hagi_bok) //Подъем боковых штор { stepper1.setDirection(CW); stepper1.rotate(); schet_bok++; stepper2.setDirection(STOP); stepper2.rotate(); //stepper3.setDirection(STOP); //stepper3.rotate(); //delayMicroseconds(800); } if (schet_bok == hagi_bok) //СТОП { stepper1.setDirection(STOP); stepper1.rotate(); stepper2.setDirection(STOP); stepper2.rotate(); //stepper3.setDirection(STOP); //stepper3.rotate(); } } /* if (value==4 && flag==4 ){ //ручное управление шторой балкона kalibrovka=0; if (schet_balkon > hagi_balkon) //Опускание шторы { stepper3.setDirection(CCW); stepper3.rotate(); schet_balkon--; //stepper1.setDirection(STOP); //stepper1.rotate(); //stepper2.setDirection(STOP); ///stepper2.rotate(); delayMicroseconds(800); } if (schet_balkon < hagi_balkon) //Подъем шторы { stepper3.setDirection(CW); stepper3.rotate(); schet_balkon++; //stepper1.setDirection(STOP); // stepper1.rotate(); //stepper2.setDirection(STOP); //stepper2.rotate(); delayMicroseconds(800); } if (schet_balkon == hagi_balkon) //СТОП { stepper3.setDirection(STOP); stepper3.rotate(); //stepper1.setDirection(STOP); //stepper1.rotate(); //stepper2.setDirection(STOP); //stepper2.rotate(); } } }
Что можно сделать?
уменьшить дублирование кода, например. Начиная со строки 285 в коде повторяется пять очень похожих кусков, которые, скорее всего, можно оформить одной процедурой.
Однако. прежде чем делать - подумайте вот над чем. Если вы не готовы сидеть и корпеть над кодом сами (а я что-то сомневаюсь - иначе бы вы и не спрашивали) - то много быстрее и дешевле будет потратить лишние 100 рублей и заменить атмегу8 на атмегу168 и 328.
Оптимизация этого кода на заказ обойдется вам в десятки раз дороже.
Что можно сделать?
уменьшить дублирование кода, например. Начиная со строки 285 в коде повторяется пять очень похожих кусков, которые, скорее всего, можно оформить одной процедурой.
Однако. прежде чем делать - подумайте вот над чем. Если вы не готовы сидеть и корпеть над кодом сами (а я что-то сомневаюсь - иначе бы вы и не спрашивали) - то много быстрее и дешевле будет потратить лишние 100 рублей и заменить атмегу8 на атмегу168 и 328.
Оптимизация этого кода на заказ обойдется вам в десятки раз дороже.
Да я уже плату вытравил, спаял все)
Да я уже плату вытравил, спаял все)
а атмега8 не совместима по пинам с 328 ДИП?
"Чуток" - это сколько?
Эврика, Вы меня осенили, как раз 328 в DIP корпусе завалялась. Спасибо за подсказку)
ну думаю 1кБ достаточно было бы)
Убери напрочь всю float арихметику из кода, килобайта полтора сыканомишь
много быстрее и дешевле будет потратить лишние 100 рублей и заменить атмегу8 на атмегу168 и 328.
Сейчас 8 атмега стоит подороже 168-й )))