OS/Arduino
Arduino : 2.4인치 터치 스크린 제어 ( ILI9341, UTouch )
파란크리스마스
2019. 8. 30. 22:07
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); } } }
실행 영상