Arduino Mega2560 + LCD TFT TOUCH (ITDB32WS) - Многостраничное меню.
- Войдите на сайт для отправки комментариев
Вс, 22/02/2015 - 15:53
Уважаемые форумчане. В програмировании я новичек. Вот прикупил Arduino Mega2560 + LCD TFT TOUCH. Все работает нормально. Теперь столкнулся с проблемой построения многостраничного меню. Есть главный экран с 8 кнопками. При нажатии должен происходить переход на следующее меню. Это все работает (запрограммирована только одна кнопка). Проблема в том, что при включении следующего меню не отключаються работающие координаты Touch предыдущего (главного) экрана. По примерам используються т.н. ID экранов. Но они почемуто не работают.
Может кто-то подскажет, в чем моя ошибка. Еще раз повторяю - я новичек.
#include <UTFT.h> #include <UTouch.h> UTFT myGLCD(NIC35WS,38,39,40,41); UTouch myTouch( 6, 5, 4, 3, 2); extern uint8_t BigFont[]; extern uint8_t SmallFont[]; int x, y; byte menuID; void clearScreen(){ / myGLCD.setColor(0, 0, 0); myGLCD.fillRect(0, 12, 399, 239); myGLCD.setColor(0, 0, 0); } void dispScreen0(){ myGLCD.setFont(BigFont); // кнопка GRUPA 1 myGLCD.setColor(58, 95, 205); myGLCD.fillRoundRect(10, 35, 195, 70); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(58, 95, 205); myGLCD.print("GRUPA 1", 52, 45); // кнопка GRUPA 2 myGLCD.setColor(240, 0, 108); myGLCD.fillRoundRect(10, 80, 195, 115); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(240, 0, 108); myGLCD.print("GRUPA 2", 52, 90); // кнопка GRUPA 3 myGLCD.setColor(90, 200, 0); myGLCD.fillRoundRect(10, 125, 195, 160); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(90, 200, 0); myGLCD.print("GRUPA 3", 52, 135); // кнопка GRUPA 4 myGLCD.setColor(0, 0, 255); myGLCD.fillRoundRect(10, 170, 195, 205); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 255); myGLCD.print("GRUPA 4", 52, 180); // кнопка TIMER myGLCD.setColor(48, 89, 255); myGLCD.fillRoundRect(205, 35, 390, 70); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(48, 89, 255); myGLCD.print("TIMER", 230, 45); // кнопка XXXXXXXXXX myGLCD.setColor(248, 0, 37); myGLCD.fillRoundRect(205, 80, 390, 115); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(248, 0, 37); myGLCD.print("XXXXX", 230, 90); // кнопка XXXXXXXXX myGLCD.setColor(0, 224, 11); myGLCD.fillRoundRect(205, 125, 390, 160); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 224, 11); myGLCD.print("XXXXX", 230, 135); // кнопка XXXXXXX myGLCD.setColor(0, 0, 255); myGLCD.fillRoundRect(205, 170, 390, 205); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 255); myGLCD.print("XXXXX", 230, 180); delay(100); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect(10, 35, 195, 70); myGLCD.drawRoundRect(12, 37, 193, 68); myGLCD.drawRoundRect(10, 80, 195, 115); myGLCD.drawRoundRect(12, 82, 193, 113); myGLCD.drawRoundRect(10, 125, 195, 160); myGLCD.drawRoundRect(12, 127, 193, 158); myGLCD.drawRoundRect(10, 170, 195, 205); myGLCD.drawRoundRect(12, 172, 193, 203); myGLCD.drawRoundRect(205, 35, 390, 70); myGLCD.drawRoundRect(207, 37, 388, 68); myGLCD.drawRoundRect(205, 80, 390, 115); myGLCD.drawRoundRect(207, 82, 388, 113); myGLCD.drawRoundRect(205, 125, 390, 160); myGLCD.drawRoundRect(207, 127, 388, 158); myGLCD.drawRoundRect(205, 170, 390, 205); myGLCD.drawRoundRect(207, 172, 388, 203); } void dispScreen1(){ clearScreen(); myGLCD.setColor(0, 0, 255); myGLCD.fillRoundRect(15, 37, 65, 60); myGLCD.fillRoundRect(79, 37, 129, 60); myGLCD.fillRoundRect(143, 37, 193, 60); myGLCD.fillRoundRect(207, 37, 257, 60); myGLCD.fillRoundRect(271, 37, 321, 60); myGLCD.fillRoundRect(335, 37, 385, 60); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect(15, 37, 65, 60); myGLCD.drawRoundRect(79, 37, 129, 60); myGLCD.drawRoundRect(143, 37, 193, 60); myGLCD.drawRoundRect(207, 37, 257, 60); myGLCD.drawRoundRect(271, 37, 321, 60); myGLCD.drawRoundRect(335, 37, 385, 60); // кнопки ON myGLCD.setColor(70, 200, 0); myGLCD.fillRoundRect(15, 66, 65, 94); myGLCD.fillRoundRect(79, 66, 129, 94); myGLCD.fillRoundRect(143, 66, 193, 94); myGLCD.fillRoundRect(207, 66, 257, 94); myGLCD.fillRoundRect(271, 66, 321, 94); myGLCD.fillRoundRect(335, 66, 385, 94); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect(15, 66, 65, 94); myGLCD.drawRoundRect(79, 66, 129, 94); myGLCD.drawRoundRect(143, 66, 193, 94); myGLCD.drawRoundRect(207, 66, 257, 94); myGLCD.drawRoundRect(271, 66, 321, 94); myGLCD.drawRoundRect(335, 66, 385, 94); // размер рамки времени on myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect(15, 96, 65, 128); myGLCD.drawRoundRect(79, 96, 129, 128); myGLCD.drawRoundRect(143, 96, 193, 128); myGLCD.drawRoundRect(207, 96, 257, 128); myGLCD.drawRoundRect(271, 96, 321, 128); myGLCD.drawRoundRect(335, 96, 385, 128); // кнопки OFF myGLCD.setColor(255, 255, 255); // myGLCD.setBackColor(255, 0, 0); myGLCD.drawRoundRect(15, 137, 65, 165); myGLCD.drawRoundRect(79, 137, 129, 165); myGLCD.drawRoundRect(143, 137, 193, 165); myGLCD.drawRoundRect(207, 137, 257, 165); myGLCD.drawRoundRect(271, 137, 321, 165); myGLCD.drawRoundRect(335, 137, 385, 165); myGLCD.setColor(255, 0, 0); myGLCD.fillRoundRect(15, 138, 65, 164); myGLCD.fillRoundRect(79, 138, 129, 164); myGLCD.fillRoundRect(143, 138, 193, 164); myGLCD.fillRoundRect(207, 138, 257, 164); myGLCD.fillRoundRect(271, 138, 321, 164); myGLCD.fillRoundRect(335, 138, 385, 164); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect(15, 167, 65, 199); myGLCD.drawRoundRect(79, 167, 129, 199); myGLCD.drawRoundRect(143, 167, 193, 199); myGLCD.drawRoundRect(207, 167, 257, 199); myGLCD.drawRoundRect(271, 167, 321, 199); myGLCD.drawRoundRect(335, 167, 385, 199); // рамка вокруг кнопки таймера myGLCD.setColor(130, 130, 130); myGLCD.drawRoundRect(15, 35, 65, 201); myGLCD.drawRoundRect(79, 35, 129, 201); myGLCD.drawRoundRect(143, 35, 193, 201); myGLCD.drawRoundRect(207, 35, 257, 201); myGLCD.drawRoundRect(271, 35, 321, 201); myGLCD.drawRoundRect(335, 35, 385, 201); myGLCD.setColor(255, 255, 255); // myGLCD.setFont(BigFont); myGLCD.setFont(SmallFont); myGLCD.setColor(255, 255, 255); myGLCD.setBackColor(0, 0, 255); myGLCD.print("Tim.1",20,45); myGLCD.print("Tim.2",84,45); myGLCD.print("Tim.3",148,45); myGLCD.print("Tim.4",212,45); myGLCD.print("Tim.5",276,45); myGLCD.print("Tim.6",340,45); myGLCD.setFont(BigFont); myGLCD.setBackColor(70, 200, 0); myGLCD.print("ON",22,73); myGLCD.print("ON",86,73); myGLCD.print("ON",150,73); myGLCD.print("ON",214,73); myGLCD.print("ON",278,73); myGLCD.print("ON",342,73); myGLCD.setBackColor(255, 0, 0); myGLCD.print("OFF",17,143); myGLCD.print("OFF",81,143); myGLCD.print("OFF",145,143); myGLCD.print("OFF",209,143); myGLCD.print("OFF",273,143); myGLCD.print("OFF",337,143); } void waitForIt(int x1, int y1, int x2, int y2){ myGLCD.setColor(255, 0, 0); myGLCD.drawRoundRect (x1, y1, x2, y2); while (myTouch.dataAvailable()) myTouch.read(); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (x1, y1, x2, y2); } void setup(){ myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM); myGLCD.setFont(BigFont); myGLCD.setBackColor(0, 0, 255); dispScreen0(); } void loop(){ while (true) { if (myTouch.dataAvailable()){myTouch.read();x=myTouch.getX();y=myTouch.getY(); //====================================== if ((y>=35) && (y<=70)) { if ((x>=10) && (x<=195)){waitForIt(10, 35, 195, 70);clearScreen();dispScreen1();} // переход if ((x>205) && (x<=390)){waitForIt(205, 35, 390, 70);} } //====================================== if ((y>=80) && (y<=115)){ if ((x>=10) && (x<=195)){waitForIt(10, 80, 195, 115);break;} if ((x>205) && (x<=390)){waitForIt(205, 80, 390, 115);break;} } //====================================== if ((y>=125) && (y<=160)){ if ((x>=10) && (x<=195)){waitForIt(10, 125, 195, 160);break;} if ((x>205) && (x<=390)){waitForIt(205, 125, 390, 160);break;} } //====================================== if ((y>=170) && (y<=205)){ if ((x>=10) && (x<=195)){waitForIt(10, 170, 195, 205);break;} if ((x>205) && (x<=390)){waitForIt(205, 170, 390, 205);break;} } } } //======================================== }
вот тут идеология хорошо расписана: http://habrahabr.ru/post/251181/
Спасибо большое. С построением меню на LCD экранах я знаком. На TFT LCD Touch экранах идея немного другая. В принципе я построил это меню. Вопрос совсем в другом. Еще повторюсь. При запуске программы на "железе" происходит следующее: загружаются кнопки основного меню. При нажатии на кнопку "GRUPA 1" активируеться экран "disoscreen1". Вот тут и возникает проблема, что на втором экране Touch screen работает , как на первом экране. При добавлении условия:
void
loop
(){
217
218
while
(
true
)
219
{
220
if
(myTouch.dataAvailable()){myTouch.read();x=myTouch.getX();y=myTouch.getY();
221
//======================================
222
if
((y>=35) && (y<=70)) {
223
if
((x>=10) && (x<=195) && (menuID==1)){waitForIt(10, 35, 195, 70);clearScreen();dispScreen1();}
// переход
224
if
((x>205) && (x<=390)){waitForIt(205, 35, 390, 70);}
225
}
Touch Screen вообще не реагирует на нажатие. В чем же проблема?
Всем привет. Есть у кого нить многоуровневое меню реально работающее. Экран тач 3.5
Всем привет. Есть у кого нить многоуровневое меню реально работающее. Экран тач 3.5
Есть, но только на адафруте. если подойдёт - текст скетча