сокращение повторяющего кода или повторявших команд

mrtester
Offline
Зарегистрирован: 26.02.2015
void DisPlay(){
  if (regimDP!=BS) { //очищаем дисплей при переходе на любой другой режим отображения
    lcd.clear();
    timerDP=0;
    regimDP=BS;} 
  if (BS>4) { //самодиагностика
    if (timerDSB==0) lcd.backlight(); //вкл подсветку дисплея
    if (timerDSB==5) lcd.noBacklight(); //выкл подсветку дисплея
    if (timerDP>16) { //таймер 1 строки, меняем вывод информации
      flagDPa=!flagDPa;
      timerDP=0;}
    lcd.setCursor(0, 0);
    if (flagDPa==0) {
      lcd.print(L"ОБРЫВ ЛИНИИ ИЛИ");}
    if (flagDPa==1) {
      lcd.print(L" ДЕФЕКТ ДАТЧИКА");}
    if (BS==5) {
      lcd.setCursor(4, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==6) {
      lcd.setCursor(2, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==7) {
      lcd.setCursor(3, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==8) {
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ  ");
      lcd.print(TempHause);
      lcd.print(L"°С ");
      lcd.print(" f=");
      lcd.print(Humidity);
      lcd.print("%");}}
  if (BS<4) { //отображаем диагностиеу
    lcd.backlight(); //вкл подсветку дисплея
    if (timerCH>252) BS=4; //выходит из диагностики через 63 сек
    lcd.setCursor(0, 0);
    lcd.print(L"ОШИБКИ  ");
    if (BS==0) {
      lcd.print(TP-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==1) {
      lcd.print(TA-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==2) {
      lcd.print(TS-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==3) {
      lcd.print(TH-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ  ");
      lcd.print(TempHause);
      lcd.print(L"°С ");
      lcd.print(" f=");
      lcd.print(Humidity);
      lcd.print("%");}}
  if (BS==4) { //рабочий режим
    if (BR==1 && Fan==0){ //ни чего не работает
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    if (FOTO==0 && Fan==0) { //работает т. п., но темно в помещении
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    // вывели показание на дисплей 1 строка
    if (FOTO==1 && Fan==0 && BR!=1) { // не работает вентилято и печ, отображаем т. п.
      lcd.setCursor(0, 0);
      lcd.print(L"ПОЛ ");
      lcd.print(TempPol);
      lcd.print(L"°C");
      lcd.print("   ");
      if (warms==1){
        lcd.setCursor(11, 0);
        lcd.print(L"ГРЕЕТ");}
      if (warms==0){
        lcd.setCursor(11, 0);
        lcd.print("     ");}}
    if (Fan>0 && Fan<4) { // работает печь
      lcd.setCursor(0, 0);
      lcd.print(L"ПЕЧЬ ");
      lcd.print(TempStove);
      lcd.print(L"°C ");
      lcd.print(Fan-0); //отображаем режим 1, 2, 3
      //if (Fan==1) lcd.print("1");
      //if (Fan==2) lcd.print("2");
      //if (Fan==3) lcd.print("3");
      lcd.print(L" скор");}
    if (Fan>3 && Fan<7){ // работает вентиляция 
      lcd.setCursor(0, 0);
      lcd.print(L"Вентиляция реж ");
      lcd.print(Fan-3);} //отображаем режим 1, 2, 3
      //if (Fan==4)lcd.print("1");
      //if (Fan==5)lcd.print("2");
      //if (Fan==6)lcd.print("3");
    if ((Fan>0 && Fan<7) || (BR!=1 && FOTO==1)) { //2 срока
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ");
      lcd.setCursor(4, 1); 
      lcd.print(TempHause);
      lcd.print(L"°С");
      lcd.setCursor(11, 1);
      lcd.print("f=");
      lcd.setCursor(13, 1); 
      lcd.print(Humidity);
      lcd.print("%"); 
      lcd.backlight();}}} //вкл подсветку дисплея

например строки 33 по 39, 65 по 71, 110 по 119 одно и тоже действие, как их можно выполнить одной командой

AlexanderNO
Offline
Зарегистрирован: 08.11.2018
sheff
Offline
Зарегистрирован: 14.11.2017

Смею предположить, что через оператор "или"....
 

if ((Fan>0 && Fan<7) || (BR!=1 && FOTO==1) || (BS==3) || (BS==8)) { //2 срока
      lcd.setCursor(0, 1);
      lcd.print(L"ДОМ");
      lcd.setCursor(4, 1); 
      lcd.print(TempHause);
      lcd.print(L"°С");
      lcd.setCursor(11, 1);
      lcd.print("f=");
      lcd.setCursor(13, 1); 
      lcd.print(Humidity);
      lcd.print("%"); 
      lcd.backlight();}

 

mrtester
Offline
Зарегистрирован: 26.02.2015

не очень подходит

mrtester
Offline
Зарегистрирован: 26.02.2015
void DisPlay(){
  int haus;
  haus = second_line();
  int second_line(){
    lcd.setCursor(0, 1);
    lcd.print(L"ДОМ");
    lcd.setCursor(4, 1); 
    lcd.print(TempHause);
    lcd.print(L"°С");
    lcd.setCursor(11, 1);
    lcd.print("f=");
    lcd.setCursor(13, 1); 
    lcd.print(Humidity);
    lcd.print("%"); }
  if (regimDP!=BS) { //очищаем дисплей при переходе на любой другой режим отображения
    lcd.clear();
    timerDP=0;
    regimDP=BS;} 
  if (BS>4) { //самодиагностика
    if (timerDSB==0) lcd.backlight(); //вкл подсветку дисплея
    if (timerDSB==5) lcd.noBacklight(); //выкл подсветку дисплея
    if (timerDP>16) { //таймер 1 строки, меняем вывод информации
      flagDPa=!flagDPa;
      timerDP=0;}
    lcd.setCursor(0, 0);
    if (flagDPa==0) {
      lcd.print(L"ОБРЫВ ЛИНИИ ИЛИ");}
    if (flagDPa==1) {
      lcd.print(L" ДЕФЕКТ ДАТЧИКА");}
    if (BS==5) {
      lcd.setCursor(4, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==6) {
      lcd.setCursor(2, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==7) {
      lcd.setCursor(3, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==8) {
      haus;}}
  if (BS<4) { //отображаем диагностиеу
    lcd.backlight(); //вкл подсветку дисплея
    if (timerCH>252) BS=4; //выходит из диагностики через 63 сек
    lcd.setCursor(0, 0);
    lcd.print(L"ОШИБКИ  ");
    if (BS==0) {
      lcd.print(TP-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==1) {
      lcd.print(TA-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==2) {
      lcd.print(TS-0); //количество ощибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==3) {
      haus;}}
  if (BS==4) { //рабочий режим
    if (BR==1 && Fan==0){ //ни чего не работает
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    if (FOTO==0 && Fan==0) { //работает т. п., но темно в помещении
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    // вывели показание на дисплей 1 строка
    if (FOTO==1 && Fan==0 && BR!=1) { // не работает вентилято и печ, отображаем т. п.
      lcd.setCursor(0, 0);
      lcd.print(L"ПОЛ ");
      lcd.print(TempPol);
      lcd.print(L"°C");
      lcd.print("   ");
      if (warms==1){
        lcd.setCursor(11, 0);
        lcd.print(L"ГРЕЕТ");}
      if (warms==0){
        lcd.setCursor(11, 0);
        lcd.print("     ");}}
    if (Fan>0 && Fan<4) { // работает печь
      lcd.setCursor(0, 0);
      lcd.print(L"ПЕЧЬ ");
      lcd.print(TempStove);
      lcd.print(L"°C ");
      lcd.print(Fan-0); //отображаем режим 1, 2, 3
      //if (Fan==1) lcd.print("1");
      //if (Fan==2) lcd.print("2");
      //if (Fan==3) lcd.print("3");
      lcd.print(L" скор");}
    if (Fan>3 && Fan<7){ // работает вентиляция 
      lcd.setCursor(0, 0);
      lcd.print(L"Вентиляция реж ");
      lcd.print(Fan-3);} //отображаем режим 1, 2, 3
      //if (Fan==4)lcd.print("1");
      //if (Fan==5)lcd.print("2");
      //if (Fan==6)lcd.print("3");
    if ((Fan>0 && Fan<7) || (BR!=1 && FOTO==1)) { //2 срока
      haus;
      lcd.backlight();}}} //вкл подсветку дисплея

я правильно понял

 

inspiritus
Онлайн
Зарегистрирован: 17.12.2012

А что, как есть в память не влезает?

mrtester
Offline
Зарегистрирован: 26.02.2015

влезает, интересно просто как уменьшить размер

kalapanga
Offline
Зарегистрирован: 23.10.2016

mrtester пишет:

я правильно понял

Идею-то может и поняли (повторяющиеся куски вынести в функцию), но реализовали совсем не правильно.

Сущность "haus" вобще ни к чему. Строки 2 и 3 выкидываем. Ваша функция ничего не возвращает, значит ей незачем иметь тип int. В строке 4 меняем int на void. Во всех местах, где вы пытаетесь её вызвать словом haus (например в строке 110) пишете вместо него: second_line();

Далее осваиваете функции с параметрами, тогда ещё сможете украсить Ваш скетч.

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

mrtester
Offline
Зарегистрирован: 26.02.2015
старый код 
ketch uses 14 490 bytes (44%) of program storage space. Maximum is 32 256 bytes.
Global variables use 779 bytes (38%) of dynamic memory, leaving 1 269 bytes for local variables. Maximum is 2 048 bytes.

Спасибо, прилично уменьшает

 Sketch uses 14 248 bytes (44%) of program storage space. Maximum is 32 256 bytes.

Global variables use 765 bytes (37%) of dynamic memory, leaving 1 283 bytes for local variables. Maximum is 2 048 bytes.

 

 

mrtester
Offline
Зарегистрирован: 26.02.2015
void DisPlay_second_line(){
  lcd.setCursor(0, 1);
  lcd.print(L"ДОМ  ");
  lcd.print(TempHause);
  lcd.print(L"°С ");
  lcd.print(" f=");
  lcd.print(Humidity);
  lcd.print("%");}

void DisPlay(){
  if (regimDP!=BS) { //очищаем дисплей при переходе на любой другой режим отображения
    lcd.clear();
    timerDP=0;
    regimDP=BS;} 
  if (BS>4) { //самодиагностика
    if (timerDSB==0) lcd.backlight(); //вкл подсветку дисплея
    if (timerDSB==5) lcd.noBacklight(); //выкл подсветку дисплея
    if (timerDP>16) { //таймер 1 строки, меняем вывод информации
      flagDPa=!flagDPa;
      timerDP=0;}
    lcd.setCursor(0, 0);
    if (flagDPa==0) {
      lcd.print(L"ОБРЫВ ЛИНИИ ИЛИ");}
    if (flagDPa==1) {
      lcd.print(L" ДЕФЕКТ ДАТЧИКА");}
    if (BS==5) {
      lcd.setCursor(4, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==6) {
      lcd.setCursor(2, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==7) {
      lcd.setCursor(3, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==8) DisPlay_second_line();}
      
  if (BS<4) { //отображаем диагностиеу
    lcd.backlight(); //вкл подсветку дисплея
    if (timerCH>252) BS=4; //выходит из диагностики через 63 сек
    lcd.setCursor(0, 0);
    lcd.print(L"ОШИБКИ  ");
    if (BS==0) {
      lcd.print(TP-0); //количество ошибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПОЛ  ");
      lcd.print(TempPol);
      lcd.print(L"°C");}
    if (BS==1) {
      lcd.print(TA-0); //количество ошибок
      lcd.setCursor(0, 1);
      lcd.print(L"ВОЗДУХ  ");
      lcd.print(TempAir);
      lcd.print(L"°C");}
    if (BS==2) {
      lcd.print(TS-0); //количество ошибок
      lcd.setCursor(0, 1);
      lcd.print(L"ПЕЧЬ  ");
      lcd.print(TempStove);
      lcd.print(L"°C");}
    if (BS==3) {
      lcd.print(TH-0); //количество ошибок
      DisPlay_second_line();}}
  if (BS==4) { //рабочий режим
    if (BR==1 && Fan==0){ //ни чего не работает
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    if (FOTO==0 && Fan==0) { //работает т. п., но темно в помещении
      lcd.noBacklight(); //выкл подсветку дисплея
      lcd.clear();} // очистили дисплей
    // вывели показание на дисплей 1 строка
    if (FOTO==1 && Fan==0 && BR!=1) { // не работает вентилято и печ, отображаем т. п.
      lcd.setCursor(0, 0);
      lcd.print(L"ПОЛ ");
      lcd.print(TempPol);
      lcd.print(L"°C");
      lcd.print("   ");
      if (warms==1){
        lcd.setCursor(11, 0);
        lcd.print(L"ГРЕЕТ");}
      if (warms==0){
        lcd.setCursor(11, 0);
        lcd.print("     ");}}
    if (Fan>0 && Fan<4) { // работает печь
      lcd.setCursor(0, 0);
      lcd.print(L"ПЕЧЬ ");
      lcd.print(TempStove);
      lcd.print(L"°C ");
      lcd.print(Fan-0); //отображаем режим 1, 2, 3
      //if (Fan==1) lcd.print("1");
      //if (Fan==2) lcd.print("2");
      //if (Fan==3) lcd.print("3");
      lcd.print(L" скор");}
    if (Fan>3 && Fan<7){ // работает вентиляция 
      lcd.setCursor(0, 0);
      lcd.print(L"Вентиляция реж ");
      lcd.print(Fan-3);} //отображаем режим 1, 2, 3
      //if (Fan==4)lcd.print("1");
      //if (Fan==5)lcd.print("2");
      //if (Fan==6)lcd.print("3");
    if ((Fan>0 && Fan<7) || (BR!=1 && FOTO==1)) { //2 срока
      DisPlay_second_line();
      lcd.backlight();}}} //вкл подсветку дисплея

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Следующая часто повторяющаяся последовательность - установить курсор в координаты, вывести строку, вывести значение, вывести ещё строку. Вот и сделайте функцию, которая всё это выполняет, а координаты, строки и числа передавайте ей в качестве параметров. Текст ещё существенно сократится.

mrtester
Offline
Зарегистрирован: 26.02.2015

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