Помогите уменьшить код
- Войдите на сайт для отправки комментариев
Чт, 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-й )))