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

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

у тебя дважды встречается код 

 // Настраиваем Модуль
    Serial.begin(19200);
    Serial.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения
    delay(300);
    Serial.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных
    delay(300);
    Serial.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты.!
    delay(300);
    Serial.print("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс.!
    delay(500);
    Serial.print("AT+CMGD=1,4\r");//все удалить
    delay(500);
 
лучше его написать как функцию
 
void gsmsetup()
{
Serial.begin(19200);
    Serial.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения
    delay(300);
    Serial.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных
    delay(300);
    Serial.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты.!
    delay(300);
    Serial.print("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс.!
    delay(500);
    Serial.print("AT+CMGD=1,4\r");//все удалить
    delay(500);
}
и потом
в setup()  
{
gsmsetup()
}
 
 
и в  loop()
{
gsmsetup()
}
вот))))
lex2k
Offline
Зарегистрирован: 17.12.2015
вот еще лови
вместо
//задаем продолжительность полива 7 секунд, закрываем клапаны
void prodolgitelnost_poliva_07() {
    lcd.setCursor(7,0);  
    lcd.print("07");
       delay (1000);
    lcd.setCursor(7,0);  
    lcd.print("06");
       delay (1000);
    lcd.setCursor(7,0);  
    lcd.print("05");
       delay (1000);
    lcd.setCursor(7,0);
    lcd.print("04");
       delay (1000);
    lcd.setCursor(7,0);
    lcd.print("03");
       delay (1000);
    lcd.setCursor(7,0);
    lcd.print("02");
       delay (1000);
    lcd.setCursor(7,0);
    lcd.print("01");
       delay (1000);
    lcd.setCursor(0,0);
    lcd.print("         ");
    
    pcf.set();   //все i2c выходы HIGH
     digitalWrite (nasos,LOW);
      delay (3000);  //пауза перед следующим поливом
}
 
пишем вот так
void prodolgitelnost_poliva_07() {
    
    for (byte i = 7 ; i!=0; i--)  
     {
      lcd.setCursor(7,0);
      lcd.print("0" + char(i)); // или lcd.print("0" + String(i));
      delay (1000);
     }
    lcd.setCursor(0,0);
    lcd.print("         ");
    
    pcf.set();   //все i2c выходы HIGH
     digitalWrite (nasos,LOW);
      delay (3000);  //пауза перед следующим поливом
}

в void prodolgitelnost_poliva_10()  и void prodolgitelnost_poliva_15()  сооттветственно i=10 и i=15

lex2k
Offline
Зарегистрирован: 17.12.2015
и вообще я б тут вообще одну функцию использова вместо 3,  с передачей одного параметра
 
void prodolgitelnost_poliva(byte i) {
    
    for ( ; i!=0; i--)  
     {
      lcd.setCursor(7,0);
      lcd.print("0" + char(i)); // или lcd.print("0" + String(i));
      delay (1000);
     }
    lcd.setCursor(0,0);
    lcd.print("         ");
    
    pcf.set();   //все i2c выходы HIGH
     digitalWrite (nasos,LOW);
      delay (3000);  //пауза перед следующим поливом
}
 
и вызывал
prodolgitelnost_poliva(7)
prodolgitelnost_poliva(10)
prodolgitelnost_poliva(15) 
или любое вообще время
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

просто я не программист от слова совсем, это первая программа которую я написал, а потому что бы въехать в чужой код мне нужно некоторое время))

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

ок чем мог ....разбирайся

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

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

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

lex2k пишет:

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

лучше я сам, а то потом не пойму нифига.

но всеравно спасибо!)

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

В итоге вот такой код получился:


//задаем продолжительность полива, закрываем клапаны
 void prodolgitelnost_poliva(byte y) {
    
    for ( ; y!=0; y--)  
     {
       lcd.setCursor(7,0);
       lcd.print("  "); //стираем предыдущее значение
       lcd.setCursor(7,0);
       lcd.print( String(y));// пишим количество секунд до закрытия
      delay (1000);
     }
    lcd.setCursor(0,0);
    lcd.print("         ");
    
    pcf.set();   //все i2c выходы HIGH
     digitalWrite (nasos,LOW);
      delay (3000);  //пауза перед следующим поливом
}

плюс раскидал повторяющийся код по функциям и

 

Sketch uses 28 438 bytes (88%) of program storage space. Maximum is 32 256 bytes.

и GSM  заработал! Аллилуя! )))

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Поздравлямс

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

=)

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

а остальное оптимизировал как я предлогал?

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

vanila пишет:

В итоге вот такой код получился:


//задаем продолжительность полива, закрываем клапаны
 void prodolgitelnost_poliva(byte y) {
    
    for ( ; y!=0; y--)  
     {
       lcd.setCursor(7,0);
       lcd.print("  "); //стираем предыдущее значение
       lcd.setCursor(7,0);
       lcd.print( String(y));// пишим количество секунд до закрытия
      delay (1000);
     }
    lcd.setCursor(0,0);
    lcd.print("         ");
    
    pcf.set();   //все i2c выходы HIGH
     digitalWrite (nasos,LOW);
      delay (3000);  //пауза перед следующим поливом
}

плюс раскидал повторяющийся код по функциям и

 

Sketch uses 28 438 bytes (88%) of program storage space. Maximum is 32 256 bytes.

и GSM  заработал! Аллилуя! )))

красиво ))))))))))))))))))))))

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

только повторяющийся код отдельно вынес и все

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

а инициализацию gsm 2 раза повторяется.......а вывод на дисплей

на 1 стр смотри

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

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

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

как запрос баланса сделал ..покаж

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

я  советую отимизировать все пока при памяти.......потом появятся еще идеи и опять начнется оптимизация

 

как запрос баланса сделал ..покаж

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

тут палка о двух концах, потом захочу прочесть код а не пойму нифика)) так что оставлю пока так

пока никак, вот пытаюсь понять как применить пока.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

vanila пишет:

тут палка о двух концах, потом захочу прочесть код а не пойму нифика)) так что оставлю пока так

пока никак, вот пытаюсь понять как применить пока.

Дык а комменты зачем придуманы?

Пиши комменты на каждый чиз - без них через месяц сам не поймешь что написал!

Пример:

// назначение пинов
#define TMread 2//TM key pin
#define LEDclk 3//LED 1637 pin CLK
#define LEDdio 4//LED 1637 pin DIO

#define SoundPin 9//Звук в динамик

#define pinKBx1 6 // 1 столбец кнопок
#define pinKBx2 7 // 2 столбец кнопок
#define pinKBx3 8 // 3 столбец кнопок
#define pinKBy1 14 // 1 строка кнопок
#define pinKBy2 15 // 2 строка кнопок
#define pinKBy3 16 // 3 строка кнопок
#define pinKBy4 17 // 4 строка кнопок
//   x1  x2  x3
//y1  1   2   3
//y2  4   5   6
//y3  7   8   9
//y4  A   B   C

int melody[] = 
{
  NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = 
{
  4, 8, 8, 4, 4, 4, 4, 4
};

int  TimeXX=1000; //дкелитель миллисекунд
byte Seg_ON=0; //двоеточие на индикаторе
byte TMbuffer[8];// буфер приема
byte TMlistKEY[20][8];// 5 ключей админских и 15 игровых ключей
byte PrevCMD=0;// Предыдущая команда
byte NextCMD=0;// следующая команда
byte ChCMD=0;// буфер считывания команды
byte SetMode=0;// режим - 0 не установлен, 1 кнопки, 2 ключи
byte SetTimerMode=1;// режим - 0 таймер выключен, 1 таймер включен
unsigned long buffMillis=0;// буфер для расчетов
unsigned long PrevMillis=0;// предыдущее время в миилсах
unsigned long NextMillis=0;// следующее время в миилсах
unsigned long CMDmillis[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};// следующее время в миилсах

byte buffTM[8];// буфер приема ТМ-ключей

byte ChemodanKey[4]={0,0,0,0};

TM1637 tm1637(LEDclk,LEDdio);
OneWire ds(TMread); // выход считывателя на пин TMread

void setup() // стартовая инициализация
{
                      Serial.begin(9600); //для отладки
                      Serial.println("Start..."); //для отладки

//    SoundSET();
    SirenaOUT();
    /* Инициализация структур */    
    pinMode(pinKBx1, INPUT);           // назначить порт ввода X1
    digitalWrite(pinKBx1, HIGH);       // включить подтягивающий резистор
    pinMode(pinKBx2, INPUT);           // назначить порт ввода X2
    digitalWrite(pinKBx2, HIGH);       // включить подтягивающий резистор
    pinMode(pinKBx3, INPUT);           // назначить порт ввода X3
    digitalWrite(pinKBx3, HIGH);       // включить подтягивающий резистор
    pinMode(pinKBy1, OUTPUT);          // назначить порт вывода Y1
    pinMode(pinKBy2, OUTPUT);          // назначить порт вывода Y2
    pinMode(pinKBy3, OUTPUT);          // назначить порт вывода Y3
    pinMode(pinKBy4, OUTPUT);          // назначить порт вывода Y4

    tm1637.init();
    tm1637.set(5);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    tm1637.display(0,0); //в левом сегменте 0 остальные потушены

    // Читаем с хранилища ключи - 20 шт 5 админских 0-4 и 15 игровых 5-20
    for(byte TM1  = 0; TM1 < 20; TM1++)
    {
      for(byte TM2 = 0; TM2 < 8; TM2++)
      {
          TMlistKEY[TM1][TM2]=EEPROM.read(TM1*8+TM2);
      }
    }
}
vanila
Offline
Зарегистрирован: 25.08.2015

не комментами едиными)

а так пишу конечно

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

и все таки прогресс очивиден)))))))))))

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

у меня еще вопрос созрел:

а можно ли отправить смс сразу 3м адресатам, не по очереди а так скзать спам рассылкой?

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

С начала мене было любопытно - это чего там за поливалка такая на 28кб. Но читая далее топик и видя обрывки кода я стал догадываться в чем проблемма. Vanila, вы собираетесь учиться программировать ? Я не хочу вас обидеть или как то зацепить, просто подобного "кода" я не видал с 1986г. К сожалению вы абсолютно не владеете инструментом и какими то навоками программирования.

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

я это и без тебя знаю, сказать то чо хотел?

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

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

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

vanila пишет:

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

Абсолютно согласен!

Да и вообще, сейчас все производители создают девайс и пускают его на рынок, а уж потом допиливают софт, улучшая производительность, энергопотребление и т.д. И очень хорошо, если нет аппаратных ляпов, которые к сожалению совсем не редкость.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

А я не согласен. Надо само совершенствоваться хоть как-нибудь. Начался век недокодеров.....
Если уж не пишете на С, то пишите на Wiring аккуратно....а то сорцы проекта стыдно публиковать будет.

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

Я начинал с асемблера на PIC, потом С для AVR, а когда попробовал WIRING, понял, что не стоит тратить много времени, если требуется однократное выполнение простой задачи. Одно дело если Вы профи и выполняете комерческие проекты, а другое дело любитель. Подергать ножками на асме запросто, а вот инициализация сложной периферии совсем другое дело и в Wiring очень много внимания уделено библиотекам, которые очень сильно облегячают жизнь.

А насчет самообразования полностью за. Ежедневно задаваемые на этом форуме вопросы говорят о том, что народ не только не хочет познавать, но даже элементарным поиском пользоваться не хочет, видимо для них проще спросить и сидеть ждать неделю, пока кто то даст совет, который поможет, чем думать своей головой.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

vanila пишет:

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

Есть небольшой ньюанс. Грамотно написанная программа будет меньше по объему, как правило быстрее работать и проще в сопровождении впоследствии. А уж поверь мне - со временем появятся новые идеи, а вспомнить что для чего написано будет трудно.

В свое время писал проект по учету приватизированного жилья города. Так после сдачи проекта еще года 3 или 4 доделывал хотелки - благо код был закомментирован по самое немогу и быстро вспоминал что и зачем делал.

Я не изучал трех-томник Кнута, но как то попил с профессиональным программистом (по образованию и призванию), попутно поспрашивал про пимененные методы. Так выяснилось что в основном все положенные принципы соответствуют учению Кнута ;)

 

Ну и как резюме:

прежде чем садиться писать код нужно сначала положить алгоритм на бумагу, с учетом наличия функций и операторов языка. В нашем случае - это вместо линейной схемы перебора более гибко использовать циклы, уменьшить число переменных. И я уверен что после оптимизации кода еще половина памяти останется свободной ;)

 

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

Товарищи!

Моя задача чтобы код мог делать то что мне надо, и он это делает.

Ясень пень что можно и напрямую к портам обращаться без всягих digitalwrite, можно не использовать библиотеки а самому все писать, можно все делать намного короче. Да вообще можно выкинуть ардуину, взять мк с рассыпухой и писать под нее и все будет в разы меньше и дешевле. А жсм модуль тоже не за бешенные бабки покупать а из старого телефона выпаять итд итп.

Только зачем мне человеку который вообще в первый раз видит всю эту приблуду этим заниматься?

Ну и Вы не правы, поддержке и последующему редактированию, для не программиста, гораздо больше способствуюет последовательный код без всяких малопонятных циклов, хоть это и занимает больше места.

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

А товарищ сва_и_цифры_какието решил просто выепендрится, и назвать не программиста не программистом, нет бы раз уж программист с большим стажем на вопрос ответить, ан нет, заглянул, пукнул и слился))

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Я самое главное написал в последнем абзаце - прежде чем писать код нужно положить алгоритм на бумагу - для ясного понимания а что собственно мы делаем.

После этого собственно кодирование - рутинная работа.

Кстати - по крайней мере на западе работа аналитика на порядки дороже обходится чем работа кодера ;)

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

Уважаемый vanila, я никуда не слился и сразу написал что не хотел задеть ваши нежные чувства. То что я вам указал на не владением инструментом это намек на то что не плохо бы хотя бы с языком ознакомиться, его конструкциями. Но вы ясно обозначили свою позицию - по-хер. По этому дальнейшую дискуссию считаю безсмысленной.

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

sva1509 пишет:

Доброго времени суток !

Уважаемый vanila, я никуда не слился и сразу написал что не хотел задеть ваши нежные чувства. То что я вам указал на не владением инструментом это намек на то что не плохо бы хотя бы с языком ознакомиться, его конструкциями. Но вы ясно обозначили свою позицию - по-хер. По этому дальнейшую дискуссию считаю безсмысленной.

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

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

at0mix пишет:

Я самое главное написал в последнем абзаце - прежде чем писать код нужно положить алгоритм на бумагу - для ясного понимания а что собственно мы делаем.

После этого собственно кодирование - рутинная работа.

Кстати - по крайней мере на западе работа аналитика на порядки дороже обходится чем работа кодера ;)

я сначала написал главную задачу а затем подключал дополнительные модули, но конечная цель была определена заранее.

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

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

А может всетаки кто то знает?

vanila пишет:

а можно ли отправить смс сразу 3м адресатам, не по очереди а так скзать спам рассылкой?

По очереди тремя смсками я сделал, и не линейно а циклом, как вы любите)))

Суть в том что эта смс отсылается 3м адресатам когда пропадает электричество и устройство переходит на питание от батареи и если смски отправлять поочередно то это быстрее высадит аккум.

Поэтому хочется отправлять сообщение разом всем. Это возможно?

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Понимаешь, Кнут не зря назвал свою книгу ИСКУССТВО ПРОГРАММИРОВАНИЯ

https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

Потому что это действительно ИСКУССТВО. И мне например приятно смотреть если не профессиональную реализацию изящного алгоритма - то хотя бы на ремесленное кодирование грамотно составленного алгоритма.

Тебе походу это не нужно и непонятно.

Извини.

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

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

есть такой научный принцип - бритва оккама

в сущности он говорит что если в итоге результат один и тот же, то правильное решение то которое проще.

для меня, как не программиста, проще когда код линеен и последователен а посему правильный код тот который мне понятней. 

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

vanila пишет:

А может всетаки кто то знает?

vanila пишет:

а можно ли отправить смс сразу 3м адресатам, не по очереди а так скзать спам рассылкой?

По очереди тремя смсками я сделал, и не линейно а циклом, как вы любите)))

Суть в том что эта смс отсылается 3м адресатам когда пропадает электричество и устройство переходит на питание от батареи и если смски отправлять поочередно то это быстрее высадит аккум.

Поэтому хочется отправлять сообщение разом всем. Это возможно?

типа рассылки......ат команды копать надо.......

----------------------------------------------------------------------------------------

написал...работает........радуйся)))))))))

свои грабли лучьше чужих

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

в общем....рассалка это не задача gsm девайса команда на отправку смс тока одна Message sending:+CMGS и не предусматривает ввода нескольких номеров.....можно конечно с Send stored message:+CMSS повозиться .но выигыш не очивиден.....тока програмно.  разом не проидет не мучайся

====================

пришли пару помидорок по сезону))))))))))))))))))

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

Ну понятно, значит по очереди будет отправляться.

Это для зеленого черенкования, помидорки тп мы не выращиваем :)

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

vanila пишет:

Ну понятно, значит по очереди будет отправляться.

Это для зеленого черенкования, помидорки тп мы не выращиваем :)

запрос баланса сделал?

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

неа пока времени нет