Wat je nodig hebt
-
Het 3.95" ST7796S touchscreen ("for Mega2560") met de meegeleverde stylus.
- Je Arduino Mega 2560.
- Geen draadjes en geen breadboard — dat is juist het punt.
Waarom touch je pin-probleem oplost
Een shield prikt met al zijn pootjes ín de headers van je Arduino en dekt die daarmee af. Je kunt er dan geen joystick of sensor-draadjes meer bij steken. Bij dit scherm geeft dat niks: het scherm is zelf de invoer. Waar je tikt, dáár reageert het — geen extra pinnen nodig.
Erop prikken (de goede kant op)
De 3.95" is gemaakt voor de Mega: hij schuift over de lange dubbele pinnenrij. Let goed op de uitlijning: alle pootjes moeten in een gaatje, en niets mag ernaast steken. Duw rustig en recht aan.
Libraries & je scherm laten herkennen
Installeer via Manage Libraries… drie libraries:
- MCUFRIEND_kbv — de driver voor deze opprik-schermen.
- Adafruit GFX Library — de vertrouwde teken-gereedschapskist.
- Adafruit TouchScreen — om aanrakingen te lezen (stap 5).
Deze schermen "vertellen" zelf welk type ze zijn via een ID. Controleer eerst of jouw scherm herkend wordt. Upload dit en open de Serial Monitor:
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
void setup() {
Serial.begin(9600);
uint16_t id = tft.readID(); // vraag het scherm om zijn ID
Serial.print("Scherm-ID: 0x");
Serial.println(id, HEX);
tft.begin(id);
tft.fillScreen(0x001F); // blauw = het werkt!
}
void loop() {}
0x7796? Top, verder naar stap 4.
Zie je 0x0, 0xFFFF of 0xD3D3, dan werd het scherm
niet goed herkend — kijk bij "Werkt het niet?".
Je eerste beeld
Nu tekenen we. Merk op: de commando's (fillScreen, setCursor,
print) zijn exact die van de kleine schermen — alleen is er nu véél meer plek
(480×320) en gebruiken we kleuren als getal (bijv. 0xFFFF = wit).
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
// kleuren als getal (16-bits)
#define ZWART 0x0000
#define WIT 0xFFFF
#define CYAAN 0x07FF
#define GEEL 0xFFE0
void setup() {
tft.begin(tft.readID());
tft.setRotation(1); // liggend: 480 breed, 320 hoog
tft.fillScreen(ZWART);
tft.setTextColor(WIT);
tft.setTextSize(5);
tft.setCursor(40, 70);
tft.print("Hallo!");
tft.setTextColor(CYAAN);
tft.setTextSize(3);
tft.setCursor(40, 160);
tft.print("Groot kleurenscherm");
tft.fillCircle(400, 250, 40, GEEL); // even een cirkel, kan nu groot
}
void loop() {}
tft.begin(...) toe:
tft.invertDisplay(true);. Staat het beeld verkeerd om? Speel met het getal in
setRotation(0..3).
Touch uitlezen & kalibreren
Een aanraakscherm meet waar je drukt als twee ruwe getallen. Die moeten we omrekenen naar schermpixels — dat heet kalibreren. Elk exemplaar is net iets anders, dus dit doe je één keer.
MCUFRIEND_kbv heeft een kant-en-klaar voorbeeld:
Bestand → Voorbeelden → MCUFRIEND_kbv → TouchScreen_Calibr_native. Upload dat, raak de kruisjes aan,
en het print jouw persoonlijke pin-namen (XP, YP, XM, YM) en kalibratiegetallen. Die vul je hieronder in.
Test daarna met dit sketchje of de aanrakingen binnenkomen (getallen in de Serial Monitor):
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>
MCUFRIEND_kbv tft;
// <-- vul deze 4 in met de uitkomst van TouchScreen_Calibr_native
#define YP A3
#define XM A2
#define YM 9
#define XP 8
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
void setup() {
Serial.begin(9600);
tft.begin(tft.readID());
tft.setRotation(1);
tft.fillScreen(0x0000);
}
void loop() {
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT); // pinnen terugzetten voor het scherm
pinMode(YP, OUTPUT);
if (p.z > 200) { // p.z is de druk: >200 = aangeraakt
Serial.print("x="); Serial.print(p.x);
Serial.print(" y="); Serial.print(p.y);
Serial.print(" druk="); Serial.println(p.z);
}
delay(40);
}
pinMode(XM, OUTPUT) en pinMode(YP, OUTPUT) ná
elke meting zijn verplicht — touch en scherm delen die pinnen. Zonder deze regels flikkert het beeld.
2. Komen er geen getallen? Dan kloppen de vier pin-namen nog niet — draai eerst de kalibratie-voorbeeldsketch.
Touch-spel: Tik de stip
Een gele stip springt naar willekeurige plekken. Tik hem zo snel mogelijk aan voor punten — een reactiespel dat volledig op touch werkt. Vul bovenaan je eigen kalibratiegetallen in.
#include <MCUFRIEND_kbv.h>
#include <TouchScreen.h>
MCUFRIEND_kbv tft;
#define ZWART 0x0000
#define WIT 0xFFFF
#define GEEL 0xFFE0
#define YP A3
#define XM A2
#define YM 9
#define XP 8
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
// <-- kalibratie: vul in met jouw getallen (stap 5)
#define TS_LINKS 120
#define TS_RECHTS 900
#define TS_BOVEN 120
#define TS_ONDER 900
int doelX, doelY;
const int R = 30;
int score = 0;
void nieuwDoel() {
doelX = random(R, tft.width() - R);
doelY = random(60, tft.height() - R);
tft.fillCircle(doelX, doelY, R, GEEL);
}
void toonScore() {
tft.fillRect(0, 0, tft.width(), 44, ZWART);
tft.setCursor(12, 10);
tft.setTextColor(WIT);
tft.setTextSize(3);
tft.print("Score: ");
tft.print(score);
}
void setup() {
tft.begin(tft.readID());
tft.setRotation(1);
tft.fillScreen(ZWART);
randomSeed(analogRead(A5));
toonScore();
nieuwDoel();
}
void loop() {
TSPoint p = ts.getPoint();
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
if (p.z > 200) {
// ruwe meting -> schermpixels
int tx = map(p.x, TS_LINKS, TS_RECHTS, 0, tft.width());
int ty = map(p.y, TS_BOVEN, TS_ONDER, 0, tft.height());
// binnen de stip getikt? (afstand tot midden < straal)
long dx = tx - doelX, dy = ty - doelY;
if (dx * dx + dy * dy < (long)R * R) {
tft.fillCircle(doelX, doelY, R, ZWART); // stip weg
score++;
toonScore();
nieuwDoel();
delay(150);
}
}
}
map(...) de twee kalibratiegetallen (bijv. TS_LINKS en TS_RECHTS).
Werkt het niet? — checklist
| Symptoom | Meest waarschijnlijke oorzaak |
|---|---|
| Scherm blijft wit | Controleer of alle pootjes goed in de Mega zitten. ID 0x0/0xD3D3 = niet herkend. |
| Kleuren omgekeerd (rood↔blauw) | Voeg tft.invertDisplay(true); toe na tft.begin(...). |
| Beeld staat gedraaid | Ander getal in setRotation(0..3). |
| Touch reageert niet | Vier pin-namen (XP/YP/XM/YM) kloppen nog niet — draai TouchScreen_Calibr_native. |
| Touch zit ernaast / gespiegeld | Kalibratiegetallen bijstellen of de twee getallen in map() omdraaien. |
| Beeld flikkert bij aanraken | De twee pinMode(..., OUTPUT)-regels na getPoint() ontbreken. |
Je hebt het grote scherm
Leuke vervolgstappen met touch: een tekenprogramma (volg je vinger met kleine cirkels), een knoppen-menu (tekstvakken die je aantikt), of een rekenmachine. En onthoud: voor projecten met sensoren pak je een klein scherm dat je pinnen vrijlaat.