Микроконтролери и електроника
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/