Arduino TFT Touch Shield: рисовать в петле

Я пытаюсь создать меню с сенсорной панелью TFT. Теперь моя проблема в том, что я ничего не могу нарисовать внутри функции цикла.

Если я напишу какую-нибудь функцию рисования в цикле, экран станет белым. Я подумал, что это потому, что экран требует некоторого времени для создания. Поэтому я добавил задержку (1000). Но затем экран мигает каждую секунду, что, очевидно, тоже не то, что я хочу.

Следующая утомленная вещь — то, что программа перестает работать, когда я рисую, когда касаюсь дисплея. В приведенном ниже коде у меня есть три функции рисования. Двое из них работают, а один нет. (см. комментарии)

#include <SeeedTouchScreen.h>

#include <TFTConsole.h>
#include <Adafruit_TFTLCD.h>
#include <Adafruit_GFX.h>#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

#define TS_MINX 169
#define TS_MINY 208
#define TS_MAXX 1781
#define TS_MAXY 1820

#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
TouchScreen ts = TouchScreen(XP, YP, XM, YM);
boolean touched = false;void setup() {
Serial.begin(9600);
Serial.print("Starting...");

tft.reset();

tft.begin(0x9325);

tft.setRotation(1);

tft.fillScreen(BLACK);

//Print "PPM CO" Text
tft.setCursor(50, 30);
tft.setTextColor(GREEN);
tft.setTextSize(3);
tft.print("Hello World"); //<- this is displayed fine
delay(1000);
}
boolean first = true;
void loop() {
if (first) {
first = false;
tft.drawCircle(119, 160, 20, random(0xFFFF)); //<- This is also displayed
}Point p = ts.getPoint();p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);
if (p.x <= 240 && p.y <= 320 && p.x >= 0 && p.y >= 0) {
Serial.println("don't touch me!");
touched = true;
}
else {
touched = false;
}
if (touched) {

tft.drawCircle(119, 180, 20, RED); //<- This is not displayed and makes the screen flash
delay(1000);
}//tft.fillScreen(BLUE);
//delay(500);

}

Только если у меня есть последний drawCircle внутри кода переменной прикоснулся не переключается обратно на false, если я перестаю касаться дисплея.

Кто-нибудь знает, что я делаю неправильно?

Обновить: Я остановил мигание дисплея, позволяя событию касаться только один раз при касании дисплея. Но у меня все еще есть проблема, что ничто не нарисовано …

void loop() {
//Touchposition bestimmen
Point p = ts.getPoint();
p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);
if (p.x <= 240 && p.y <= 320 && p.x >= 0 && p.y >= 0) {
if (released) {
touched = true;
released = false;
}
}
else {
//Serial.println("Touch me where I like it!");
touched = false;
released = true;
}
if (touched && !released) {
Serial.println("don't touch me!");
drawButton(100, 100, "Manuell");
touched = false;
delay(500);
}

}

1

Решение

Я заметил, что TFT-дисплей и сенсорный экран имеют несколько аналоговых контактов. Я думаю, что это вызывает проблемы.
Поэтому я разделил свой код на части, где обрабатывается сенсорный экран. Затем я могу переназначить контакты на TFT-монитор и нарисовать его. Я не знаю, имеет ли смысл эта теория, но она работает:

 void loop() {
//Touchposition bestimmen
if (ts.isTouching()) {
Point p = ts.getPoint();
p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
p.y = map(p.x, TS_MINY, TS_MAXY, 0, 320);
if (released) {
released = false;
}
}
else {
//Serial.println("Touch me where I like it!");
released = true;
}

if (ts.isTouching() && !released) {
//re assing pins to tft because they are also used by the touchscreen
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
Serial.println("don't touch me!");
drawButton(100, 100, "Manuell");
touched = false;
}
}

Funton drawButton содержит несколько функций рисования

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]