#include <Adafruit_GFX.h>    // Core graphics library
#include <SPI.h>             // this is needed for display
#include <Adafruit_ILI9341.h>
#include <Wire.h>            // this is needed for FT6206
#include <Adafruit_FT6206.h>
#include <Servo.h>           // Servo library

// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206();

// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 10
#define TFT_DC 9
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

Servo myservo;
int relayPin = 4;
int servoPin = 3;

// Size of the interface elements
#define SLIDER_WIDTH 200
#define SLIDER_HEIGHT 50
#define BUTTON_WIDTH 100
#define BUTTON_HEIGHT 50

void setup(void) {
  Serial.begin(115200);
  Serial.println(F("Cap Touch Control!"));
  
  tft.begin();

  if (!ctp.begin(40)) {  // pass in 'sensitivity' coefficient
    Serial.println("Couldn't start FT6206 touchscreen controller");
    while (1);
  }

  Serial.println("Capacitive touchscreen started");
  
  tft.fillScreen(ILI9341_BLACK);
  
  // Draw the interface
  drawInterface();
  
  // Set up Servo
  myservo.attach(servoPin);
  myservo.write(90); // start at middle position

  // Set up Relay
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW); // start with motor off
}

void loop() {
  // Wait for a touch
  if (!ctp.touched()) {
    return;
  }

  // Retrieve a point
  TS_Point p = ctp.getPoint();

  // flip it around to match the screen.
  p.x = map(p.x, 0, 240, 240, 0);
  p.y = map(p.y, 0, 320, 320, 0);

  // Print out the coordinates
  Serial.print("("); Serial.print(p.x);
  Serial.print(", "); Serial.print(p.y);
  Serial.println(")");

  // Check for slider touch
  if (p.y > 50 && p.y < 50 + SLIDER_HEIGHT) {
    int servoPos = map(p.x, 20, 20 + SLIDER_WIDTH, 0, 180);
    myservo.write(servoPos);
    tft.fillRect(20, 50, SLIDER_WIDTH, SLIDER_HEIGHT, ILI9341_WHITE); // Clear previous slider position
    tft.fillRect(servoPos + 20, 50, 10, SLIDER_HEIGHT, ILI9341_RED); // Draw new slider position
  }
  // Check for Motor ON button touch
  else if (p.y > 150 && p.y < 150 + BUTTON_HEIGHT) {
    if (p.x > 20 && p.x < 20 + BUTTON_WIDTH) {
      digitalWrite(relayPin, HIGH); // turn motor on
      tft.fillRect(20, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_GREEN); // highlight ON button
      tft.fillRect(150, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_WHITE); // clear OFF button
    }
    // Check for Motor OFF button touch
    else if (p.x > 150 && p.x < 150 + BUTTON_WIDTH) {
      digitalWrite(relayPin, LOW); // turn motor off
      tft.fillRect(20, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_WHITE); // clear ON button
      tft.fillRect(150, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_RED); // highlight OFF button
    }
  }
}

void drawInterface() {
  // Draw slider
  tft.fillRect(20, 50, SLIDER_WIDTH, SLIDER_HEIGHT, ILI9341_WHITE); // Slider background
  tft.fillRect(110, 50, 10, SLIDER_HEIGHT, ILI9341_RED); // Initial slider position

  // Draw Motor ON button
  tft.fillRect(20, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_WHITE); // Motor ON button background
  tft.drawRect(20, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_GREEN); // Motor ON button border
  tft.setCursor(45, 170);
  tft.setTextColor(ILI9341_BLACK);
  tft.setTextSize(2);
  tft.print("ON");

  // Draw Motor OFF button
  tft.fillRect(150, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_WHITE); // Motor OFF button background
  tft.drawRect(150, 150, BUTTON_WIDTH, BUTTON_HEIGHT, ILI9341_RED); // Motor OFF button border
  tft.setCursor(175, 170);
  tft.setTextColor(ILI9341_BLACK);
  tft.setTextSize(2);
  tft.print("OFF");
}
NOCOMNCVCCGNDINLED1PWRRelay Module