#include <TFT_eSPI.h> // Incluye la librería para la pantalla ILI9341
#include <XPT2046_Touchscreen.h> // Incluye la librería para el controlador táctil XPT2046
// Define los pines de la pantalla ILI9341
#define TFT_CS 15
#define TFT_DC 2
#define TFT_RST 4 // Puedes usar -1 si no tienes pin de reset
#define TFT_MOSI 23
#define TFT_SCLK 18
// Define los pines del controlador táctil XPT2046
#define TOUCH_CS 33 // Chip Select para el Touch
#define TOUCH_IRQ 32 // Pin de interrupción (opcional, puede mejorar la respuesta táctil)
TFT_eSPI tft = TFT_eSPI(); // Instancia para la pantalla
XPT2046_Touchscreen ts(TOUCH_CS, TOUCH_IRQ); // Instancia para el control táctil
// Variables para almacenar las coordenadas táctiles
uint16_t x, y;
bool touched;
void setup() {
Serial.begin(115200);
Serial.println("Inicializando pantalla ILI9341 con funcionalidad táctil...");
// Inicializa la pantalla TFT
tft.init();
tft.setRotation(0);
tft.fillScreen(TFT_BLACK);
// Inicializa el controlador táctil
ts.begin();
// Calibra el controlador táctil (esto es crucial para la precisión)
ts.setRotation(0);
// Imprime instrucciones en la pantalla
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.setTextSize(2);
tft.setCursor(0, 20);
tft.println("Toque la pantalla");
tft.setTextSize(1);
tft.println("para ver las coordenadas.");
}
void loop() {
// Obtiene las coordenadas táctiles
touched = ts.touched(); // Verifica si se ha tocado la pantalla
if (touched) {
if (ts.getTouch(&x, &y)) { // Intenta obtener las coordenadas si se ha tocado
// Mapea las coordenadas del controlador táctil a las coordenadas de la pantalla
// Esto es necesario porque el sistema de coordenadas del controlador táctil
// puede no coincidir directamente con el de la pantalla.
x = map(x, 0, 4095, tft.width(), 0); // Ajusta los valores 4095 según tu pantalla
y = map(y, 0, 4095, 0, tft.height()); // Ajusta los valores 4095 según tu pantalla
// Imprime las coordenadas en el monitor serial
Serial.print("X = ");
Serial.print(x);
Serial.print(", Y = ");
Serial.println(y);
// Dibuja un pequeño círculo en el punto tocado
tft.fillCircle(x, y, 5, TFT_RED); // Dibuja un círculo rojo de radio 5
delay(100); // Pequeña pausa para evitar múltiples detecciones del mismo toque
tft.fillCircle(x, y, 5, TFT_BLACK); // Borra el círculo después de un corto tiempo
}
}
delay(100);
}