#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>
// Asignación de pines PCB Módulo D
#define TFT_CS 1
#define TFT_RST 2
#define TFT_CLK 40
#define TFT_MOSI 41
#define TFT_DC 42
#define TOUCH_IRQ 4
#define TOUCH_DO 5
#define TOUCH_DIN 6
#define TOUCH_CS 7
#define TOUCH_CLK 15
// Inicialización de hardware
Adafruit_ILI9341 pantalla = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, -1);
XPT2046_Touchscreen ts(TOUCH_CS, TOUCH_IRQ);
// Dimensiones de pantalla (Orientación 0: Vertical)
#define ANCHO_PANTALLA 240
#define ALTO_PANTALLA 320
// Rangos de calibración analógica del panel táctil (XPT2046)
#define TS_MINX 200
#define TS_MAXX 3800
#define TS_MINY 200
#define TS_MAXY 3800
void dibujaGuiasOrigen() {
pantalla.fillScreen(ILI9341_BLACK);
// Marca y etiqueta del ORIGEN (0,0) - Esquina superior izquierda
pantalla.fillCircle(0, 0, 10, ILI9341_RED);
pantalla.drawFastHLine(0, 0, 30, ILI9341_YELLOW);
pantalla.drawFastVLine(0, 0, 30, ILI9341_YELLOW);
pantalla.setCursor(15, 15);
pantalla.setTextColor(ILI9341_YELLOW);
pantalla.setTextSize(2);
pantalla.print("(0,0) ORIGEN");
// Guías visuales en las demás esquinas
// Esquina superior derecha (239, 0)
pantalla.drawFastHLine(ANCHO_PANTALLA - 20, 0, 20, ILI9341_CYAN);
pantalla.drawFastVLine(ANCHO_PANTALLA - 1, 0, 20, ILI9341_CYAN);
pantalla.setCursor(140, 15);
pantalla.setTextSize(1);
pantalla.setTextColor(ILI9341_CYAN);
pantalla.print("(239,0)");
// Esquina inferior izquierda (0, 319)
pantalla.drawFastHLine(0, ALTO_PANTALLA - 1, 20, ILI9341_CYAN);
pantalla.drawFastVLine(0, ALTO_PANTALLA - 20, 20, ILI9341_CYAN);
pantalla.setCursor(5, ALTO_PANTALLA - 20);
pantalla.print("(0,319)");
// Esquina inferior derecha (239, 319)
pantalla.drawFastHLine(ANCHO_PANTALLA - 20, ALTO_PANTALLA - 1, 20, ILI9341_CYAN);
pantalla.drawFastVLine(ANCHO_PANTALLA - 1, ALTO_PANTALLA - 20, 20, ILI9341_CYAN);
pantalla.setCursor(180, ALTO_PANTALLA - 20);
pantalla.print("(239,319)");
// Cuadro informativo al centro
pantalla.setCursor(20, 140);
pantalla.setTextColor(ILI9341_WHITE);
pantalla.setTextSize(2);
pantalla.print("Presiona para");
pantalla.setCursor(20, 165);
pantalla.print("obtener (X, Y)");
}
void setup() {
Serial.begin(115200);
// Pulso de reseteo físico para la pantalla
pinMode(TFT_RST, OUTPUT);
digitalWrite(TFT_RST, LOW);
delay(100);
digitalWrite(TFT_RST, HIGH);
delay(100);
// Inicializar bus SPI para el táctil
SPI.begin(TOUCH_CLK, TOUCH_DO, TOUCH_DIN, TOUCH_CS);
ts.begin();
ts.setRotation(0);
// Inicializar pantalla
pantalla.begin();
pantalla.setRotation(0);
dibujaGuiasOrigen();
}
void loop() {
if (ts.touched()) {
TS_Point p = ts.getPoint();
// Mapeo de valores brutos del ADC a los píxeles reales
int x_pixel = map(p.x, TS_MINX, TS_MAXX, 0, ANCHO_PANTALLA);
int y_pixel = map(p.y, TS_MINY, TS_MAXY, 0, ALTO_PANTALLA);
// Limitar valores dentro de los bordes físicos de la pantalla
x_pixel = constrain(x_pixel, 0, ANCHO_PANTALLA - 1);
y_pixel = constrain(y_pixel, 0, ALTO_PANTALLA - 1);
// Imprimir datos en el Serial Monitor
Serial.println("----------------------------------------");
Serial.printf("RAW -> X: %d | Y: %d | Presion: %d\n", p.x, p.y, p.z);
Serial.printf("PIXEL -> X: %d px | Y: %d px\n", x_pixel, y_pixel);
// Feedback visual: Dibuja un punto rojo donde tocaste
pantalla.fillCircle(x_pixel, y_pixel, 3, ILI9341_RED);
delay(150); // Anti-rebote para evitar lecturas duplicadas
}
}