| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| TFT + Arduino - Проблем http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=14004 |
Страница 1 от 1 |
| Автор: | nunep [ Нед Авг 30, 2015 2:04 am ] |
| Заглавие: | TFT + Arduino - Проблем |
Здравйте, Постановка: Ардуино 3 + Adafruit TFT Touchscreen. Задачата е: извиква се функция getNumber(); която изобразява клавиатура на екрана. Чак при натискане на ОК бутона става изход от функцията и връщане към основната програма. Проблем: От клипчето се вижда, че дори без да се докосне екрана става връщане към основната програма. Във функцията има цикъл който отчита натискането на бутоните до натускане на бутон ОК. Цикъла е направен с: Do - while (exit > 10); На клипчето се вижда една малка 0 над бутон 1. Това е състоянието на променливата EXIT при изход от функцията, което не би трябвало да е възможно. Някои има ли идея защо минава и заминава през цикала без въобще да го отчита състоянието на EXIT ? Мерси! Ето клипчето и кода: https://www.youtube.com/watch?v=QZzvVUlyAuw #include <Adafruit_GFX.h> #include <SPI.h> #include <Adafruit_ILI9341.h> #include <Wire.h> #include <Adafruit_FT6206.h> #define TFT_CS 10 #define TFT_DC 9 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); Adafruit_FT6206 ctp = Adafruit_FT6206(); // This is calibration data for the raw touch data to the screen coordinates #define TS_MINX 150 #define TS_MINY 130 #define TS_MAXX 3800 #define TS_MAXY 4000 #define BUTTON_X 40 #define BUTTON_Y 120 #define BUTTON_W 60 #define BUTTON_H 30 #define BUTTON_SPACING_X 20 #define BUTTON_SPACING_Y 20 #define BUTTON_TEXTSIZE 2 // text box where numbers go #define TEXT_X 15 #define TEXT_Y 35 #define TEXT_W 290 #define TEXT_H 50 #define TEXT_TSIZE 3 #define TEXT_TCOLOR ILI9341_WHITE // the data (phone #) we store in the textfield #define TEXT_LEN 15 char textfield[TEXT_LEN+1] = ""; uint8_t textfield_i=0; char buttonlabels[12][3] = { "1", "2", "3", "0", "4", "5", "6", "<-", "7", "8", "9", "Ok" }; uint16_t buttoncolors[12] = { ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, ILI9341_DARKGREY, ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, ILI9341_DARKGREEN}; Adafruit_GFX_Button buttons[12]; void showNumber(char *txtnum) { tft.setCursor(TEXT_X + 10, TEXT_Y+15); tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK); tft.setTextSize(TEXT_TSIZE); tft.print(txtnum); } void showTime() { tft.setCursor(15, 10); tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK); tft.setTextSize(2); tft.print("22:37 15.DEC.2015"); } void getNumber() { tft.fillScreen(ILI9341_BLACK); for (uint8_t row=0; row<3; row++) { for (uint8_t col=0; col<4; col++) { buttons[col + row*4].initButton(&tft, BUTTON_X+col*(BUTTON_W+BUTTON_SPACING_X), BUTTON_Y+row*(BUTTON_H+BUTTON_SPACING_Y), // x, y, w, h, outline, fill, text BUTTON_W, BUTTON_H, ILI9341_WHITE, buttoncolors[col+row*4], ILI9341_WHITE, buttonlabels[col + row*4], BUTTON_TEXTSIZE); buttons[col + row*4].drawButton(); } } tft.drawRect(TEXT_X, TEXT_Y, TEXT_W, TEXT_H, ILI9341_WHITE); // create 'text field' byte exit = 0; TS_Point p; do { showTime(); // if (ctp.touched()) //{ p = ctp.getPoint(); p.x = map(p.x, 0, 240, 0, 240); p.y = map(p.y, 0, 320, 320, 0); int t = p.x; p.x = p.y; p.y = t; // } for (uint8_t b=0; b<12; b++) { if (buttons[b].contains(p.x, p.y)) { buttons[b].press(true);} else {buttons[b].press(false);} } for (uint8_t b=0; b<12; b++) { if (buttons[b].justReleased()) {buttons[b].drawButton();} if (buttons[b].justPressed()) { buttons[b].drawButton(true); if ((( b > -1 ) && ( b < 7 )) || (( b > 7 ) && ( b < 11 ))) { if (textfield_i < TEXT_LEN) { textfield[textfield_i] = buttonlabels[b][0]; textfield_i++; textfield[textfield_i] = 0; // zero terminate } } if (b == 7) { textfield[textfield_i] = 0; if (textfield_i > 0) { textfield_i--; textfield[textfield_i] = ' '; } } showNumber(textfield); if (b == 11) { exit = 100; } delay(20); } } } while ( exit > 10 ); tft.fillRect(10, 90, 240, 8, ILI9341_BLACK); //показва състоянието на EXIT след края на функцията. tft.setCursor(10, 90); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); tft.print(exit,DEC); delay(1000); } void setup(void) { while (!Serial); // used for leonardo debugging Serial.begin(9600); tft.begin(); tft.setRotation(1); tft.fillScreen(ILI9341_BLACK); if (! ctp.begin(40)) { // pass in 'sensitivity' coefficient Serial.println("Couldn't start FT6206 touchscreen controller"); while (1); } } void loop() { tft.fillScreen(ILI9341_BLACK); showTime(); showNumber("1"); delay(500); showNumber("2"); delay(500); showNumber("3"); delay(500); getNumber(); delay(500); tft.fillScreen(ILI9341_BLACK); showNumber(textfield); delay(2000); } |
|
| Автор: | ToHu [ Нед Авг 30, 2015 5:55 am ] |
| Заглавие: | Re: TFT + Arduino - Проблем |
Не съм ти гледал кода но не предполагаш ли че може да се връща натиснат ок. В определени случаи тъч екраните връщат всевъзможни координати, особенно тия с капацитивепн сензор. |
|
| Автор: | nunep [ Нед Авг 30, 2015 10:29 am ] |
| Заглавие: | Re: TFT + Arduino - Проблем |
Тони, разбирам ти идеята, но дори и остатъчни координати да има те пак трябва да се обработят от функцията. И ако остатъчните координати все пак съчпадат с бутона ОК (единственив изход от цикъла) то стойноста на параметъра EXIT трябва да е различна от 0. Един вид въобще програмата не взема предвид условието WHILE (exit >10); Поздрави! |
|
| Автор: | nunep [ Нед Авг 30, 2015 10:52 am ] |
| Заглавие: | Re: TFT + Arduino - Проблем |
Проблема е решен. Глупава грешка - while (exit < 10); |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|