Нужна подсказка по оптимизации скеча
- Войдите на сайт для отправки комментариев
Здравствуйте. Нужна подсказка от продвинутых кодеров.
Написал скеч для Мега2560 + LCD 320*480 и мембранная клавиатурка на 6 кнопок. Покачто просто построил графическое меню.
С самим меню проблем нет, все работает. Но кнопки реагируют ооочень плохо! То через раз нажимаются, то через два, то очень медленно реагируют на нажатие. Пробовал подтягивать резисторами и без них. эфект тотже.
Начал было грешить на титановый велосипед от клапауция. Но попробовав залить преметивный скеч, с выводом цыфирок в сериал после нажатия кнопок. Я понял что кнопки реагируют превосходно!! И титановый велосипед тут непричем. А значит виноват сам скеч. Но я ненастолько опытный чтобы найти этот свой косяк. Чтото в моем коде сильно замедляет реакцию кнопок. Толи код сильно длинный, толи я его не граматно построил, толи слишком много переменных. Уже незнаю что и думать...
Сильно не пинайте это всеголиш мой третий проэкт. Буду благодарен за любую подсказку.
Вот этот код:
#include <class_BUTTON.h> #include <memorysaver.h> #include <UTFT.h> #include <SPI.h> #include <SdFat.h> #include <UTFT_SdRaw.h> #define SD_CHIP_SELECT 53 SdFat sd; #include <max6675.h> #include <Servo.h> UTFT myGLCD(CTE32HR, 38, 39, 40, 41); extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[]; extern uint8_t BigFontRus[]; //Кирилица UTFT_SdRaw myFiles(&myGLCD); Servo Zaslonka; int thermo_vcc_pin = 13; int ktcSO = 12; int ktcCS = 11; int ktcCLK = 10; MAX6675 ktc(ktcCLK, ktcCS, ktcSO); BUTTON BUTTON_MENU(14); BUTTON BUTTON_SELECT(15); BUTTON BUTTON_AUTO(16); BUTTON BUTTON_LEFT(17); BUTTON BUTTON_RIGHT(18); BUTTON BUTTON_ONOFF(19); #define RELAY_01 4 #define RELAY_POMPA 3 boolean StatusCold = false; boolean relayEnable = false; int menu = 0; int menuselect = 0; int menuregim = 0; int menunasos = 0; int menugsm = 0; int menusecyrity = 0; int menubalans = 0; int fonstol = 0; int fonmenu = 0; int oboiselect = 0; int oboiregim = 0; int nomerfonstol =0; int nomerfonmenu = 0; int titulmenu = 0; int menuregimvn = 0; int gsmsignal = 0; int zaslonka = 0; int nasosregim = 0; int nasosavto = 0; int securregim = 0; int signsostpodduv = 0; int signnetelekt = 0; int tempnasosastart = 70; int tempnasosastop = 60; int xfonstol = 0; int xfonmenu = 0; int gsmselekt = 0; int telefonvkl = 0; int balansregim = 0; void setup() { // инициализируем дисплей с вертикальной ориентацией myGLCD.InitLCD(); // очищаем экран myGLCD.clrScr(); // выбираем большой шрифт myGLCD.setFont(BigFont); // ждём успешной инициализации SD-карты while (!sd.begin(SD_CHIP_SELECT)) { // устанавливаем красный цвет «чернил» для печати и рисования myGLCD.setColor(VGA_RED); // печатаем строку в указанной строке позиции myGLCD.print("SD Card ERROR!", CENTER, 100); delay(1000); } // устанавливаем зелёный цвет «чернил» для печати и рисования myGLCD.setColor(VGA_GREEN); // печатаем строку в указанной строке позиции myGLCD.print("SD Card OK", CENTER, 90); // ждём 1 секунду delay(1000); myFiles.load(0, 0, 480, 320, "privet.raw"); delay(4000); pinMode(RELAY_POMPA, OUTPUT); Serial.begin(9600); pinMode(thermo_vcc_pin, INPUT); pinMode(RELAY_01, OUTPUT); Zaslonka.attach(5); } void loop() { BUTTON_MENU.read(); BUTTON_SELECT.read(); BUTTON_AUTO.read(); BUTTON_LEFT.read(); BUTTON_RIGHT.read(); BUTTON_ONOFF.read(); if (BUTTON_MENU.click_down ) { menu++; if(menu > 1) { menu = 0; } if(menu == 0) { fonstol = xfonstol; } if(menu == 1) { fonmenu = xfonmenu; } nasosregim = 0; titulmenu = 0; menuregimvn = 0; oboiregim = 0; securregim = 0; gsmselekt = 0; balansregim = 0; } if (BUTTON_RIGHT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0) { titulmenu++; if(titulmenu > 5) { titulmenu = 0; } fonmenu = xfonmenu; } if (BUTTON_LEFT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0) { titulmenu = titulmenu -1; if(titulmenu < 0) { titulmenu = 5; } fonmenu = xfonmenu; } if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 0 ) { menuregimvn++; if(menuregimvn > 4) { menuregimvn = 0; } } if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 1 ) { nasosregim++; if(nasosregim > 3) { nasosregim = 0; } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 1) { nasosavto++; if(nasosavto > 1) { nasosavto = 0; } } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 1) { nasosavto = nasosavto -1; if(nasosavto < 0) { nasosavto = 1; } } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 2) { tempnasosastart++; if(tempnasosastart > 85) { tempnasosastart = 85; } } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 2) { tempnasosastart = tempnasosastart -1; if(tempnasosastart < 50) { tempnasosastart = 50; } } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 3) { tempnasosastop++; if(tempnasosastop > 90) { tempnasosastop = 70; } } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 3) { tempnasosastop = tempnasosastop -1; if(tempnasosastop < 60) { tempnasosastop = 60; } } if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 2 ) { securregim++; if(securregim > 5) { securregim = 0; } } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 ) { signsostpodduv++; if(signsostpodduv > 1) { signsostpodduv = 0; } } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 ) { signsostpodduv = signsostpodduv -1; if(signsostpodduv < 0) { signsostpodduv = 1; } } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 4 ) { signnetelekt++; if(signnetelekt > 1) { signnetelekt = 0; } } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 2 && securregim == 4 ) { signnetelekt = signnetelekt -1; if(signnetelekt < 0) { signnetelekt = 1; } } if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 3 ) { gsmselekt++; if(gsmselekt > 5) { gsmselekt = 0; } } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 3 && gsmselekt == 5 ) { telefonvkl++; if(telefonvkl > 1) { telefonvkl = 0; } } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 3 && gsmselekt == 5 ) { telefonvkl = telefonvkl -1; if(telefonvkl < 0) { telefonvkl = 1; } } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 1) { xfonmenu = xfonmenu -1; if(xfonmenu < 0) { xfonmenu = 16; } fonmenu = xfonmenu; } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 1) { xfonmenu++; if(xfonmenu > 16) { xfonmenu = 0; } fonmenu = xfonmenu; } if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 2) { xfonstol = xfonstol -1; if(xfonstol < 0) { xfonstol = 16; } fonstol = xfonstol; } if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 2) { xfonstol++; if(xfonstol > 16) { xfonstol = 0; } fonstol = xfonstol; } if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 4 ) { oboiregim++; if(oboiregim > 2) { oboiregim = 0; } } if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 5 ) { balansregim++; if(balansregim > 1) { balansregim = 0; } } if(menu == 0) { if (BUTTON_SELECT.click_down && menu == 0) { menuselect++; if(menuselect > 4) { menuselect = 0; } } switch(fonstol){ case 0: myFiles.load(0, 0, 480, 320, "pi.raw"); xfonstol = 0; break; case 1: myFiles.load(0, 0, 480, 320, "a4.raw"); xfonstol = 1; break; case 2: myFiles.load(0, 0, 480, 320, "22.raw"); xfonstol = 2; break; case 3: myFiles.load(0, 0, 480, 320, "ma.raw"); xfonstol = 3; break; case 4: myFiles.load(0, 0, 480, 320, "a2.raw"); xfonstol = 4; break; case 5: myFiles.load(0, 0, 480, 320, "a3.raw"); xfonstol = 5; break; case 6: myFiles.load(0, 0, 480, 320, "a4.raw"); xfonstol = 6; break; case 7: myFiles.load(0, 0, 480, 320, "a5.raw"); xfonstol = 7; break; case 8: myFiles.load(0, 0, 480, 320, "ot.raw"); xfonstol = 8; break; case 9: myFiles.load(0, 0, 480, 320, "t3.raw"); xfonstol = 9; break; case 10: myFiles.load(0, 0, 480, 320, "a11.raw"); xfonstol = 10; break; case 11: myFiles.load(0, 0, 480, 320, "a2.raw"); xfonstol = 11; break; case 12: myFiles.load(0, 0, 480, 320, "a3.raw"); xfonstol = 12; break; case 13: myFiles.load(0, 0, 480, 320, "a4.raw"); xfonstol = 13; break; case 14: myFiles.load(0, 0, 480, 320, "a5.raw"); xfonstol = 14; break; case 15: myFiles.load(0, 0, 480, 320, "a6.raw"); xfonstol = 15; break; case 16: myFiles.load(0, 0, 480, 320, "a7.raw"); xfonstol = 16; break; } fonstol = 30; myFiles.load(5, 70, 55, 55, "reg.raw"); myFiles.load(5, 130, 55, 55, "top.raw"); myFiles.load(5, 190, 57, 52, "dom.raw"); myFiles.load(5, 250, 55, 55, "ul.raw"); switch(menuselect){ case 0: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("1",65, 78); break; case 1: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_GREEN); myGLCD.textRus("2",65, 78); myGLCD.setFont(SevenSegNumFont); break; case 2: myGLCD.setFont(BigFontRus); myGLCD.setColor(255,165,0); myGLCD.textRus("3",65, 78); myGLCD.setFont(SevenSegNumFont); break; case 3: myGLCD.setFont(BigFontRus); myGLCD.setColor(240,128,128); myGLCD.textRus("4",65, 78); myGLCD.setFont(SevenSegNumFont); break; case 4: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("5",65, 78); myGLCD.setFont(SevenSegNumFont); break; } myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("Темп",65, 150); myGLCD.setColor(VGA_LIME); myGLCD.textRus("Темп",65, 210); myGLCD.setColor(VGA_LIME); myGLCD.textRus("Темп",65, 270); myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(VGA_LIME); myGLCD.print("92",150,130); myGLCD.setColor(VGA_LIME); myGLCD.print("25",150,190); myGLCD.setColor(VGA_LIME); myGLCD.print("35",150,250); if(gsmsignal == 0) { myFiles.load(435, 0, 45, 33, "minigreen0.raw"); } if(gsmsignal > 0 && gsmsignal < 20) { myFiles.load(435, 0, 45, 33, "minigreen20.raw"); } if(gsmsignal > 20 && gsmsignal < 40) { myFiles.load(435, 0, 45, 33, "minigreen40.raw"); } if(gsmsignal > 40 && gsmsignal < 60) { myFiles.load(435, 0, 45, 33, "minigreen60.raw"); } if(gsmsignal > 60 && gsmsignal < 80) { myFiles.load(435, 0, 45, 33, "minigreen80.raw"); } if(gsmsignal > 80 && gsmsignal < 100) { myFiles.load(435, 0, 45, 33, "minigreen100.raw"); } if(gsmsignal == 100) { myFiles.load(435, 0, 45, 33, "minigreen100.raw"); } } if(menu == 1) { switch(fonmenu){ case 0: myFiles.load(0, 0, 480, 320, "22b.raw"); xfonmenu = 0; break; case 1: myFiles.load(0, 0, 480, 320, "4b.raw"); xfonmenu = 1; break; case 2: myFiles.load(0, 0, 480, 320, "22b.raw"); xfonmenu = 2; break; case 3: myFiles.load(0, 0, 480, 320, "ab.raw"); xfonmenu = 3; break; case 4: myFiles.load(0, 0, 480, 320, "3b.raw"); xfonmenu = 4; break; case 5: myFiles.load(0, 0, 480, 320, "ab.raw"); xfonmenu = 5; break; case 6: myFiles.load(0, 0, 480, 320, "3b.raw"); xfonmenu = 6; break; case 7: myFiles.load(0, 0, 480, 320, "5b.raw"); xfonmenu = 7; break; case 8: myFiles.load(0, 0, 480, 320, "tb.raw"); xfonmenu = 8; break; case 9: myFiles.load(0, 0, 480, 320, "3b.raw"); xfonmenu = 9; break; case 10: myFiles.load(0, 0, 480, 320, "11b.raw"); xfonmenu = 10; break; case 11: myFiles.load(0, 0, 480, 320, "2b.raw"); xfonmenu = 11; break; case 12: myFiles.load(0, 0, 480, 320, "3b.raw"); xfonmenu = 12; break; case 13: myFiles.load(0, 0, 480, 320, "4b.raw"); xfonmenu = 13; break; case 14: myFiles.load(0, 0, 480, 320, "5b.raw"); xfonmenu = 14; break; case 15: myFiles.load(0, 0, 480, 320, "6b.raw"); xfonmenu = 15; break; case 16: myFiles.load(0, 0, 480, 320, "7b.raw"); xfonmenu = 16; break; } fonmenu = 30; myFiles.load(10, 255, 55, 55, "regim.raw"); myFiles.load(75, 255, 55, 55, "nasos.raw"); myFiles.load(140, 255, 55, 55, "secur.raw"); myFiles.load(205, 255, 55, 55, "gpsst.raw"); myFiles.load(270, 255, 55, 55, "ob.raw"); myFiles.load(335, 255, 55, 55, "bal.raw"); switch(titulmenu){ case 0: myFiles.load(315, 5, 160, 51, "menu.raw"); break; case 1: myFiles.load(315, 5, 160, 51, "menu1.raw"); break; case 2: myFiles.load(315, 5, 160, 51, "menu2.raw"); break; case 3: myFiles.load(315, 5, 160, 51, "menu3.raw"); break; case 4: myFiles.load(315, 5, 160, 51, "menu4.raw"); break; case 5: myFiles.load(315, 5, 160, 51, "menu5.raw"); break; } myFiles.load(5, 60, 30, 30, "tochka1.raw"); myFiles.load(5, 95, 30, 30, "tochka2.raw"); myFiles.load(5, 130, 30, 30, "tochka3.raw"); myFiles.load(5, 165, 30, 30, "tochka4.raw"); myFiles.load(5, 200, 30, 30, "tochka5.raw"); if(titulmenu == 0) { switch(menuregimvn){ case 0: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("РЕЖИМ 1",40, 65); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 2",40, 100); myGLCD.textRus("РЕЖИМ 3",40, 135); myGLCD.textRus("РЕЖИМ 4",40, 170); myGLCD.textRus("РЕЖИМ 5",40, 205); break; case 1: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 1",40, 65); myGLCD.setColor(VGA_RED); myGLCD.textRus("РЕЖИМ 2",40, 100); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 3",40, 135); myGLCD.textRus("РЕЖИМ 4",40, 170); myGLCD.textRus("РЕЖИМ 5",40, 205); break; case 2: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 1",40, 65); myGLCD.textRus("РЕЖИМ 2",40, 100); myGLCD.setColor(VGA_RED); myGLCD.textRus("РЕЖИМ 3",40, 135); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 4",40, 170); myGLCD.textRus("РЕЖИМ 5",40, 205); break; case 3: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 1",40, 65); myGLCD.textRus("РЕЖИМ 2",40, 100); myGLCD.textRus("РЕЖИМ 3",40, 135); myGLCD.setColor(VGA_RED); myGLCD.textRus("РЕЖИМ 4",40, 170); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 5",40, 205); break; case 4: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ 1",40, 65); myGLCD.textRus("РЕЖИМ 2",40, 100); myGLCD.textRus("РЕЖИМ 3",40, 135); myGLCD.textRus("РЕЖИМ 4",40, 170); myGLCD.setColor(VGA_RED); myGLCD.textRus("РЕЖИМ 5",40, 205); break; } } ///--------------------------------------------------------------------------------------------------------------- if(titulmenu == 1) { switch(nasosregim){ case 0: if(nasosavto == 0) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65); } if(nasosavto == 1) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РУЧНОЙ РЕЖИМ ",40, 65); } myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135); myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205); break; case 1: if(nasosavto == 0) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65); } if(nasosavto == 1) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("РУЧНОЙ РЕЖИМ ",40, 65); } myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135); myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205); break; case 2: if(nasosavto == 0) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65); } if(nasosavto == 1) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РУЧНОЙ РЕЖИМ ",40, 65); } myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135); myGLCD.setColor(VGA_LIME); myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205); break; case 3: if(nasosavto == 0) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65); } if(nasosavto == 1) { myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("РУЧНОЙ РЕЖИМ ",40, 65); } myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135); myGLCD.setColor(VGA_RED); myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205); break; } myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(VGA_LIME); myGLCD.printNumI(tempnasosastart,325,115); myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(VGA_LIME); myGLCD.printNumI(tempnasosastop,325,190); } ///---------------------------------------------------------------------------------------------------- if(titulmenu == 2) { switch(securregim) { case 0: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 65); myGLCD.textRus("СИГНАЛ ",40, 100); if(signsostpodduv == 0) { myGLCD.textRus("СИГНАЛ ",40, 135); } if(signsostpodduv == 1) { myGLCD.textRus("СИГНАЛ ",40, 135); } if(signnetelekt == 0) { myGLCD.textRus("СИГНАЛ ",40, 170); } if(signnetelekt == 1) { myGLCD.textRus("СИГНАЛ ",40, 170); } myGLCD.textRus("ЗАЩИТА ",40, 205); break; case 1: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("СИГНАЛ ",40, 65); myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 100); if(signsostpodduv == 0) { myGLCD.textRus("СИГНАЛ ",40, 135); } if(signsostpodduv == 1) { myGLCD.textRus("СИГНАЛ ",40, 135); } if(signnetelekt == 0) { myGLCD.textRus("СИГНАЛ ",40, 170); } if(signnetelekt == 1) { myGLCD.textRus("СИГНАЛ",40, 170); } myGLCD.textRus("ЗАЩИТА ",40, 205); break; case 2: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 65); myGLCD.setColor(VGA_RED); myGLCD.textRus("СИГНАЛ ",40, 100); myGLCD.setColor(VGA_LIME); if(signsostpodduv == 0) { myGLCD.textRus("СИГНАЛ ",40, 135); } if(signsostpodduv == 1) { myGLCD.textRus("СИГНАЛ ",40, 135); } if(signnetelekt == 0) { myGLCD.textRus("СИГНАЛ ",40, 170); } if(signnetelekt == 1) { myGLCD.textRus("СИГНАЛ ",40, 170); } myGLCD.textRus("ЗАЩИТА ",40, 205); break; case 3: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 65); myGLCD.textRus("СИГНАЛ ",40, 100); if(signsostpodduv == 0) { myGLCD.setColor(VGA_RED); myGLCD.textRus("СИГНАЛ ",40, 135); } if(signsostpodduv == 1) { myGLCD.setColor(VGA_RED); myGLCD.textRus("СИГНАЛ ",40, 135); } if(signnetelekt == 0) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 170); } if(signnetelekt == 1) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 170); } myGLCD.textRus("ЗАЩИТА ",40, 205); break; case 4: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 65); myGLCD.textRus("СИГНАЛ ",40, 100); if(signsostpodduv == 0) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 135); } if(signsostpodduv == 1) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 135); } if(signnetelekt == 0) { myGLCD.setColor(VGA_RED); myGLCD.textRus("СИГНАЛ ",40, 170); } if(signnetelekt == 1) { myGLCD.setColor(VGA_RED); myGLCD.textRus("СИГНАЛ ",40, 170); } myGLCD.setColor(VGA_LIME); myGLCD.textRus("ЗАЩИТА ",40, 205); break; case 5: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 65); myGLCD.textRus("СИГНАЛ ",40, 100); if(signsostpodduv == 0) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 135); } if(signsostpodduv == 1) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 135); } if(signnetelekt == 0) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 170); } if(signnetelekt == 1) { myGLCD.setColor(VGA_LIME); myGLCD.textRus("СИГНАЛ ",40, 170); } myGLCD.setColor(VGA_RED); myGLCD.textRus("ЗАЩИТА ",40, 205); break; } } } if(titulmenu == 4) { switch(oboiregim){ case 0: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("МЕНЮ=",40, 65); myGLCD.textRus("СТОЛ=",40, 100); myGLCD.setFont(BigFont); myGLCD.setColor(VGA_LIME); myGLCD.printNumI(xfonmenu,202, 65); myGLCD.printNumI(xfonstol,330, 100); break; case 1: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("МЕНЮ=",40, 65); myGLCD.setFont(BigFont); myGLCD.setColor(VGA_RED); myGLCD.printNumI(xfonmenu,202, 65); myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("СТОЛ=",40, 100); myGLCD.setFont(BigFont); myGLCD.setColor(VGA_LIME); myGLCD.printNumI(xfonstol,330, 100); break; case 2: myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_LIME); myGLCD.textRus("МЕНЮ=",40, 65); myGLCD.setColor(VGA_LIME); myGLCD.printNumI(xfonmenu,202, 65); myGLCD.setFont(BigFontRus); myGLCD.setColor(VGA_RED); myGLCD.textRus("СТОЛ=",40, 100); myGLCD.setColor(VGA_RED); myGLCD.printNumI(xfonstol,330, 100); break; } } } }
От всех кнопок сделайте диоды в D2 или D3, и читайте кнопки в отдельной функции. Потом attachInerrupt() эту функцию.
Короче чтобы в момент нажатия кнопки возникало прерывание и читать внутри прерывания.
Спасибо...
Если можно коротенький пример для мега2560.
Ато я со внешнеми прерываниями ещё не сталкивался.
Чтото у меня невыходит...
Вроде всё правильно или я забыл чего?
Lexan, я не знаю алгоритма "Титанового велосипеда кнопок", обращайтесь к клапауцию. btw он вроде как из коробки поддерживает прерывания.
Без него - ловите прерывание, в нём пишете состояние вообще всех кнопок. Выходите из прерывания, работаете дальше, имея ввиду состояние(я) кнопок, из оперативной памяти. Если кнопки на сдвиговых регистрах - читаете из регистра. Если кнопки keypad - выполняете скан keypad.
То есть: получаем прерывание, копируем состояние кнопок в память, освобождаем прерывание. Чем быстрее тем лучше. Работаем дальше.
Так всегда работают с прерываниями. Прерывание - это срочное событие, приостанавливающее основной процесс.
В смысле "освобождаем прерывание" ' так из него потом ещё и выйти нужно? по какойто команде, я правельно понимаю?
Тоесть войдя в прерывание и сделав там свои дела с кнопками. Потом нужно чтото типо опустить флаг состояния прерывания для выхода из него. Так?
Блин мне бы хоть простенький пример...
Наткнулся на одну схемку в сети. Правда на базе какогото МК аттини, но это не суть. Принцип то тотже.
Так значит подключать кнопки по этой схеме? Но здесь нет наминалов... :/
А здесь похоже фото этой конструкции...
обращайтесь к клапауцию.
ТС обращался и был вежливо послан сюда.
Вечер добрый! А я тут все с прерыванием воюю...
Уж больно оно вредное ... ))
Скажите я ведь могу использовать такие кнопки в прерывании. Никаких конфликтов же небудет??
Скажите я ведь могу использовать такие кнопки в прерывании.
зачем?
Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.
Скажите я ведь могу использовать такие кнопки в прерывании.
зачем?
Нууу чтобы они быстрее реагировали в любой мамент времени...
Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.
предложи ему свои кнопки - пусть он твой мосг трахает
Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.
предложи ему свои кнопки - пусть он твой мосг трахает
да блиин.. я же не со зла )))
Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.
Что у вас за кнопки??? А скеч я перепишу если будет острая необходимасть..
да блиин.. я же не со зла )))
ну, ты нормальный человек? - никто не будет вычитывать твою простыню на 1200 строк вычитывать на предмет логических ошибок.
*ещё раз - у тебя логические ошибки, код являются блокирующим главный цикл (loop), отсюда и все тормоза.
никакие прерывания тебя не спасут, как здесь советуют умники в стрингах.
да блиин.. я же не со зла )))
ну, ты нормальный человек? - никто не будет вычитывать твою простыню на 1200 строк вычитывать на предмет логических ошибок.
*ещё раз - у тебя логические ошибки, код являются блокирующим главный цикл (loop), отсюда и все тормоза.
никакие прерывания тебя не спасут, как здесь советуют умники в стрингах.
Извиняюсь.. А логические ошибки это чтото типа неправельного построение ифов и свичей внутри друг друга или чтото ещё???
А логические ошибки это чтото типа неправельного построение ифов и свичей внутри друг друга или чтото ещё???
да, я ебу, что ты там себе накуролесил?
А логические ошибки это чтото типа неправельного построение ифов и свичей внутри друг друга или чтото ещё???
да, я ебу, что ты там себе накуролесил?
Понятно.. Спасение утопающего, дела рук самого утопающего ))
Понятно.. Спасение утопающего, дела рук самого утопающего ))
так, а, кто кроме тебя будет разбираться в твоём коде?
ошибки, что я вижу:
1. ты юзаешь, какую-то древнюю версию велосипеда, о которой я давно и забыл, но не суть - оно должно работать, если ты в коде веловсипеда не накрутил мозгов.
2. у тебя две кнопки просто не заюзаны, а остальные, кроме BUTTON_MENU, работают с блокирующими флагами
с чего ты решил, что у тебя кнопки не работают? - они работают, но тебе нужно кроме работы кнопок, что бы ещё и значения флагов совпадали?
я не знаю, чем тебе помочь - ты сам запрещаешь работу кнопок и желаешь волшебным прерыванием прекратить эти запреты.
у тебя ничего не выйдет, хоть обпрерывайся своим прерываниями.
*ещё раз - у тебя логические ошибки, код являются блокирующим главный цикл (loop), отсюда и все тормоза.
поправка: ты поступаешь ещё тупее - ты блокируешь кнопки.
Да пару кнопкам я ещё не превязал никаких функций. А блокирующие флаги делал чтобы можно было так сказать переназначить кнопки в определённый мамент. Тоесть в одном меню одна функция у кнопки, перешли во второе меню другая. Тут что самое интересное все кнопки сробатывают во всех меню и подменю. Но беда в том что через раз или слишком медленно. Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://
Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://
код велосипеда сюда опубликуй - ты говорил, что что-то там пропорционально настраивал.
Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://
код велосипеда сюда опубликуй - ты говорил, что что-то там пропорционально настраивал.
Нет нет я все вернул на место. Это я просто по незнанию эксперементировал так сказать ))
Но беда в том что через раз или слишком медленно. Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://
и, чем оно у тебя секунду занято?
я это должен выяснять или ты?
Но беда в том что через раз или слишком медленно. Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://
и, чем оно у тебя секунду занято?
я это должен выяснять или ты?
Думаю медленным кодом в loop :/
Думаю медленным кодом в loop :/
ты не думай, а проверяй - ставь все подозреваемые блоки кода во временные рамки и мониторь в сериал или как я - в LCD.
заодно и значения всех флагов втуда же выводи - подозреваю, что и там у тебя логические блоки
Просмотрев по диагонали, мне кажется, что у вас в каждом цикле загружется несколько файлов с картички и отрисовывается, что требует определенного (и значительного) времени. Из за этого основной цикл становится длинным а обработка кнопок рассчитана на определенную периодичность вызова, из за чего и происходят ошибки обрабоки.
Вам следует сделать перерисовку экрана только после изменения его содержания.
Просмотрев по диагонали, мне кажется, что у вас в каждом цикле загружется несколько файлов с картички и отрисовывается, что требует определенного (и значительного) времени. Из за этого основной цикл становится длинным а обработка кнопок рассчитана на определенную периодичность вызова, из за чего и происходят ошибки обрабоки.
Вам следует сделать перерисовку экрана только после изменения его содержания.
Спасибо.Действительно, все надписи и ярлыки кроме фона постоянно обновляются. Я какраз над этим работаю. Хоть я уже вынес кнопки в прерывание, но это всеголишь улучшело картину працентов на 50%. Тоесть если раньше кнопки срабатывали через раз через два, то теперь каждый раз и через раз :))
Хоть я уже вынес кнопки в прерывание, но это всеголишь улучшело картину працентов на 50%. Тоесть если раньше кнопки срабатывали через раз через два, то теперь каждый раз и через раз :))
нда. проще пристрелить, чем научить.
Ну почему же сразу пристреливать - если человек мертв, он уже точно не изменится, а пока он жив, то вполне может научиться и, по крайней мере, желание сделать это я вижу у автора оригинального поста.
Да, программистская культура невысока (хотя для третьего проекта ... хз, короче), но откуда ему взять примеры хорошего нетривиального кода - может сделать пост, где взять его пример и методом последовательных трансформаций превратить в приемлемый - это, конечно, если человек хочет понять, а не просто чтобы меню заработало, а там хоть трава не расти - не знаю, не знаю ...
Да, программистская культура невысока (хотя для третьего проекта ... хз, короче), но откуда ему взять примеры хорошего нетривиального кода - может сделать пост, где взять его пример и методом последовательных трансформаций превратить в приемлемый - это, конечно, если человек хочет понять, а не просто чтобы меню заработало, а там хоть трава не расти - не знаю, не знаю ...
не хочет он ничего понять - ему в уши нассали о волщебных прерываниях и он теперь все свои косяки будет лечить прерываниями.
А давайте спросим автора - хочет ли он (под мудрым руководством) переписать свой скетч (сам переписать, не увидеть результат, который можно вставить в экран и все получится) так, чтобы он стал понятнее, быстрее и работал правильно? И по дороге приобрести определенные знания относительно программирования вообще, встроенного программирования конкретно, и программирования Ардуино в частности.
А давайте спросим автора - хочет ли он (под мудрым руководством) переписать свой скетч (сам переписать, не увидеть результат, который можно вставить в экран и все получится) так, чтобы он стал понятнее, быстрее и работал правильно? И по дороге приобрести определенные знания относительно программирования вообще, встроенного программирования конкретно, и программирования Ардуино в частности.
Ребята я оочень хочу! Только у меня учителя нету )).
Поэтому и пешу сам чё в голову взбредёт...
И кстати я кажется придумал. Прерывание конечно не панацея. Но думаю флаги boolean должны оживить код )
Попробую обяснить ардуине когда начать рисовать а когда закончить..
А давайте спросим автора
давай спросим тебя - ты читал всю тему?
Ну, если действительно хотите, то он у Вас есть - надеюсь не посрамить Ваших ожиданий.
Начнем в простого - программа не должна быть избыточно длинной, у Вас имеются пустые строки, которые не несут смысловой нагрузки. Обычно пустые строки применяют для отделения функциональных блоков, а в строках 450,455 и так далее такого отделения нет. Очередная ветвь оператора case сама по себе является отличным разделителем, поэтому пустые строки в таких ситуациях не следует использовать.
Далее, пустые строки с 48 по 51 вполне оправданны, но их действительно должно быть 4, а не одна?
Поэтому задание номер 1)
- удалить пустые строки, не являющиеся оправданными разделителями, по всему тексту и посмотреть, насколько уменьшился размер программы в строках - это не принесет никакого результат в плане правильности, но текст программы станет короче и его будет легче просматривать.
Следующее правило, которое Вы неоднократно нарушаете - DRY (не повторяй себя), например, в строках 441-518 Вы совершаете однотипные действия во всех ветвях выбора, изменяя только название файла. Поэтому будет вполне логично в операторе выбора менять только имя файла, а затем производить однотипные операции, используя это имя, что то вроде
char fn[10];
switch(fonstol) {
case 0: strcpy(fn,"pi.raw"); break;
...
default: strcpy(fn,"err.raw");
};
myFiles.load(0,0,480,320,fn);
xfonstol=fonstol;
* Вам придется включить модуль работы со строками в начале файла директивой #include <string.h>
При этом программа становится короче и, что немаловажно, мы гарантируем, что во всех случаях будут исполняться одинаковые действия, иначе нам требовалось проверять каждую ветку.
Поэтому задание номер 2)
провести подобную работу по всему тексту программы и посмотреть, насколько уменьшился размер программы в строках - это не принесет никаких результатов в плане правильности, но программа станет компактнее и понятнее.
Продолжение следует.
* Вам придется включить модуль работы со строками в начале файла директивой #include <string.h>
Функции strcpy strcat и тд в ардуино 1.8 не требуют дополнительных хидеров - вероятно уже включены в какую-то стандартную библиотеку.
ЗЫ - убирать пустые строки - такая же вкусовщина, как нелюбовь к оператору %. Не забивайте своему ученику голову ненужныит вещами, ему пока необходимое запомнить бы.
Конечно же, вкусовщина, но короткий текст проще смотреть.
Я начинал на перфокартах и анализировал распечатки поэтому на всю жизнь сохраню нелюбовь к лишним строчкам.
Я начинал на перфокартах и анализировал распечатки поэтому на всю жизнь сохраню нелюбовь к лишним строчкам.
так? #499 О_О
Конечно же, вкусовщина, но короткий текст проще смотреть.
Я начинал на перфокартах и анализировал распечатки поэтому на всю жизнь сохраню нелюбовь к лишним строчкам.
Да всё нормально. Лишние строчки я убрал. Штук 100 наверно точно получилось ))
В принципе меня это тоже устраивает. Действительно код стал более компактным и читабельным а много воды тока мешает.
Сейчас пытаюсь с массивом разобратся. Просто раньше с массивами еще неработал ))
Массивы - это была тема следующего урока, не забегайте вперед ).
Ну чего Вы за массивы и пустые строки цепляетесь. Причина тормозни здесь явно ж не в этом, а в длинном лопе. Време прокрутки цикла слишком большое. Смотрим причины:
1. Выполнение не нужных действий на каждом проходе лопа - легко лечится алгоритмически. Состояние меню изменяется по событию кнопки, и если его небыло - завершаем лоп (ну или проверкой обходим все это трахомудие с экраном, если в лопе еще что нужно делать). Это на пару минут правки кода, а поможет дофига. Просто проверить состояние кнопок всех и если оно не менялось с прошлого лупа - нет событий, гуляем, экран не трогаем. Но останется проблема при нескольких достаточно частых нажатиях - продолжаем борьбу, разбиваем перерисовку на этапы.
2. Медленная работа библиотеки с экраном. Это качество либки, с ним все плохо + медленый интерфейс SPI. Перепахав либу можна повысит скорость. Но сложно, из доступного - попробовать поднять частоту SPI.
3. Безобразная работа с файлами. Поправимо частично. Посчитать, может чего в PROGMEM перекинуть или исхитрится с буферизацией. Цель - как можна реже обращатся к карте.
4. Тормознутость либы работы с SD. 320х240 16бит загружает (по памяти пишу) за 0,8сек. Как её ускорить я не представляю. Возможно более быстрая карточка поможет.
5. Неудачный выбор экрана. Тяжко поддержать большой экран. Да еще и по SPI.
ПС. Про прерывания, флажки и их обработку их в лопе - я уже задолбался расписывать почему это фигня. Может хоть на вашем примере народ чего уразумеет.
Про прерывания, флажки и их обработку их в лопе - я уже задолбался расписывать почему это фигня.
где можно почитать? О_О
Шуруй в поиск, там подают ;)
Шуруй в поиск, там подают ;)
в поиске только твои тупорылые вопли, как все всё делают неправильно - больше десяти кнопок одновременно не нажимать
Отвечаю. Мне впадлу. Вот просто, верите не? В рот оно ебись. Не, конечно я могу, могу даже всерьёз захотеть разобраться, отполировать там все глюки от и до. Однако, скорее всего потребуется перепотрошить программу полностью, то есть связываться с вашим алгоритмом, с вашими железками, понимать как оно работает. Это при том что я опыта с GLCD/UTFT не имею, и изучать не желаю - ибо считаю эти экраны наиуёбищным способом расточения и без того малых ресурсов МК впустую. Предпочитаю 1602, на худой конец (если ну прям пииииииииздецки как графики хочется) - 5110. Ничего личного, с уважением и всё такое. Извините, пожалуйста.
Вам Клапауций уже хрен знает сколько раз указал на проблемы чисто процедурного характера, умей вы мыслить в четырёх измерениях пространственно-временного континуума, как выражался доктор Эммет Браун, то есть будь у вас понимание - в какой момент времени, как и чем МК занят, какие процессы в нём происходят - вы бы и сами эти проблемы легко заметили. Logik даже чётко и по пунктам объяснил - где, по каким моментам копать. Клапауций способ отладки предложил. С экраном. С сериалом. С временем. Конечно Клапауцию не занимать резкости (или борзости? ладно плевать), но вы отнеситесь с пониманием, ему мозг сверлили школьники, у него душевная травма от них. А я - просто ленивая сволочь, которая предложила костыль.
Хотите ещё один? берёте второй МК, соединяете по EasyTransfer той же, опрашиваете с ней кнопки. Ура, core2duo Arduino. Только пресловутое reliability останется на точно таком же говённом уровне, ибо корень зла - не кнопки, а сам алгоритм. Он тупо не опрашивает кнопки, когда они бы хотели быть опрошенными. Он слишком долго копается - с файлами, или с чем там - мне правда скетч полностью читать было лень.
All, искренне сожалею что продолжаю срач. Но я стараюсь внятным языком объяснить автору ту степень неправоты, которую тут доводят до его сведения. А не с ходу хуесосить как Клапауций. Я хз, чего он так людей не любит - ему на порог срут или ещё что такое, но такими словами обращаться к человеку прямо - ненормально. IMHO, разумеется.
такими словами обращаться к человеку прямо - ненормально.
Voodoo Doll, так к человеку же... часто объект проваливает тест на принадлежность к хомо сапиенс, поэтому приходится пинками загонять его в разумное состояние.
Эк тебя путиным-то кантузило...