/**
ESP32s3 adaptation by Tyeth Gundry of Arduino version of
First demo for FT6206 Capactive Touch Screen on Wokwi. Enjoy!
https://wokwi.com/arduino/projects/311598148845830720
*/
/***************************************************
This is our touchscreen painting example for the Adafruit ILI9341
captouch shield
----> http://www.adafruit.com/products/1947
Check out the links above for our tutorials and wiring diagrams
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <SPI.h> // this is needed for display
#include <Adafruit_ILI9341.h>
#include <Arduino.h> // this is needed for FT6206
#include <Adafruit_FT6206.h>
#include <SdFat.h> // SD card & FAT filesystem library
#include <Adafruit_ImageReader.h> // Image-reading functions
// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206();
Adafruit_Image img; // An image loaded into RAM
ImageReturnCode stat; // Status from image-reading functions
// Comment out the next line to load from images.h (TBD) file:
#define USE_SD_CARD
// // The display also uses hardware SPI, plus #9 & #10
// #define TFT_CS 10
// #define TFT_DC 9
#define TFT_DC 9
#define TFT_CS 10
#define SD_CS 4 // SD card select pin
//#define TFT_RST 9 // TFT reset pin
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
Adafruit_GFX_Button btn[12];
// Size of the color selection boxes and the paintbrush size
#define BOXSIZE 40
#define NUMBER_SIZE 24
#define NUMBERS_PANEL_X 0
#define NUMBERS_PANEL_Y 250
#define COLOUR_BLIND_BUTTON_W 62
#define COLOUR_BLIND_BUTTON_H 24
#define COLOUR_BLIND_BUTTONS_START_POS 15
#define COLOUR_BLIND_BUTTON_SEP 17
#define COLOUR_BLIND_CLEAR_X (COLOUR_BLIND_BUTTONS_START_POS)
#define COLOUR_BLIND_NO_NUMBER_X (COLOUR_BLIND_CLEAR_X + COLOUR_BLIND_BUTTON_W + COLOUR_BLIND_BUTTON_SEP)
#define COLOUR_BLIND_CONFIRM_X (COLOUR_BLIND_NO_NUMBER_X + COLOUR_BLIND_BUTTON_W + COLOUR_BLIND_BUTTON_SEP)
#define COLOUR_BLIND_BUTTONS_Y (NUMBERS_PANEL_Y + (NUMBER_SIZE * 1.5))
#define COLOUR_BLIND_CLEAR_BTN_TEXT "Clear"
#define COLOUR_BLIND_NO_NUM_BTN_TEXT "No Number"
#define COLOUR_BLIND_CONFIRM_BTN_TEXT "Confirm"
#define COLOUR_BLIND_BUTTONS_TEXT_CLR_X 15
#define COLOUR_BLIND_BUTTONS_TEXT_NO_X 5
#define COLOUR_BLIND_BUTTONS_TEXT_CONF_X 6
#define COLOUR_BLIND_BUTTONS_TEXT_Y 7
#define COLOUR_BLIND_NUM_WIN_X (NUMBERS_PANEL_X + 100)
#define COLOUR_BLIND_NUM_WIN_FILL_X (COLOUR_BLIND_NUM_WIN_X + 2)
#define COLOUR_BLIND_NUM_WIN_Y (NUMBERS_PANEL_Y - 30)
#define COLOUR_BLIND_NUM_WIN_FILL_Y (COLOUR_BLIND_NUM_WIN_Y + 2)
#define COLOUR_BLIND_NUM_WIN_W (NUMBER_SIZE * 2)
#define COLOUR_BLIND_NUM_WIN_FILL_W (COLOUR_BLIND_NUM_WIN_W - 4)
#define COLOUR_BLIND_NUM_WIN_H (NUMBER_SIZE)
#define COLOUR_BLIND_NUM_WIN_FILL_H (NUMBER_SIZE - 3)
#define COLOUR_BLINDNESS_SELECT_DIGIT_X COLOUR_BLIND_NUM_WIN_FILL_X
#define COLOUR_BLINDNESS_SELECT_DIGIT_Y COLOUR_BLIND_NUM_WIN_FILL_Y
#define COLOUR_BLINDNESS_SELECT_DIGIT_FONT 2
#define COLOUR_BLINDNESS_SELECT_MAX_DIGITS 2
#define PENRADIUS 3
int oldcolor, currentcolor;
int colour_blindness_digit_count = 0;
char colour_blindness_select_digits[COLOUR_BLINDNESS_SELECT_MAX_DIGITS + 1]; // Allow for null string terminator
bool number_clicked = false;
bool no_number_selected = false;
bool no_number_clicked = false;
void setup(void) {
//while (!Serial); // used for leonardo debugging
Serial.begin(115200);
Serial.println(F("Cap Touch Paint!"));
// Default pins A4/A5 (or SADA/SCL) used as Wire.setPins not supported for Nano
//Wire.setPins(10, 8); // redefine first I2C port to be on pins 10/8
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");
int screen_width = tft.width();
int screen_height = tft.height();
tft.fillScreen(ILI9341_WHITE);
// make the color selection boxes
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
drawColourBlindDashboard();
btn[1].initButton(&tft, 40, 100, 20, 20, 0xFFFF, 0xF0F0, 0x0000, "1", 2);
btn[1].drawButton();
// select the current color 'red'
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
currentcolor = ILI9341_RED;
}
void loop() {
delay(3);
// Wait for a touch
if (! ctp.touched()) {
number_clicked = false;
return;
}
// Retrieve a point
TS_Point p = ctp.getPoint();
// Print out raw data from screen touch controller
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print(" -> ");
// 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 remapped (rotated) coordinates
Serial.print("("); Serial.print(p.x);
Serial.print(", "); Serial.print(p.y);
Serial.println(")");
loop_original(p);
colourBlindDashboard_loop(p);
}
void loop_original(TS_Point p) {
if (p.y < BOXSIZE) {
oldcolor = currentcolor;
if (p.x < BOXSIZE) {
currentcolor = ILI9341_RED;
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
} else if (p.x < BOXSIZE*2) {
currentcolor = ILI9341_YELLOW;
tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
} else if (p.x < BOXSIZE*3) {
currentcolor = ILI9341_GREEN;
tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
} else if (p.x < BOXSIZE*4) {
currentcolor = ILI9341_CYAN;
tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
} else if (p.x < BOXSIZE*5) {
currentcolor = ILI9341_BLUE;
tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
} else if (p.x <= BOXSIZE*6) {
currentcolor = ILI9341_MAGENTA;
tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE);
}
if (oldcolor != currentcolor) {
if (oldcolor == ILI9341_RED)
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED);
if (oldcolor == ILI9341_YELLOW)
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW);
if (oldcolor == ILI9341_GREEN)
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN);
if (oldcolor == ILI9341_CYAN)
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN);
if (oldcolor == ILI9341_BLUE)
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE);
if (oldcolor == ILI9341_MAGENTA)
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA);
}
}
if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) {
tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
}
}
void colourBlindDashboard_loop(TS_Point p) {
//delay(3);
// Wait for a touch
//if (! ctp.touched()) {
// number_clicked = false;
// return;
//}
// Retrieve a point
//TS_Point p = ctp.getPoint();
// flip it around to match the screen.
//TS_Point p_old;
//p_old.x = p.x;
//p_old.y = p.y;
//p.x = map(p.x, 0, 240, 240, 0);
//p.y = map(p.y, 0, 320, 320, 0);
//if ( touchscreen.bufferSize() ) {
// p = touchscreen.getPoint();
//} else {
// p.y = p.y = p.z = -1;
//}
// Print out raw data from screen touch controller
//Serial.print("X = "); Serial.print(p.x);
//Serial.print("\tY = "); Serial.print(p.y);
//Serial.print(" -> ");
// Print out the remapped (rotated) coordinates
//Serial.print("("); Serial.print(p.x);
//Serial.print(", "); Serial.print(p.y);
//Serial.println(")");
if ((p.y > NUMBERS_PANEL_Y) && (p.y < (NUMBERS_PANEL_Y + NUMBER_SIZE)) && no_number_selected == false) {
if ( number_clicked == false) {
for (int i = 0; i < 10; i++){
if (
(p.x > (NUMBERS_PANEL_X + NUMBER_SIZE * i)) &&
(p.x < ((NUMBERS_PANEL_X + ((NUMBER_SIZE * i) + NUMBER_SIZE))) )) {
if (colour_blindness_digit_count < COLOUR_BLINDNESS_SELECT_MAX_DIGITS ){
colour_blindness_select_digits[colour_blindness_digit_count] = i + '0';
colour_blindness_digit_count++;
colour_blindness_select_digits[colour_blindness_digit_count] = 0;
}
else
{
Serial.println("click ignored as we already have enough digits");
}
number_clicked = true;
Serial.print("Number "); Serial.print(i); Serial.println(" clicked");
}
}
}
}
else
{
number_clicked = false;
}
if ( p.x > COLOUR_BLIND_CLEAR_X &&
p.x < (COLOUR_BLIND_CLEAR_X + COLOUR_BLIND_BUTTON_W) &&
p.y > COLOUR_BLIND_BUTTONS_Y &&
p.y < (COLOUR_BLIND_BUTTONS_Y + COLOUR_BLIND_BUTTON_H)){
tft.fillRect(COLOUR_BLIND_NUM_WIN_FILL_X, COLOUR_BLIND_NUM_WIN_FILL_Y, COLOUR_BLIND_NUM_WIN_FILL_W,
COLOUR_BLIND_NUM_WIN_FILL_H, ILI9341_BLACK);
colour_blindness_digit_count= 0;
}
if ( p.x > COLOUR_BLIND_NO_NUMBER_X &&
p.x < (COLOUR_BLIND_NO_NUMBER_X + COLOUR_BLIND_BUTTON_W) &&
p.y > COLOUR_BLIND_BUTTONS_Y &&
p.y < (COLOUR_BLIND_BUTTONS_Y + COLOUR_BLIND_BUTTON_H) &&
no_number_clicked == false){
if ( no_number_selected == false ) {
tft.fillRect(COLOUR_BLIND_NUM_WIN_FILL_X, COLOUR_BLIND_NUM_WIN_FILL_Y, COLOUR_BLIND_NUM_WIN_FILL_W,
COLOUR_BLIND_NUM_WIN_FILL_H, ILI9341_BLACK);
colour_blindness_digit_count= 0;
tft.setTextSize(1);
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.fillRect(COLOUR_BLIND_NO_NUMBER_X, COLOUR_BLIND_BUTTONS_Y, COLOUR_BLIND_BUTTON_W,
COLOUR_BLIND_BUTTON_H, ILI9341_BLACK);
tft.drawRect(COLOUR_BLIND_NO_NUMBER_X, COLOUR_BLIND_BUTTONS_Y, COLOUR_BLIND_BUTTON_W,
NUMBER_SIZE, ILI9341_WHITE);
tft.setCursor(COLOUR_BLIND_NO_NUMBER_X + COLOUR_BLIND_BUTTONS_TEXT_NO_X, COLOUR_BLIND_BUTTONS_Y + COLOUR_BLIND_BUTTONS_TEXT_Y);
tft.println(COLOUR_BLIND_NO_NUM_BTN_TEXT);
tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
no_number_selected = true;
no_number_clicked = true;
}
else{
tft.setTextSize(1);
tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
tft.fillRect(COLOUR_BLIND_NO_NUMBER_X, COLOUR_BLIND_BUTTONS_Y, COLOUR_BLIND_BUTTON_W,
COLOUR_BLIND_BUTTON_H, ILI9341_WHITE);
tft.drawRect(COLOUR_BLIND_NO_NUMBER_X, COLOUR_BLIND_BUTTONS_Y, COLOUR_BLIND_BUTTON_W,
NUMBER_SIZE, ILI9341_BLACK);
tft.setCursor(COLOUR_BLIND_NO_NUMBER_X + COLOUR_BLIND_BUTTONS_TEXT_NO_X, COLOUR_BLIND_BUTTONS_Y + COLOUR_BLIND_BUTTONS_TEXT_Y);
tft.println(COLOUR_BLIND_NO_NUM_BTN_TEXT);
no_number_selected = false;
}
}
else
{
no_number_clicked = false;
}
if (colour_blindness_digit_count > 0){
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setCursor(COLOUR_BLINDNESS_SELECT_DIGIT_X + 1, COLOUR_BLINDNESS_SELECT_DIGIT_Y + 1);
tft.println(colour_blindness_select_digits);
}
else{
tft.fillRect(COLOUR_BLIND_NUM_WIN_FILL_X, COLOUR_BLIND_NUM_WIN_FILL_Y, COLOUR_BLIND_NUM_WIN_FILL_W,
COLOUR_BLIND_NUM_WIN_FILL_H, ILI9341_BLACK);
}
}
void drawColourBlindDashboard() {
tft.setTextColor(ILI9341_BLACK, ILI9341_WHITE);
tft.setTextSize(2);
tft.drawRect(COLOUR_BLIND_NUM_WIN_X, COLOUR_BLIND_NUM_WIN_Y, COLOUR_BLIND_NUM_WIN_W,
COLOUR_BLIND_NUM_WIN_H, ILI9341_RED);
tft.fillRect(COLOUR_BLIND_NUM_WIN_FILL_X, COLOUR_BLIND_NUM_WIN_FILL_Y, COLOUR_BLIND_NUM_WIN_FILL_W,
COLOUR_BLIND_NUM_WIN_FILL_H, ILI9341_BLACK);
for (int i = 0; i < 10; i++){
tft.drawRect(NUMBERS_PANEL_X + NUMBER_SIZE * i, NUMBERS_PANEL_Y, NUMBER_SIZE,
NUMBER_SIZE, ILI9341_BLACK);
tft.setCursor(NUMBERS_PANEL_X + NUMBER_SIZE * i + 5, NUMBERS_PANEL_Y + 5);
tft.println(i);
}
tft.setTextSize(1);
tft.drawRect(COLOUR_BLIND_CLEAR_X, COLOUR_BLIND_BUTTONS_Y, COLOUR_BLIND_BUTTON_W,
NUMBER_SIZE, ILI9341_BLACK);
tft.setCursor(COLOUR_BLIND_CLEAR_X + COLOUR_BLIND_BUTTONS_TEXT_CLR_X, COLOUR_BLIND_BUTTONS_Y + COLOUR_BLIND_BUTTONS_TEXT_Y);
tft.println(COLOUR_BLIND_CLEAR_BTN_TEXT);
tft.drawRect(COLOUR_BLIND_NO_NUMBER_X, COLOUR_BLIND_BUTTONS_Y, COLOUR_BLIND_BUTTON_W,
NUMBER_SIZE, ILI9341_BLACK);
tft.setCursor(COLOUR_BLIND_NO_NUMBER_X + COLOUR_BLIND_BUTTONS_TEXT_NO_X, COLOUR_BLIND_BUTTONS_Y + COLOUR_BLIND_BUTTONS_TEXT_Y);
tft.println(COLOUR_BLIND_NO_NUM_BTN_TEXT);
tft.drawRect(COLOUR_BLIND_CONFIRM_X, COLOUR_BLIND_BUTTONS_Y, COLOUR_BLIND_BUTTON_W,
NUMBER_SIZE, ILI9341_BLACK);
tft.setCursor(COLOUR_BLIND_CONFIRM_X + COLOUR_BLIND_BUTTONS_TEXT_CONF_X, COLOUR_BLIND_BUTTONS_Y + COLOUR_BLIND_BUTTONS_TEXT_Y);
tft.println(COLOUR_BLIND_CONFIRM_BTN_TEXT);
}
////////////////////////////////////////////////////////////////////////////////////
// /*
// ESP32-S3 + ILI9341 TFT LCD Example
// https://wokwi.com/projects/343784047735997012
// */
// #include "SPI.h"
// #include "Adafruit_GFX.h"
// #include "Adafruit_ILI9341.h"
// #define TFT_DC 2
// #define TFT_CS 15
// Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// void setup() {
// Serial.begin(115200);
// Serial.println("Welcome to Wokwi, ESP32-S3");
// Wire.begin(10,8);
// tft.begin();
// tft.setCursor(44, 120);
// tft.setTextColor(ILI9341_RED);
// tft.setTextSize(3);
// tft.println("ESP32-S3");
// }
// const uint32_t colors[] = {
// ILI9341_GREEN,
// ILI9341_CYAN,
// ILI9341_MAGENTA,
// ILI9341_YELLOW,
// };
// uint8_t colorIndex = 0;
// void loop() {
// tft.setTextSize(2);
// tft.setCursor(26, 164);
// tft.setTextColor(colors[colorIndex++ % 4]);
// tft.println("Welcome to Wokwi!");
// delay(250);
// }Loading
ili9341-cap-touch
ili9341-cap-touch