728x90
출처
- (배선) Interfacing Arduino with ILI9341 color TFT display - Simple Projects
- My Commentary and Technical help: 2.2 or 2.4 or 2.8 inch SPI TFT LCD ILI9341 to Arduino Uno
- GitHub - dgolda/UTouch: UTouch fork configured for 3.5" TFT LCD from mcufriend.com
- Arduino 2.4″ Touch Screen LCD Shield Tutorial - Arduino Project Hub
- 2.4 Touch Screen TFT LCD with SPI Interface, 240x320 [2.4-LCD-Module] - US $8.00 : HAOYU Electronics : Make Engineers Job Easier
Arduino : 2.4인치 터치 스크린 제어 ( ILI9341, UTouch )
스크린 핀연결
- RESET 7
- DC 9
- CS 10
- MOSI 11
- CLK 13
터치 핀연결
- CLK 6
- CS 5
- DIN 4
- DO 3
- IRQ 2
터치 테스트
#include <UTouch.h>
// Initialize touchscreen
#define PIN_CLK 6
#define PIN_CS 5
#define PIN_DIN 4
#define PIN_DO 3
#define PIN_IRQ 2
UTouch myTouch(PIN_CLK, PIN_CS, PIN_DIN, PIN_DO, PIN_IRQ);
void setup() {
Serial.begin(9600);
// put your setup code here, to run once:
myTouch.InitTouch();
myTouch.setPrecision(PREC_HI);
}
void loop() {
// put your main code here, to run repeatedly:
long x, y;
while (myTouch.dataAvailable() == true) {
myTouch.read();
x = myTouch.getX();
y = myTouch.getY();
if ((x!=-1) and (y!=-1)) {
Serial.print("X = "); Serial.print(x);
Serial.print("\tY = "); Serial.println(y);
}
}
}
텍스트 및 그래픽 함수 테스트
/*
TFT LCD - TFT Simple driving
modified on 21 Feb 2019
by Saeed Hosseini
https://electropeak.com/learn/
*/
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_RESET 7
#define TFT_DC 9
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_CLK 13
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define ORANGE 0xFD20
#define GREENYELLOW 0xAFE5
#define NAVY 0x000F
#define DARKGREEN 0x03E0
#define DARKCYAN 0x03EF
#define MAROON 0x7800
#define PURPLE 0x780F
#define OLIVE 0x7BE0
#define LIGHTGREY 0xC618
#define DARKGREY 0x7BEF
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RESET);
void setup() {
Serial.begin(9600);
Serial.println(F("TFT LCD test"));
#ifdef USE_ADAFRUIT_SHIELD_PINOUT
Serial.println(F("Using Adafruit 2.4\" TFT Arduino Shield Pinout"));
#else
Serial.println(F("Using Adafruit 2.4\" TFT Breakout Board Pinout"));
#endif
Serial.print("TFT size is ");
Serial.print(tft.width());
Serial.print("x");
Serial.println(tft.height());
tft.begin();
Serial.println(F("Benchmark Time (microseconds)"));
Serial.print(F("Screen fill "));
Serial.println(FillScreen());
delay(500);
tft.setTextColor(YELLOW);
tft.setCursor(70, 180);
tft.setTextSize(1);
tft.println("Electropeak");
delay(200);
tft.fillScreen(PURPLE);
tft.setCursor(50, 170);
tft.setTextSize(2);
tft.println("Electropeak");
delay(200);
tft.fillScreen(PURPLE);
tft.setCursor(20, 160);
tft.setTextSize(3);
tft.println("Electropeak");
delay(500);
tft.fillScreen(PURPLE);
for (int rotation = 0; rotation < 4; rotation++) {
tft.setRotation(rotation);
tft.setCursor(0, 0);
tft.setTextSize(3);
tft.println("Electropeak");
delay(700);
}
delay(500);
Serial.print(F("Rectangles (filled) "));
Serial.println(testFilledRects(YELLOW, MAGENTA)); delay(500);
}
void loop() {
}
unsigned long FillScreen() {
unsigned long start = micros();
tft.fillScreen(RED);
delay(500);
tft.fillScreen(GREEN);
delay(500);
tft.fillScreen(BLUE);
delay(500);
tft.fillScreen(WHITE);
delay(500);
tft.fillScreen(MAGENTA);
delay(500);
tft.fillScreen(PURPLE);
delay(500);
return micros() - start;
}
unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
unsigned long start, t = 0;
int n, i, i2, cx = tft.width() / 2 - 1, cy = tft.height() / 2 - 1;
tft.fillScreen(BLACK);
n = min(tft.width(), tft.height());
for (i = n; i > 0; i -= 6) {
i2 = i / 2;
start = micros();
tft.fillRect(cx - i2, cy - i2, i, i, color1);
t += micros() - start;
// Outlines are not included in timing results
tft.drawRect(cx - i2, cy - i2, i, i, color2);
}
return t;
}
터치스크린을 이용한 그림판
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <UTouch.h>
#define PIN_CLK 6
#define PIN_CS 5
#define PIN_DIN 4
#define PIN_DO 3
#define PIN_IRQ 2
#define TS_MINX 10
#define TS_MINY 0
#define TS_MAXX 380
#define TS_MAXY 239
UTouch ts(PIN_CLK, PIN_CS, PIN_DIN, PIN_DO, PIN_IRQ);
#define TFT_RESET 7
#define TFT_DC 9
#define TFT_CS 10
#define TFT_MOSI 11
#define TFT_CLK 13
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RESET);
#define BOXSIZE 40
#define PENRADIUS 3
int oldcolor, currentcolor;
void setup(void) {
Serial.begin(9600);
Serial.println(F("Paint!"));
ts.InitTouch(LANDSCAPE); // PORTRAIT, LANDSCAPE
ts.setPrecision(PREC_HI); // PREC_LOW, PREC_MEDIUM, PREC_HI, PREC_EXTREME
tft.begin();
tft.fillScreen(BLACK);
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, GREEN);
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, CYAN);
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, BLUE);
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, MAGENTA);
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
currentcolor = RED;
}
#define MINPRESSURE 10
#define MAXPRESSURE 1000
void loop() {
long px, py;
while (ts.dataAvailable() == true) {
ts.read();
px = ts.getX();
py = TS_MAXY - 10 - ts.getY();
if ((px!=-1) and (py!=-1)) {
Serial.print("X = "); Serial.print(px);
Serial.print("\tY = "); Serial.println(py);
}
if (py < (TS_MINY-5)) {
Serial.println("erase");
tft.fillRect(0, BOXSIZE, tft.width(), tft.height()-BOXSIZE, BLACK);
}
px = map(px, TS_MINX, TS_MAXX, tft.width(), 0);
py = map(py, TS_MINY, TS_MAXY, tft.height(), 0);
if (py < BOXSIZE) {
oldcolor = currentcolor;
if (px < BOXSIZE) {
currentcolor = RED;
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
} else if (px < BOXSIZE*2) {
currentcolor = YELLOW;
tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE);
} else if (px < BOXSIZE*3) {
currentcolor = GREEN;
tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, WHITE);
} else if (px < BOXSIZE*4) {
currentcolor = CYAN;
tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, WHITE);
} else if (px < BOXSIZE*5) {
currentcolor = BLUE;
tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, WHITE);
} else if (px < BOXSIZE*6) {
currentcolor = MAGENTA;
tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, WHITE);
}
if (oldcolor != currentcolor) {
if (oldcolor == RED)
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
if (oldcolor == YELLOW)
tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
if (oldcolor == GREEN)
tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, GREEN);
if (oldcolor == CYAN)
tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, CYAN);
if (oldcolor == BLUE)
tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, BLUE);
if (oldcolor == MAGENTA)
tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, MAGENTA);
}
}
if (((py-PENRADIUS) > BOXSIZE) && ((py+PENRADIUS) < tft.height())) {
tft.fillCircle(px, py, PENRADIUS, currentcolor);
}
}
}
실행 영상
728x90