Forum: Mikrocontroller und Digitale Elektronik Mehrere Touchscreens an einem Arduino Mega 2560


von Florian E. (florian_e434)


Lesenswert?

Guten Abend,

ich bin seit einigen Tagen dabei 2 TFT Touchscreens mit einem Arduino 
Mega 2560 zuverbinden, beiße mir dabei aber gerade die Zähne aus.

Ich verwende diese Touchscreens:
https://www.conrad.de/de/p/joy-it-touchscreen-modul-4-6-cm-1-8-zoll-160-x-128-pixel-passend-fuer-entwicklungskits-asus-arduino-asus-tinker-b-2751485.html

die Library XPT2046_Touchscreen ist hier zu finden:
https://github.com/PaulStoffregen/XPT2046_Touchscreen

und am Ende ist noch das Programm mit Pinbelegung zu finden, mit welchem 
ich Anzeigen auf den Display erstellen kann und auch eine Reaktion von 
den Touchscreens bekommen.

ABER die Touchscreens lassen sich nicht von einander unterscheiden. Wenn 
ich auf eines der Dispays tippe, dann bekomme ich von beiden die 
ausgaben auf dem Seriellen monitor:
1
01:33:42.406 -> Touch1: x:3835  y:208  z:578
2
01:33:42.439 -> touch2: x:3807  y:0  z:598
3
01:33:42.472 -> Touch1: x:3835  y:208  z:578
4
01:33:42.504 -> touch2: x:3887  y:208  z:791
5
01:33:42.504 -> Touch1: x:3863  y:524  z:905
6
01:33:42.537 -> touch2: x:3887  y:216  z:920
7
01:33:42.570 -> Touch1: x:3895  y:512  z:901
8
01:33:42.603 -> touch2: x:3887  y:512  z:816

Ich bin mir nicht sicher ob die Verdrahtung stimmt, Aber alles was ich 
gesehen habe, lässt mich auf diese Lösung kommen.
1
/*
2
*     Pin Belegung:
3
*
4
* gebrückt auf beide Displays:
5
* Arduino     Display
6
*   +5V   =>    VCC
7
*   GND   =>    GND
8
*   52    =>    SCL
9
*   51    =>    SDA
10
*   50    =>    MOSI-T
11
*   
12
* Display 1:
13
*   25    =>    DC
14
*   27    =>    RES
15
*   23    =>    CS
16
*   3     =>    IRQ-T
17
*   24    =>    CS-T
18
*   
19
*   
20
* Display 2:
21
*   35    =>    DC
22
*   37    =>    RES
23
*   33    =>    CS
24
*   2     =>    IQR-T
25
*   34    =>    CS-T
26
*/
27
28
29
#include <Adafruit_GFX.h>
30
#include <Adafruit_ST7735.h>
31
#include <SPI.h>
32
#include <XPT2046_Touchscreen.h>
33
#include <Fonts/FreeSans9pt7b.h>
34
35
//Variablen erstellen
36
 //Ein-/Ausgänge
37
  //Display Anzeige
38
   int RS[3] = {25, 35, 45};
39
   int CS[3] = {23, 33, 43};
40
   int RES[3] = {27, 37, 47};
41
  //Display Touch
42
   int CS_T[3] = {24, 34, 44};
43
   int IRQ_T[3] = {3, 2}; //Interuptible pins For Mega: 2,3,18,19,20,21
44
  //desweiteren müssen die Hardware SPI-pins angeschlossen werden: SCK=52, SDA=51, MISO=50
45
46
  //Zuletzt berührt
47
   TS_Point last_1;
48
   TS_Point last_2;
49
50
//Definitionen
51
 //Diplay Touch
52
  #define TS_SMALLMIN 3850// 250//
53
  #define TS_LONGMIN 250
54
  #define TS_SMALLMAX 250// 3850
55
  #define TS_LONGMAX 3900
56
57
//Objekte erstellen
58
 //Display Anzeige
59
 Adafruit_ST7735 tft_test[2] = {{CS[0], RS[0], RES[0]}, {CS[1], RS[1], RES[1]}};
60
 //Display Touch
61
  XPT2046_Touchscreen touch1 = (CS_T[0], IRQ_T[0]);
62
  XPT2046_Touchscreen touch2 = (CS_T[1], IRQ_T[1]);
63
64
65
void setup() {
66
  //Serial starten
67
  Serial.begin(9600);
68
  Serial.println("Setup");
69
70
  //Display 1 starten
71
  tft_test[0].initR(INITR_GREENTAB);
72
  touch1.begin();
73
  touch1.setRotation(0);
74
75
  //Display 2 starten
76
  tft_test[1].initR(INITR_GREENTAB);
77
  touch2.begin();
78
  touch2.setRotation(0);
79
80
  //Display 1 Testbilder anzeigen
81
  //RGB 10 bit: 5 bits Blau, 6 bits Grün, 5 bits Rot
82
  // Blau = 0x001f, Grün = 0x07e0, Rot = 0xf800
83
  tft_test[0].fillScreen(0x07e0);
84
  tft_test[0].setFont(&FreeSans9pt7b);
85
  tft_test[0].setTextColor(0x0000, 0xffff);
86
  tft_test[0].setCursor(10, 20);
87
  tft_test[0].print("Test screen 2");
88
89
  //Display 1 Testbilder anzeigen
90
  tft_test[1].fillScreen(0x001f);
91
  tft_test[1].setFont(&FreeSans9pt7b);
92
  tft_test[1].setTextColor(0x0000, 0xffff);
93
  tft_test[1].setCursor(10, 20);
94
  tft_test[1].print("Test");
95
}
96
97
void loop() {
98
  //Display 1 Positionen von Clicks anzeigen
99
  if (touch1.touched()){
100
    last_1 = touch1.getPoint();
101
    Serial.println("Touch1: x:" + String(last_1.x) + "\ty:" + String(last_1.y) + "\tz:" + String(last_1.z));
102
  }
103
104
  //Display 2 Positionen von Clicks anzeigen
105
  if (touch2.touched()){
106
    last_2 = touch2.getPoint();
107
    Serial.println("touch2: x:" + String(last_2.x) + "\ty:" + String(last_2.y) + "\tz:" + String(last_2.z));
108
  }
109
110
  //ausgabe, wenn nur ein Display berührt wird
111
  if (touch2.touched() != touch1.touched()){
112
    Serial.println("Test");
113
  }
114
}

Ich hoffe Ihr könnt mir helfen
Grüße

von J. S. (jojos)


Lesenswert?

Lasse mal den IRQ PIN für den TS weg  oder auf 255 setzen. Der ist 
static in der Lib, die kann nicht verschiedene ISR setzen.

Und Code Tags in den postings hier verwenden.

von Michi S. (mista_s)


Lesenswert?

Florian E. schrieb:
> ABER die Touchscreens lassen sich nicht
> von einander unterscheiden.

Dann würde ich ganz spontan mal darauf tippen, daß zumindest eine der 
verwendeten libs nicht dafür gedacht ist mehr als ein Display 
gleichzeitig anzusteuern.

Das ist ja auch ein eher seltener use-case; insofern halte ich es 
durchaus auch für denkbar, daß zwar der lib-Autor an die Unterstützung 
mehrerer Displays gedacht hatte, die lib aber einfach nie dahingehend 
getestet wurde.

von Florian E. (florian_e434)


Lesenswert?

Danke für eure schnelle Antwort.

J. S. schrieb:
> Lasse mal den IRQ PIN für den TS weg

Das hat funktioniert vielen Dank

J. S. schrieb:
> Und Code Tags in den postings hier verwenden.

Hab ich die falschen verwendet? eigentlich meine ich [code] verwendet zu 
haben

von J. S. (jojos)


Lesenswert?

Florian E. schrieb:

> Das hat funktioniert vielen Dank

Prima, freut mich.
Es ist ja gerade ein Vorteil von OOP das man mehrere Instanzen einer 
Klasse erzeugen kann. Bei Ressourcen wie Interrupts ist es etwas 
schwieriger und bei Arduino nicht gut gelöst, aber hier kommt man ja 
auch ohne aus, bzw. muss dann schnell genug prüfen ob ein touch Event 
anliegt.

> J. S. schrieb:
>> Und Code Tags in den postings hier verwenden.
>
> Hab ich die falschen verwendet? eigentlich meine ich [code] verwendet zu
> haben

Dann hatte ich heute morgen die Augen noch nicht richtig auf, besser ist 
allerdings das [c] Tag für C/Cpp. Und noch besser den Code als Anhang 
mit der Endung .ino oder .cpp anhängen.

Wünsche weiterhin maximale Erfolge.

von Hobby B. (bastler2022)


Lesenswert?

Hallo,

hier mal ein Link für Dich.

https://github.com/Bodmer/TFT_eSPI

Damit als Grundlage hatte ich 4 Stück über SPI zum laufen gebracht, an 
einem ESP32. Das dann aber wieder verworfen. Da es bei der Übertragung 
zu Fehlern kam. Das lag aber an meiner Kabelführung.

Gruß bastler2022

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.