#include <TFT_eSPI.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_FT6206.h>
#include <ESP32Servo.h>
Adafruit_FT6206 ctp = Adafruit_FT6206();
TFT_eSPI tft = TFT_eSPI();
#define TFT_CS 15
#define TFT_DC 2
#define TFT_MOSI 23
#define TFT_SCLK 18
#define LED_TEXT_X 20
#define LED_TEXT_Y 20
#define ON_BUTTON_X 20
#define ON_BUTTON_Y 60
#define ON_BUTTON_W 80
#define ON_BUTTON_H 40
#define OFF_BUTTON_X 120
#define OFF_BUTTON_Y 60
#define OFF_BUTTON_W 80
#define OFF_BUTTON_H 40
#define LED_SLIDER_X 20
#define LED_SLIDER_Y 120
#define LED_SLIDER_W 200
#define LED_SLIDER_H 10
#define LED_SLIDER_THUMB_RADIUS 10
#define SERVO_TEXT_X 20
#define SERVO_TEXT_Y 160
#define SERVO_SLIDER_X 20
#define SERVO_SLIDER_Y 180
#define SERVO_SLIDER_W 200
#define SERVO_SLIDER_H 10
#define SERVO_SLIDER_THUMB_RADIUS 10
#define LED_PIN 12 // LED controlled by ON/OFF buttons
#define BLINK_LED_PIN 13 // LED to blink based on slider position
#define SERVO_PIN 14 // Servo control pin
bool ledOn = false;
int ledBlinkDelay = 500; // Initial blink delay (milliseconds)
int servoSliderPosition = SERVO_SLIDER_X;
unsigned long previousMillis = 0;
bool ledState = false;
Servo servo;
void drawLEDText() {
tft.setCursor(LED_TEXT_X, LED_TEXT_Y);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("LED Blink");
}
void drawOnButton() {
tft.fillRect(ON_BUTTON_X, ON_BUTTON_Y, ON_BUTTON_W, ON_BUTTON_H, ledOn ? ILI9341_GREEN : ILI9341_WHITE);
tft.drawRect(ON_BUTTON_X, ON_BUTTON_Y, ON_BUTTON_W, ON_BUTTON_H, ILI9341_BLUE);
tft.setCursor(ON_BUTTON_X + 10, ON_BUTTON_Y + 10);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.println("ON");
}
void drawOffButton() {
tft.fillRect(OFF_BUTTON_X, OFF_BUTTON_Y, OFF_BUTTON_W, OFF_BUTTON_H, ledOn ? ILI9341_WHITE : ILI9341_RED);
tft.drawRect(OFF_BUTTON_X, OFF_BUTTON_Y, OFF_BUTTON_W, OFF_BUTTON_H, ILI9341_BLUE);
tft.setCursor(OFF_BUTTON_X + 10, OFF_BUTTON_Y + 10);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.println("OFF");
}
void drawLEDSlider() {
tft.fillRoundRect(LED_SLIDER_X, LED_SLIDER_Y, LED_SLIDER_W, LED_SLIDER_H, LED_SLIDER_H / 2, ILI9341_WHITE);
tft.fillCircle(map(ledBlinkDelay, 50, 1000, LED_SLIDER_X + LED_SLIDER_THUMB_RADIUS, LED_SLIDER_X + LED_SLIDER_W - LED_SLIDER_THUMB_RADIUS), LED_SLIDER_Y + LED_SLIDER_H / 2, LED_SLIDER_THUMB_RADIUS, ILI9341_BLUE);
}
void drawServoText() {
tft.setCursor(SERVO_TEXT_X, SERVO_TEXT_Y);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("Servo");
}
void drawServoSlider() {
tft.fillRoundRect(SERVO_SLIDER_X, SERVO_SLIDER_Y, SERVO_SLIDER_W, SERVO_SLIDER_H, SERVO_SLIDER_H / 2, ILI9341_WHITE);
tft.fillCircle(servoSliderPosition, SERVO_SLIDER_Y + SERVO_SLIDER_H / 2, SERVO_SLIDER_THUMB_RADIUS, ILI9341_BLUE);
}
bool isTouchingOnButton(int16_t x, int16_t y) {
return (x >= ON_BUTTON_X && x <= ON_BUTTON_X + ON_BUTTON_W) && (y >= ON_BUTTON_Y && y <= ON_BUTTON_Y + ON_BUTTON_H);
}
bool isTouchingOffButton(int16_t x, int16_t y) {
return (x >= OFF_BUTTON_X && x <= OFF_BUTTON_X + OFF_BUTTON_W) && (y >= OFF_BUTTON_Y && y <= OFF_BUTTON_Y + OFF_BUTTON_H);
}
bool isTouchingLEDSlider(int16_t x, int16_t y) {
return (x >= LED_SLIDER_X && x <= LED_SLIDER_X + LED_SLIDER_W) &&
(y >= LED_SLIDER_Y && y <= LED_SLIDER_Y + LED_SLIDER_H);
}
bool isTouchingServoSlider(int16_t x, int16_t y) {
return (x >= servoSliderPosition - SERVO_SLIDER_THUMB_RADIUS && x <= servoSliderPosition + SERVO_SLIDER_THUMB_RADIUS) &&
(y >= SERVO_SLIDER_Y && y <= SERVO_SLIDER_Y + SERVO_SLIDER_H);
}
void setup(void) {
Serial.begin(115200);
Serial.println(F("Cap Touch Screen"));
pinMode(LED_PIN, OUTPUT);
pinMode(BLINK_LED_PIN, OUTPUT);
servo.attach(SERVO_PIN);
tft.begin();
if (!ctp.begin(40)) {
Serial.println("Couldn't start FT6206 touchscreen controller");
while (1);
}
tft.fillScreen(ILI9341_BLACK);
tft.setRotation(3);
drawLEDText();
drawOnButton();
drawOffButton();
drawLEDSlider();
drawServoText();
drawServoSlider();
}
void loop() {
if (!ctp.touched()) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= ledBlinkDelay) {
previousMillis = currentMillis;
ledState = !ledState;
digitalWrite(BLINK_LED_PIN, ledState ? HIGH : LOW);
}
servo.write(map(servoSliderPosition, SERVO_SLIDER_X, SERVO_SLIDER_X + SERVO_SLIDER_W, 0, 180));
delay(10);
return;
}
TS_Point p = ctp.getPoint();
p.x = map(p.x, 0, 240, 240, 0);
p.y = map(p.y, 0, 320, 320, 0);
if (ctp.touched()) {
int y = tft.height() - p.x;
int x = p.y;
Serial.print("Touch X: ");
Serial.print(x);
Serial.print(", Y: ");
Serial.println(y);
if (isTouchingOnButton(x, y)) {
ledOn = true;
digitalWrite(LED_PIN, HIGH);
drawOnButton();
drawOffButton();
}
if (isTouchingOffButton(x, y)) {
ledOn = false;
digitalWrite(LED_PIN, LOW);
drawOnButton();
drawOffButton();
}
if (isTouchingLEDSlider(x, y)) {
ledBlinkDelay = map(x, LED_SLIDER_X, LED_SLIDER_X + LED_SLIDER_W, 50, 1000);
drawLEDSlider();
}
if (isTouchingServoSlider(x, y)) {
servoSliderPosition = constrain(x, SERVO_SLIDER_X, SERVO_SLIDER_X + SERVO_SLIDER_W);
drawServoSlider();
}
}
}