Оптимизация кода

vanila
Offline
Зарегистрирован: 25.08.2015

Написал программу и выяснилось что места катастрафически не хватает.

Переход на мегу уже не получится, если только есть меги в формфакоре уно. иначе все перепаивать придется.

Так что придется оптимизировать. Почитал про оптимизацию, пока для меня сложновато. Почти все int заменил на byte - освободил довольно много места, но всеравно на полную программу не хватает.

Вопрос, в общим, пока вот в чем: в программе очень много кода такого типа:

if (time_h  == 16 && time_min ==  0 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=00; }
if (time_h  == 16 && time_min == 15 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=15;  }
if (time_h  == 16 && time_min == 30 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=30;   }
if (time_h  == 16 && time_min == 45 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=45;    }

Можно ли его как то оптимизировать? (все эти переменные задаются byte в начале)

lex2k
Offline
Зарегистрирован: 17.12.2015

vanila пишет:

Написал программу и выяснилось что места катастрафически не хватает.

Переход на мегу уже не получится, если только есть меги в формфакоре уно. иначе все перепаивать придется.

Так что придется оптимизировать. Почитал про оптимизацию, пока для меня сложновато. Почти все int заменил на byte - освободил довольно много места, но всеравно на полную программу не хватает.

Вопрос, в общим, пока вот в чем: в программе очень много кода такого типа:

if (time_h  == 16 && time_min ==  0 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=00; }
if (time_h  == 16 && time_min == 15 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=15;  }
if (time_h  == 16 && time_min == 30 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=30;   }
if (time_h  == 16 && time_min == 45 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=45;    }

Можно ли его как то оптимизировать? (все эти переменные задаются byte в начале)

если это полив то 

1) нужны ли тут секунды 

2) если секунды не нужны то можно перевести все к минутам и уменьшить кол-во сравненийм

vanila
Offline
Зарегистрирован: 25.08.2015

да полив, вродибы и не нужны, добавил чтобы случайно не проскочило из за сбоя какогонибудь

впринципе попробую но всеравно не влезет

lex2k
Offline
Зарегистрирован: 17.12.2015

секунды ваще из кода исключи и время в минуты и сравнивай все в минутах ......все равно не влезет?

vanila
Offline
Зарегистрирован: 25.08.2015

попробовал - получается секунды только 3% занимают

vanila
Offline
Зарегистрирован: 25.08.2015

в общим не влезет

lex2k
Offline
Зарегистрирован: 17.12.2015

пришли код ......мож помогу чем

vanila
Offline
Зарегистрирован: 25.08.2015

давай на мыло отправлю

lex2k
Offline
Зарегистрирован: 17.12.2015

срисовал?

vanila
Offline
Зарегистрирован: 25.08.2015

отправил

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Вот пишу, пишу что памяти маловато и для ряда процов её нарастить можно, ну просто легко .. а мне в ответ "нафиг не надо" .. :) (эт я так, побрюзжать слегка)

Так а КАКОЙ памяти в вашем коде "не хватает", уточнить - можете?

vanila
Offline
Зарегистрирован: 25.08.2015


Той что жирным:

Sketch uses 28 854 bytes (89%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 357 bytes (66%) of dynamic memory, leaving 691 bytes for local variables. Maximum is 2 048 bytes.
 

 

lex2k
Offline
Зарегистрирован: 17.12.2015

ахренеть код

мужик переходи на мегу  ...не засунешь ты его в уну  не оптимизируешь ты его на столько

vanila
Offline
Зарегистрирован: 25.08.2015

пичалька =(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vanila пишет:

Написал программу и выяснилось что места катастрафически не хватает.

Переход на мегу уже не получится, если только есть меги в формфакоре уно. иначе все перепаивать придется.

Так что придется оптимизировать. Почитал про оптимизацию, пока для меня сложновато. Почти все int заменил на byte - освободил довольно много места, но всеравно на полную программу не хватает.

Вопрос, в общим, пока вот в чем: в программе очень много кода такого типа:

if (time_h  == 16 && time_min ==  0 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=00; }
if (time_h  == 16 && time_min == 15 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=15;  }
if (time_h  == 16 && time_min == 30 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=30;   }
if (time_h  == 16 && time_min == 45 && time_sec < 10 && CXEMA_poliva == 1) { polit_07();  chas_poliva=16;  minuta_poliva=45;    }

Можно ли его как то оптимизировать? (все эти переменные задаются byte в начале)

if (time_sec < 10 && CXEMA_poliva == 1 && time_min%15 == 0) 
{
    polit_07();
    chas_poliva=time_h; 
    minuta_poliva=time_min;
}

А вообще, следовало бы сначала ответить на вопрос из поста 11.

lex2k
Offline
Зарегистрирован: 17.12.2015

а gsm зачем там?

vanila
Offline
Зарегистрирован: 25.08.2015

Это контроллер туманообразующей установки.

а жсм нужен для:

1. узнать что электричества нет и туман не работает

2. включать выключать, менять алгоритм полива

3. узнавать состояние системы

lex2k
Offline
Зарегистрирован: 17.12.2015

сильный код

я еще вот это писал

 Serial1.println("AT+CSCS=\"GSM\"");     // выбираем алфавит "GSM"

....чет не работало не помню точьно .....мож пригодится ......сам допер

vanila
Offline
Зарегистрирован: 25.08.2015

andriano пишет:

if (time_sec < 10 && CXEMA_poliva == 1 && time_min%15 == 0) 
{
    polit_07();
    chas_poliva=time_h; 
    minuta_poliva=time_min;
}

Скетч у меня не влезает а оперативы вроде тютя в тютю)

че то на первый взгляд вроде по размеру не меньше.

    chas_poliva=time_h; 
    minuta_poliva=time_min;

а про такой вариант я чето даже не подумал, так проще получатеся, спасибо

vanila
Offline
Зарегистрирован: 25.08.2015

lex2k пишет:

 Serial1.println("AT+CSCS=\"GSM\"");     // выбираем алфавит "GSM"

почитал немного, полезная штука конечно, как раз у меня проблемы с запросом баланса на теле2 - на латинице не хотят присылать, но пока для меня сложновато))

lex2k
Offline
Зарегистрирован: 17.12.2015

ща про баланс напишу ...тоже теле...седня замутил....вроде работает...тока я баланс на андроид вывожу....но думаю пригодиться ...щас покурю....

lex2k
Offline
Зарегистрирован: 17.12.2015
запрос
 if (String(incmd)=="#bal")           // распознавание 7-й команды 
       {   balflg = 1;                            
        Serial1.println("AT+CUSD=1,\"*105#\",15"); //  команда USSD запроса баланса теле2 
        delay (10000);    // ждем 10 сек ......ответ приходил примерно через 7 сек
        clrincmd();
       }
ловим ответ
// начало обработка отправки баланса======================================================= 
  
 if( Serial1.available() && balflg == 1 )  Serial2.print(char( Serial1.read())); else balflg = 0;
 
  // конец обработка отправки баланса=======================================================   
   
lex2k
Offline
Зарегистрирован: 17.12.2015

а ты откенда?  вдруг сосед)))))))))))))))))

vanila
Offline
Зарегистрирован: 25.08.2015

Спасибо, с размером разберусь, дальше буду с балансом резбераться!

из Владимира

lex2k
Offline
Зарегистрирован: 17.12.2015

тут Serial1 - gsm а Serial2 - блютуф

lex2k
Offline
Зарегистрирован: 17.12.2015

удачи 

 

vanila
Offline
Зарегистрирован: 25.08.2015

Спасибо)

lex2k
Offline
Зарегистрирован: 17.12.2015
void sendsms (String masg) // функция отправки смс
  { 
 
  Serial1.println("AT+CMGS=\"+79000000000\""); 
    delay(1500);
    Serial1.print(masg); // текст смс
    delay(1500);
    Serial1.print((char)26); // символ <ctrl-z> (ASCII character 26)
    delay(5000);
  }
void loop() 
{
String a = " текст";
sendsms ( a);

}

вот тебе еще в помощь...не зря ведь я трахался этой хренью

vanila
Offline
Зарегистрирован: 25.08.2015

Спасибо!

lex2k
Offline
Зарегистрирован: 17.12.2015

можно так писать 

Serial.println("AT+GMM")

вместо

Serial.print("AT+GMM\r")

lex2k
Offline
Зарегистрирован: 17.12.2015
char incmd[5];    //  буфер команды смс на 4 символа + 1 символ конца строки
bool balflg=0;
String strtmp;
void clrincmd()      // отчиска  буфера команды смс
 {                 
   incmd[0]='\0';
   incmd[1]='\0';
   incmd[2]='\0';
   incmd[3]='\0';
   incmd[4]='\0';
 
 }
loop
// начало обработки смс команд __________________________________________________________________________
if( Serial1.available() && balflg == 0 )
 {
    if ( Serial1.peek()!='#')                // если  следующий символ  не "#" 
                    Serial1.read();           // просто принять символ с модема
 
                                                       // если  следующий символ "#", (с него начинается строка команды )
    if ( Serial1.peek()=='#')                             // считывается 4 символа комады начиная с "#"
      { 
        incmd[0]= Serial1.read();                            // 1-й это "#"
        delay(100);
        incmd[1]= Serial1.read();                             // 2-й
        delay(100);
        incmd[2]= Serial1.read();                             // 3-й
        delay(100);
        incmd[3]= Serial1.read();                             // 4-й
        delay(100);
         
       }
       if (String(incmd)=="#st?")                             // распознавание 1-й команды
       {                                                 // действия на команду 1
        sensors.requestTemperatures();                   // опрос датчиков температуры
        strtmp = "sensor1 : " + String (sensors.getTempC(Thermometer1))+ "  C"   
       + '\n' + "sensor2 : " + String (sensors.getTempC(Thermometer2))+ "  C" 
       + '\n' + "cmd : #st?" ;                             // формирование текста для отправки смс
       
        sendsms(strtmp);                        // отправляем смс  
        clrincmd();                                 // отчиска  буфера команды смс
       }
     if (String(incmd)=="#bal")           // распознавание n-й команды 
       {   balflg = 1;                            
        Serial1.println("AT+CUSD=1,\"*105#\",15"); //  команда USSD запроса баланса теле2 
        delay (10000);
        clrincmd();
       }   
   
   
   } 
  // конец обработки смс команд _________________________________________________________________
 
 // начало обработка отправки баланса======================================================= 
  
 if( Serial1.available() && balflg == 1 )  sendsms( Serial1.readString()); else balflg = 0;
 
  // конец обработка отправки баланса=======================================================   
   

 

lex2k
Offline
Зарегистрирован: 17.12.2015

вот те код для баланса и общий подход не примере комады1     #st?  - это отправляем как запрос смс- кой

# - обязательна остальные 3 - произаольно

vanila
Offline
Зарегистрирован: 25.08.2015

ништяк)

вот это вот интересно:

char incmd[5];    //  буфер команды смс на 4 символа + 1 символ конца строки

где можно почитать как это используют?

lex2k
Offline
Зарегистрирован: 17.12.2015

что именно?

lex2k
Offline
Зарегистрирован: 17.12.2015

символьный массив всегда +1

особенность массива char

в отличии  к примеру от int  или byte   там не надо

lex2k
Offline
Зарегистрирован: 17.12.2015

просто вставляй код и радуйся ...там весь расклад

vanila
Offline
Зарегистрирован: 25.08.2015

ну может я не правильно понял.

я для переменных использую byte в осносном, переменные обычно с двумя цифрами, поэтому большая часть не используется

 

а как я понял char incmd[2];

объявляет переменную с 2мя цифрами, что может помочь с уменьшением размера скетча.

 

lex2k
Offline
Зарегистрирован: 17.12.2015

2 не хватит минимум 3

# -обязательна рапознает команду по нему .....код коментарии читай

1 (к примеру) - символ команды

/0 - спец символ конца строки ставится автоматически в массив типа CHAR

команда с смс будет выглядить как #1

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vanila пишет:

andriano пишет:

if (time_sec < 10 && CXEMA_poliva == 1 && time_min%15 == 0) 
{
    polit_07();
    chas_poliva=time_h; 
    minuta_poliva=time_min;
}

Скетч у меня не влезает а оперативы вроде тютя в тютю)

че то на первый взгляд вроде по размеру не меньше.

Смысл в том, что не каждая строка меняется на такую конструкцию, а ВСЕ СТРОКИ заменяются едниой конструкцией из 6 строк.

bwn
Offline
Зарегистрирован: 25.08.2014

Отказ от DallasTemperature подарит 1-1,5К.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Отказ от Serial, и wiring в целом подарит под 30- 50% .. :)

bwn
Offline
Зарегистрирован: 25.08.2014

Arhat109-2 пишет:

Отказ от Serial, и wiring в целом подарит под 30- 50% .. :)

Это из разряда мечт.))) А библиотека только для блезиру нужна.
А как кстати безбольно похоронить сериал, в варианте ТС?

vanila
Offline
Зарегистрирован: 25.08.2015

В общем непостижимым для меня образом уместил таки программу!

Но прям в притык:

Sketch uses 31 958 bytes (99%) of program storage space. Maximum is 32 256 bytes.

В связи с чем у меня другой вопрос:

Не начнут ли поялвяться глюки из за того что память заполненна под завязку?

vanila
Offline
Зарегистрирован: 25.08.2015

vanila пишет:

Не начнут ли поялвяться глюки из за того что память заполненна под завязку?

Сам себе отвечу - начнут)))

Перестали выполнятся все смс команды.

Так что первоначальный вопрос еще в силе.

vanila
Offline
Зарегистрирован: 25.08.2015

bwn пишет:

Отказ от DallasTemperature подарит 1-1,5К.

Это библиотека?

для влажности и температуры я использую stDHT.h

vanila
Offline
Зарегистрирован: 25.08.2015

bwn пишет:

А как кстати безбольно похоронить сериал, в варианте ТС?

Тоже интересно)

bwn
Offline
Зарегистрирован: 25.08.2014

vanila пишет:

bwn пишет:

Отказ от DallasTemperature подарит 1-1,5К.

Это библиотека?

для влажности и температуры я использую stDHT.h

Показалось, что там запрос для DallasTemperature.
По уму, заполненный флэш никак влиять не должен на программу. Скорее ищите в ОЗУ.
И пытаться ваши сериалы группировать и выводить в общую функцию.

lex2k
Offline
Зарегистрирован: 17.12.2015

#include <Time.h> //время

А это за шо отвечает?

с смс получилось?

 

 

vanila
Offline
Зарегистрирован: 25.08.2015

Сейчас вот такая ситуация:

Sketch uses 31 318 bytes (97%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 413 bytes (68%) of dynamic memory, leaving 635 bytes for local variables. Maximum is 2 048 bytes.

смс команды не рабоатают

если закоменчиваю часть такого кода:

if (time_h  == 12 && time_min ==  0  && time_sec < 10 && CXEMA_poliva == 9) { polit_30();  chas_poliva=time_h;  minuta_poliva=time_min;  }

if (time_h  == 13 && time_min ==  0  && time_sec < 10 && CXEMA_poliva == 9) { polit_30();  chas_poliva=time_h;  minuta_poliva=time_min;  }

if (time_h  == 14 && time_min ==  0  && time_sec < 10 && CXEMA_poliva == 9) { polit_30();  chas_poliva=time_h;  minuta_poliva=time_min;  }

if (time_h  == 15 && time_min ==  0  && time_sec < 10 && CXEMA_poliva == 9) { polit_30();  chas_poliva=time_h;  minuta_poliva=time_min;  }

до уровня заполненности памяти ге то 80%, то все работает хорошо

vanila
Offline
Зарегистрирован: 25.08.2015

lex2k пишет:

#include <Time.h> //время

А это за шо отвечает?

с смс получилось?

это библиотека времени, я чет хз за что она точно отвечает но без нее время у меня не аботает, модуль 1307 вроде. или 2307 или че то типа того

С смс пока не пробовал, руки не дошли

lex2k
Offline
Зарегистрирован: 17.12.2015

вот тут еще покумекал 

а вместо

    if(CXEMA_poliva==1)   {  lcd.setCursor(9,0); lcd.print("CXEMA.1"); } 
    if(CXEMA_poliva==2)   {  lcd.setCursor(9,0); lcd.print("CXEMA.2"); } 
    if(CXEMA_poliva==3)   {  lcd.setCursor(9,0); lcd.print("CXEMA.3"); } 
    if(CXEMA_poliva==4)   {  lcd.setCursor(9,0); lcd.print("CXEMA.4"); } 
    if(CXEMA_poliva==5)   {  lcd.setCursor(9,0); lcd.print("CXEMA.5"); } 
    if(CXEMA_poliva==6)   {  lcd.setCursor(9,0); lcd.print("CXEMA.6"); } 
    if(CXEMA_poliva==7)   {  lcd.setCursor(9,0); lcd.print("CXEMA.7"); } 
    if(CXEMA_poliva==8)   {  lcd.setCursor(9,0); lcd.print("CXEMA.8"); }
    if(CXEMA_poliva==9)   {  lcd.setCursor(9,0); lcd.print("CXEMA.9"); } 
    if(CXEMA_poliva==0)   {  lcd.setCursor(9,0); lcd.print("-------"); }     
 
вот так не прокатит
  
lcd.setCursor(9,0); lcd.print("CXEMA." + char(CXEMA_poliva));
 
тока в последнем случае 0 будет а не "--------------"
или
lcd.setCursor(9,0); lcd.print("CXEMA." + String(CXEMA_poliva));
 

а вот так полный аналог твоего 

if(CXEMA_poliva)   {  lcd.setCursor(9,0); lcd.print("CXEMA." + String(CXEMA_poliva)); } else  {  lcd.setCursor(9,0); lcd.print("-------"); }  

мож памяти и не сэкономит но избыточность кода уберет