Pelindung Sentuh TFT Arduino: menggambar lingkaran

Saya mencoba membuat menu dengan touchpad TFT. Sekarang masalah saya adalah saya tidak bisa menggambar apa pun di dalam fungsi loop.

Jika saya menulis fungsi menggambar apa pun di loop, layar menjadi putih. Saya pikir ini karena layar memerlukan waktu untuk dibangun. Jadi saya menambahkan penundaan (1000). Tapi kemudian layar berkedip setiap detik yang jelas bukan itu yang saya inginkan.

Hal aneh berikutnya adalah program berhenti bekerja ketika saya menggambar setelah layar disentuh. Dalam kode di bawah ini saya memiliki tiga fungsi menggambar. Dua di antaranya berfungsi, satu tidak. (lihat komentar)

#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);

}

Hanya jika saya memiliki drawCircle terakhir di dalam kode, variabel touched tidak akan kembali ke false jika saya berhenti menyentuh layar.

Adakah yang tahu apa yang saya lakukan salah?

Pembaruan: Saya menghentikan tampilan agar tidak berkedip dengan membiarkan peristiwa yang disentuh hanya terjadi satu kali saat layar disentuh. Tapi saya masih mengalami masalah karena tidak ada yang ditarik...

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);
  }

}

person user7408924    schedule 14.06.2017    source sumber


Jawaban (1)


Saya perhatikan bahwa layar TFT dan Layar Sentuh berbagi beberapa pin Analog. Saya pikir ini yang menyebabkan masalah. Jadi saya membagi kode saya di bagian tempat layar sentuh ditangani. Lalu saya dapat menetapkan kembali pin ke monitor TFT dan menggambarnya. Saya tidak tahu apakah teori ini masuk akal, tetapi teori ini berhasil:

 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 berisi beberapa fungsi draw

person user7408924    schedule 15.06.2017