Mehrere Touchscreens an einem Arduino Mega 2560

#7673470
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

#7673503
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.

#7673848
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren