ARDUINO WERKPLAATS
◂ het grote werk · touch is de besturing Project 06 · het touchscreen

Groot scherm,
gewoon aanraken.

Een fors kleurenscherm dat je zó op je Arduino prikt — geen enkel draadje. En omdat het een touchscreen is, is je vinger meteen de besturing. Precies de oplossing voor "de shield dekt al mijn pinnen af": je hebt die pinnen niet nodig.

Scherm: 3.95" ST7796S 480 × 320 · kleur Besturing: touch ~45 min
Welke combinatie gebruik je?
De code is voor beide gelijk — het scherm wordt automatisch herkend. Alleen bord en shield verschillen.
0

Wat je nodig hebt

  • groot touchscreen dat op de Arduino prikt 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.
Nieuw in dit project Drie dingen: een scherm dat je opprikt, een grotere resolutie (480×320), en touch als invoer. De teken-commando's zelf ken je al — die zijn hetzelfde als op de kleine schermen.
1

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.

Arduino (pinnen afgedekt) touchscreen erbovenop 👆 tik = invoer geen extra pinnen nodig
In- én uitvoer in één apparaat — dáárom is een groot touchscreen zo handig op een volle Arduino.
En sensoren dan? Wil je tóch de afstands- of temperatuursensor gebruiken, doe die projecten dan op je OLED of de 1.44" TFT — die laten je pinnen vrij. Dit grote scherm is voor beeld + touch.
2

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.

recht naar beneden drukken
Alle pootjes in de gaatjes, niets ernaast. Nooit scheef forceren.
Even checken vóór stroom erop Kijk of er geen enkel pootje naast de header steekt. Een verschoven pin kan kortsluiting geven. Zit hij goed en recht? Dan pas de USB-kabel erin.
3

Libraries & je scherm laten herkennen

Installeer via Manage Libraries… drie libraries:

  1. MCUFRIEND_kbv — de driver voor deze opprik-schermen.
  2. Adafruit GFX Library — de vertrouwde teken-gereedschapskist.
  3. 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:

01_scherm_id.ino
#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() {}
Wat zie je? Wordt het scherm blauw en zie je een ID als 0x7796? Top, verder naar stap 4. Zie je 0x0, 0xFFFF of 0xD3D3, dan werd het scherm niet goed herkend — kijk bij "Werkt het niet?".
4

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).

02_eerste_beeld.ino
#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() {}
Verkeerde kleuren of gedraaid beeld? Staat rood waar blauw hoort? Voeg na tft.begin(...) toe: tft.invertDisplay(true);. Staat het beeld verkeerd om? Speel met het getal in setRotation(0..3).
5

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.

De makkelijkste kalibratie De library 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.
ruwe meting x=812 y=245 map() schermpixel x=395 y=210
Kalibreren = de ruwe getallen omrekenen naar echte pixels met map().

Test daarna met dit sketchje of de aanrakingen binnenkomen (getallen in de Serial Monitor):

03_touch_test.ino
#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);
}
Twee valkuilen 1. De twee regels 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.
6

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.

Score: 7 👆
Puur touch — geen joystick, geen knoppen, geen draadjes.
04_tik_de_stip.ino
#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);
    }
  }
}
Tikt hij naast de stip? Dan is de kalibratie nog niet scherp. Reageert links/rechts of boven/onder omgekeerd? Verwissel in de betreffende map(...) de twee kalibratiegetallen (bijv. TS_LINKS en TS_RECHTS).
7

Werkt het niet? — checklist

SymptoomMeest waarschijnlijke oorzaak
Scherm blijft witControleer 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 gedraaidAnder getal in setRotation(0..3).
Touch reageert nietVier pin-namen (XP/YP/XM/YM) kloppen nog niet — draai TouchScreen_Calibr_native.
Touch zit ernaast / gespiegeldKalibratiegetallen bijstellen of de twee getallen in map() omdraaien.
Beeld flikkert bij aanrakenDe twee pinMode(..., OUTPUT)-regels na getPoint() ontbreken.

Waar nu heen?

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.

← Project 05  ·  Alle projecten