Created
May 29, 2020 08:12
-
-
Save vixtory09678/68e59ca216f5b74824436cdfc2e5cba8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*************************************************** | |
This is our touchscreen painting example for the Adafruit ILI9341 Breakout | |
----> http://www.adafruit.com/products/1770 | |
Check out the links above for our tutorials and wiring diagrams | |
These displays use SPI to communicate, 4 or 5 pins are required to | |
interface (RST is optional) | |
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 | |
****************************************************/ | |
/** NOT FOR USE WITH THE TOUCH SHIELD, ONLY FOR THE BREAKOUT! **/ | |
#include <Wire.h> | |
#include <Adafruit_GFX.h> // Core graphics library | |
#include <SPI.h> | |
#include <Adafruit_ILI9341.h> | |
#include <XPT2046_Touchscreen.h> | |
// This is calibration data for the raw touch data to the screen coordinates | |
#define TS_MINX 350 | |
#define TS_MINY 200 | |
#define TS_MAXX 3920 | |
#define TS_MAXY 3870 | |
#define MINPRESSURE 500 | |
#define MAXPRESSURE 3000 | |
// The display uses hardware SPI, plus #9 & #10 | |
#define TFT_CS 13 | |
#define TFT_DC 12 | |
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); | |
// For better pressure precision, we need to know the resistance | |
// between X+ and X- Use any multimeter to read it | |
// For the one we're using, its 300 ohms across the X plate | |
XPT2046_Touchscreen ts(27, 33); | |
// Size of the color selection boxes and the paintbrush size | |
#define BOXSIZE 40 | |
#define PENRADIUS 3 | |
int oldcolor, currentcolor; | |
void setup(void) { | |
// while (!Serial); // used for leonardo debugging | |
Serial.begin(9600); | |
Serial.println(F("Touch Paint!")); | |
ts.begin(); | |
tft.begin(); | |
tft.setRotation(3); | |
tft.fillScreen(ILI9341_BLACK); | |
// 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); | |
// select the current color 'red' | |
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); | |
currentcolor = ILI9341_RED; | |
} | |
void loop() | |
{ | |
// Retrieve a point | |
TS_Point p = ts.getPoint(); | |
// Serial.print("X = "); Serial.print(p.x); | |
// Serial.print("\tY = "); Serial.print(p.y); | |
// Serial.print("\tPressure = "); Serial.println(p.z); | |
// we have some minimum pressure we consider 'valid' | |
// pressure of 0 means no pressing! | |
if (p.z < MINPRESSURE || p.z > MAXPRESSURE) { | |
return; | |
} | |
// Scale from ~0->1000 to tft.width using the calibration #'s | |
p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); | |
p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); | |
Serial.print("("); Serial.print(p.x); | |
Serial.print(", "); Serial.print(p.y); | |
Serial.println(")"); | |
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); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment