Помогите уменьшить код

gzp13
Offline
Зарегистрирован: 06.04.2015

Здравствуйте, помогите уменьшить код, чуток не влезает в 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();
   }
  
}

 }

 

b707
Онлайн
Зарегистрирован: 26.05.2017

gzp13 пишет:

Что можно сделать?

уменьшить дублирование кода, например. Начиная со строки 285 в коде повторяется пять очень похожих кусков, которые, скорее всего, можно оформить одной процедурой.

 

Однако. прежде чем делать - подумайте вот над чем. Если вы не готовы сидеть и корпеть над кодом сами (а я что-то сомневаюсь - иначе бы вы и не спрашивали) - то много быстрее и дешевле будет потратить лишние 100 рублей и заменить атмегу8 на атмегу168 и 328.

Оптимизация этого кода на заказ обойдется вам в десятки раз дороже.

gzp13
Offline
Зарегистрирован: 06.04.2015

b707 пишет:

gzp13 пишет:

Что можно сделать?

уменьшить дублирование кода, например. Начиная со строки 285 в коде повторяется пять очень похожих кусков, которые, скорее всего, можно оформить одной процедурой.

 

Однако. прежде чем делать - подумайте вот над чем. Если вы не готовы сидеть и корпеть над кодом сами (а я что-то сомневаюсь - иначе бы вы и не спрашивали) - то много быстрее и дешевле будет потратить лишние 100 рублей и заменить атмегу8 на атмегу168 и 328.

Оптимизация этого кода на заказ обойдется вам в десятки раз дороже.

Да я уже плату вытравил, спаял все)

b707
Онлайн
Зарегистрирован: 26.05.2017

gzp13 пишет:

Да я уже плату вытравил, спаял все)

а атмега8 не совместима по пинам с 328 ДИП?

sadman41
Offline
Зарегистрирован: 19.10.2016

"Чуток" - это сколько?

gzp13
Offline
Зарегистрирован: 06.04.2015

Эврика, Вы меня осенили, как раз 328 в DIP корпусе завалялась. Спасибо за подсказку)

gzp13
Offline
Зарегистрирован: 06.04.2015

ну думаю 1кБ достаточно было бы)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Убери напрочь всю float арихметику из кода, килобайта полтора сыканомишь

v258
Offline
Зарегистрирован: 25.05.2020

b707 пишет:

 много быстрее и дешевле будет потратить лишние 100 рублей и заменить атмегу8 на атмегу168 и 328.

Сейчас 8 атмега стоит подороже 168-й )))