Здравйте,
Постановка: Ардуино 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);
}