Forum: Mikrocontroller und Digitale Elektronik Bekomme TFT-Touch einfach nicht funktionell.


von Nathan B. (nathan_b)


Lesenswert?

HI!

Kurz vorweg, ich bin am verzweifeln...

Egal was ich bisher versucht habe, es läuft einfach nicht so wie 
gewünscht!

Das ist jetzt mal das Minimum was ich mir eigentlich erhoffe:

Wenn der Arduino startet, soll ein schwarzer Bildschirm kommen, unten 
links mit der Beschriftung "Optionen".
Bei einem "Klick" darauf, soll sich ein neuer Bildschirm aufbauen.
1
#include <Adafruit_TFTLCD.h> 
2
#include <Adafruit_GFX.h>    
3
#include <TouchScreen.h>
4
#include <MCUFRIEND_kbv.h>
5
6
#define LCD_CS A3 
7
#define LCD_CD A2 
8
#define LCD_WR A1 
9
#define LCD_RD A0 
10
#define LCD_RESET A4 
11
12
#define TS_MINX 130
13
#define TS_MAXX 905
14
#define TS_MINY 75
15
#define TS_MAXY 930
16
17
#define YP A2
18
#define XM A3
19
#define YM 8
20
#define XP 9
21
22
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 364);
23
boolean buttonEnabled = true;
24
25
#define  BLACK   0x0000
26
#define BLUE    0x001F
27
#define blue    0x04FF
28
#define RED     0xF800
29
#define WHITE   0xFFFF
30
31
MCUFRIEND_kbv tft;
32
33
#define MINPRESSURE 10
34
#define MAXPRESSURE 100
35
36
void setup()
37
{
38
  Serial.begin(9600);
39
40
  tft.reset();
41
  uint16_t identifier = tft.readID();
42
  tft.begin(identifier);
43
  tft.setRotation(1);
44
  tft.fillScreen(BLACK);
45
}
46
47
void loop() 
48
{
49
  tft.setCursor(15, 305);
50
  tft.setTextColor(blue);   tft.setTextSize(1);
51
  tft.print("Optionen");
52
  
53
  TSPoint p = ts.getPoint();
54
  
55
    if (p.z > ts.pressureThreshhold)
56
      {
57
        p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
58
        p.y = map(p.y, TS_MAXY, TS_MINY, 0, 480);
59
60
        if(p.x>270 && p.x<330 && p.y>25 && p.y<32 && buttonEnabled)
61
          {
62
            buttonEnabled = false;
63
    
64
            pinMode(XM, OUTPUT);
65
            pinMode(YP, OUTPUT);
66
          
67
            option();
68
          }
69
      } 
70
}

Mein Problem dabei:
Setze ich die ersten 3 Zeilen des loop() ins setup(), dann geht es.
Steht es so, wie hier gezeigt, dann wird mir lediglich ein weißer 
Bildschirm angezeigt.
Dann verstehe ich aber nicht, wie ich aus einer Funktion zurück zu einem 
"Startbildschirm" kommen soll, wenn dieser im setup(), geschrieben 
steht...

Kann mir das jemand erklären? In den Beispiel-Sketches des TFT erkenne 
ich nichts, was mich weiterbringen würde...

TFT ist ein Kuman 3,5".
https://www.amazon.de/Longruner-Arduino-Module-Screen-Technical/dp/B07K2YCSJD/ref=sr_1_9?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1NONECNL7ROZF&keywords=kuman+3.5+tft+touchscreen&qid=1557778426&s=gateway&sprefix=kuman%2Caps%2C222&sr=8-9-spell

Sorry für die wohl dummen Fragen, bin absolut neu außerhalb BASIC und 
die ersten Schritte mit Touch...

Schon mal vielen Dank!!!

Gruß,

Nathan

: Verschoben durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nathan B. schrieb:
> Sorry für die wohl dummen Fragen
War halt im falchen Forum...
1
Forum: Projekte & Code
2
3
Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen
4
und diskutieren.  Bitte hier keine Fragen posten!

von BlaBla (Gast)


Lesenswert?

Vermutlich muss der TFT-Controller noch angegeben werden. Ich hatte auch 
schon meine Traumata mit den GLCDs. Teilweise hatte der Lieferant nicht 
einmal den richtigen Typ auf der Webseite angegeben. Viel Spaß noch...

von BlaBla (Gast)


Lesenswert?

Das steht auf der Amazon-Seite:
Controller: ILI9481- oder ILI9488-Treiber (Standardeinstellung 
zufällig).
Klasse: zufällig !!!

von W.S. (Gast)


Lesenswert?

Nathan B. schrieb:
> Mein Problem dabei:
> Setze ich die ersten 3 Zeilen des loop() ins setup(), dann geht es.

Na toll, dann laß es doch dort. Immerhin geht es dann ja.

Also, ich habe ja schon einiges mit bunten TFT's und mit Touchscreens 
(kapazitiven) zu tun gehabt. Aber was ich da in deinem Quelltext sehe, 
graust mich.

Deshalb ein paar Merksätze meinerseits:

1. Die Initialisierung und die Ansteuerung für Displays und für 
Touchscreens gehören in entsprechende Lowlevel-Treiber in jeweils 
eigenen Quellen und sie gehören separat ausgetestet und sinnvoll 
gekapselt (soweit das in C möglich ist) - aber sowas gehört nicht nach 
main.

2. die physische Ansteuerung eines Displays und das GDI gehören auch 
getrennt.

3. Bemerke bitte den Unterschied zwischen Touch und Display. Das sind 
nämlich 2 völlig unterschiedliche Dinge - und sie gehören auch völlig 
unterschiedlich gehandhabt.

4. Touchscreens ohne Controller, also simple resistive, müssen 
zeitzyklisch abgefragt werden, was auf ADC-Benutzung und Umschaltung 
X-Messung und Y-Messung (also die Portcharakteristika umschalten) 
hinausläuft. Sowas macht man wohl am besten im System- bzw. Timer-Tick.

Kapazitive Touchscreens haben regelmäßig ihren eigenen Controller und 
ein I2C-Interface zuzüglich einer Interrupt-Leitung, die zumeist in der 
Anlauf-Phase auch als Initialisier-Eingang fungiert. Die Benutzung läuft 
darauf hinaus, den Touchcontroller erstmal richtig initialisiert zu 
kriegen - einschließlich der notwendigen Pausen im ms Bereich, bis 
dieser läuft und dann auf den Interrupt zu reagieren, also dann den 
Touchcontroller auszulesen, den Zustand mit seiner Historie zu 
vergleichen und ggf. Ereignisse zu generieren. Zumeist ist das 
TouchDown, TouchMove und TouchUp.

So einfach wie du dir das denkst, ist es nicht. Also lies zuvor die 
zuständigen Dokumentationen.

W.S.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Nathan B. schrieb:
> bin absolut neu außerhalb BASIC

Mach die Zeilen doch in ein Unterprogramm, das du aus setup() aufrufst. 
Wenn du es wieder mal brauchst, rufst du das Unterprogramm wieder auf. 
So wie damals GOSUB in BASIC.

: Bearbeitet durch User
von BlaBla (Gast)


Lesenswert?

Irgendwie sowas:
1
    Serial.begin(9600);
2
    tft.reset();
3
    ID = tft.readID();
4
    Serial.print("TFT ID = 0x");
5
    Serial.println(ID, HEX);
6
    //    if (ID == 0xD3D3) ID = 0x9481; // write-only shield
7
    if (ID == 0xD3D3) ID = 0x9486; // write-only shield
8
    tft.begin(ID);

Und wenn der Controller nicht erkannt wird, dann eben mit Zwang:

ID = 0x9481; oder
ID = 0x9488;

von akis (Gast)


Lesenswert?

Das mit dem weissen Bildschirm konnte so gelöst werden


#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_KBV.h> //Hardware-specific library



//if the IC model is known or the modules is unreadable,you can use this 
constructed function
LCDWIKI_KBV mylcd(ILI9341,A3,A2,A1,A0,A4); //model,cs,cd,wr,rd,reset
//if the IC model is not known and the modules is readable,you can use 
this constructed function
//LCDWIKI_KBV 
mylcd(240,320,A3,A2,A1,A0,A4);//width,height,cs,cd,wr,rd,reset

#include <stdint.h>
#include "TouchScreen.h"

// These are the pins for the shield! on UNO
#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 MINPRESSURE 3800
#define MAXPRESSURE 4000

// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
//define some colour values
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

void setup()
{
  Serial.begin(9600);
  mylcd.Init_LCD();
  Serial.println(mylcd.Read_ID(), HEX);
  mylcd.Fill_Screen(BLACK);

  // default button is "0" Green
  mylcd.Set_Text_Mode(0);
  //display 1 times string
  //mylcd.Fill_Screen(0x0000);      // write black to screen
  mylcd.Set_Text_colour(RED);
  mylcd.Set_Text_Back_colour(BLACK);
  mylcd.Set_Text_Size(sizeText);
  //mylcd.Print_String("text", 0, 16); // first row, 16 pixel down from 
left top corner
  mylcd.Print_String("string", 100, 120);
}

void loop()
{
comme:

    digitalWrite(13, HIGH);
    TSPoint p = ts.getPoint();
    digitalWrite(13, LOW);
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);

    mylcd.Set_Text_Mode(0);
    mylcd.Fill_Screen(0x0000);      // write black to screen
    mylcd.Set_Text_colour(RED);
    mylcd.Set_Text_Back_colour(BLACK);
    mylcd.Set_Text_Size(3);
    mylcd.Print_String("text", 30, 30);

    // we have some minimum pressure we consider 'valid'
    // pressure of 0 means no pressing!

    Serial.print("X = "); Serial.print(p.x);
    Serial.print("\tY = "); Serial.print(p.y);
    Serial.print("\tPressure = "); Serial.println(p.z);
    delay(150);

   if (p.z > MINPRESSURE && p.z < MAXPRESSURE && high_flag == 0) {
    Serial.print("X = "); Serial.print(p.x);
    Serial.print("\tY = "); Serial.print(p.y);
    Serial.print("\tPressure = "); Serial.println(p.z);
    buttonState = 1;
    Serial.print("buttonState1: "); Serial.println(buttonState);
    Serial.print("high_flag: "); Serial.println(high_flag);

    delay(50);
   }
   goto comme;
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.