Отговори на тема  [ 4 мнения ] 
TFT + Arduino - Проблем 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 30, 2015 1:05 am
Мнения: 3
Мнение 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);
}


Нед Авг 30, 2015 2:04 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: TFT + Arduino - Проблем
Не съм ти гледал кода но не предполагаш ли че може да се връща натиснат ок. В определени случаи тъч екраните връщат всевъзможни координати, особенно тия с капацитивепн сензор.


Нед Авг 30, 2015 5:55 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 30, 2015 1:05 am
Мнения: 3
Мнение Re: TFT + Arduino - Проблем
Тони, разбирам ти идеята, но дори и остатъчни координати да има те пак трябва да се обработят от функцията. И ако остатъчните координати все пак съчпадат с бутона ОК (единственив изход от цикъла) то стойноста на параметъра EXIT трябва да е различна от 0. Един вид въобще програмата не взема предвид условието WHILE (exit >10);

Поздрави!


Нед Авг 30, 2015 10:29 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 30, 2015 1:05 am
Мнения: 3
Мнение Re: TFT + Arduino - Проблем
Проблема е решен. Глупава грешка - while (exit < 10);


Нед Авг 30, 2015 10:52 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 4 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 17 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни