сокращение повторяющего кода или повторявших команд
- Войдите на сайт для отправки комментариев
Пт, 25/01/2019 - 00:14
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 одно и тоже действие, как их можно выполнить одной командой
http://arduino.ru/Reference/FunctionDeclaration
Смею предположить, что через оператор "или"....
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();}не очень подходит
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();}}} //вкл подсветку дисплеяhttp://arduino.ru/Reference/FunctionDeclaration
я правильно понял
А что, как есть в память не влезает?
влезает, интересно просто как уменьшить размер
я правильно понял
Идею-то может и поняли (повторяющиеся куски вынести в функцию), но реализовали совсем не правильно.
Сущность "haus" вобще ни к чему. Строки 2 и 3 выкидываем. Ваша функция ничего не возвращает, значит ей незачем иметь тип int. В строке 4 меняем int на void. Во всех местах, где вы пытаетесь её вызвать словом haus (например в строке 110) пишете вместо него: second_line();
Далее осваиваете функции с параметрами, тогда ещё сможете украсить Ваш скетч.
Ну и говоря "уменьшить размер" обычно подразумевает уменьшить занимаемую скомпилированным скетчем память микроконтроллера. Здесь правильнее говорить об удобстве, повышении читабельности и т.д.
Спасибо, прилично уменьшает
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.
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();}}} //вкл подсветку дисплеяСледующая часто повторяющаяся последовательность - установить курсор в координаты, вывести строку, вывести значение, вывести ещё строку. Вот и сделайте функцию, которая всё это выполняет, а координаты, строки и числа передавайте ей в качестве параметров. Текст ещё существенно сократится.
можно какой ни будь пример, а то я пробую и все получается на увеличение