/********************************************************************
Este ejemplo pinta en la pantalla el pixel tocado.
Se ha modificado levemente, ya que dibuja el pixel y además todo el cuadrado
que lo rodea , para que se vea mejor.
*********************************************************************/
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <Adafruit_ILI9341.h>
#include <Arduino.h>
#include <Adafruit_FT6206.h>
// Identificador controlador táctil capacitivo
#define I2C_cap_SDA 10
#define I2C_cap_SCL 8
Adafruit_FT6206 ctp = Adafruit_FT6206();
// Identificador controlador Display SPI
#define TFT_DC 2
#define TFT_CS 15
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// Variables de tipo TS_Point para almacenar los píxeles tocados en la pantalla
TS_Point p_current;
TS_Point p_prev;
// Botones
#define Button 17
volatile bool clearScreen;
void IRAM_ATTR ISR_B (void) {
clearScreen = true;
}
void DrawBigPixel(const TS_Point point, const uint16_t color) {
tft.drawPixel(point.x, point.y, color);
tft.drawPixel(point.x - 1, point.y + 1, color);
tft.drawPixel(point.x, point.y + 1, color);
tft.drawPixel(point.x + 1, point.y + 1, color);
tft.drawPixel(point.x - 1, point.y, color);
tft.drawPixel(point.x + 1, point.y, color);
tft.drawPixel(point.x - 1, point.y - 1, color);
tft.drawPixel(point.x, point.y - 1, color);
tft.drawPixel(point.x + 1, point.y - 1, color);
}
void setup()
{
// Inicializar puerto serie
Serial.begin(115200);
Serial.println("Pintar con la pantalla capacitiva");
// Inicializar display
Wire.setPins(I2C_cap_SDA, I2C_cap_SCL);
tft.begin();
// Inicializar sensor capacitivo
if (!ctp.begin(1))
{
Serial.println("No se pudo inicializar el controlador FT6206");
while (true)
;
}
Serial.println("Capacitive touchscreen started");
// Rellenar el fondo de la pantalla en blanco
tft.fillScreen(ILI9341_WHITE);
// Giro la pantalla para que la distribución del display y el sensor capacitivo sean iguales
tft.setRotation(2);
// Botón
pinMode(Button, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(Button), &ISR_B, FALLING);
clearScreen = false;
}
void loop()
{
// Si se ha tocado la pantalla
if (ctp.touched())
{
p_current = ctp.getPoint(); // Guardo el pixel que se ha tocado
if (p_current != p_prev) // Si no es el mismo que se ha tocado previamente
{
DrawBigPixel(p_current, ILI9341_RED); // Dibujo el punto y su alrededor en rojo
Serial.printf("x:%d, y:%d \r\n", p_current.x, p_current.y); // Escribo por el puerto serie el pixel presionado
}
p_prev = p_current; // Actualizo el píxel actual
}
if (clearScreen) {
clearScreen = false;
tft.fillScreen(ILI9341_WHITE);
}
delay(10);
}