[기록용]
알리에서 ST7789V2를 기반으로 하는 LCD를 판매했는데 가지고있는 QCY 손목시계와 똑같은
부품인 것 같아서 재미삼아 구입했다.
1.6 인치 크기에 240x280 크기이며 SPI 인터페이스로 동작하고 262K 컬러를 표현할 수 있다고 한다.
무엇보다 둥근 모서리를 가지고 있어서 신기했다.
대충 1만원정도에 구입할 수 있었다.
라즈베리파이나 아두이노, STM32는 연결하는 방법이 나와있는데 ESP32에 대한 정보는 없어서
여기저기 정보를 얻은 후에 구동에 성공했다.
연결 방법은 다음과 같다.
/*
* ST7789V2 ESP32 DEVKITV1
* VCC V3.3
* GND GND
* DIN D23
* CLK D18
* CS D22
* DC D16 (RX2)
* RST D4
* BL V3.3
*/
작업은 vscode PlatformIO에서 했으며 포함한 라이브러리는
'Adafruit ST7735 and ST7789 Library@^1.10.3'
이다.
예제는 위 라이브러리에 있는 예제를 참조했으며 내가 만든 그래픽 부분도 하나 포함시켰다.
속도는 기대보다 빨랐고 전체적으로 마음에 들었다.
아래는 예제를 실행한 동영상이다.
소스는 다음과 같다.
/*
* ST7789V2 ESP32 DEVKITV1
* VCC V3.3
* GND GND
* DIN D23
* CLK D18
* CS D22
* DC D16 (RX2)
* RST D4
* BL V3.3
*/
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#define TFT_RST 4
#define TFT_CS 22
#define TFT_DC 16
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
float p = 3.1415926;
void testmylines (void);
void testlines (uint16_t color);
void testdrawtext (char *text, uint16_t color);
void testfastlines (uint16_t color1, uint16_t color2);
void testdrawrects (uint16_t color);
void testfillrects (uint16_t color1, uint16_t color2);
void testfillcircles (uint8_t radius, uint16_t color);
void testdrawcircles (uint8_t radius, uint16_t color);
void testtriangles ();
void testroundrects ();
void tftPrintTest ();
void mediabuttons ();
void setup ()
{
randomSeed (analogRead (0));
Serial.begin (115200);
Serial.print ("Hello! ST77xx TFT Test");
// Use this initializer (uncomment) if you're using a 0.96" 180x60 TFT
tft.init (240, 280); // initialize a ST7735S chip, mini display
tft.setRotation (2);
Serial.println ("Initialized");
uint16_t time = millis ();
tft.fillScreen (ST77XX_BLACK);
time = millis () - time;
Serial.println (time, DEC);
delay (500);
}
void loop ()
{
// large block of text
tft.fillScreen (ST77XX_BLACK);
testdrawtext ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE);
delay (1000);
// tft print function!
tftPrintTest ();
delay (1000);
testmylines ();
delay (500);
// a single pixel
tft.drawPixel (tft.width () / 2, tft.height () / 2, ST77XX_GREEN);
delay (500);
// line draw test
testlines (ST77XX_YELLOW);
delay (500);
// optimized lines
testfastlines (ST77XX_RED, ST77XX_BLUE);
delay (500);
testdrawrects (ST77XX_GREEN);
delay (500);
testfillrects (ST77XX_YELLOW, ST77XX_MAGENTA);
delay (500);
tft.fillScreen (ST77XX_BLACK);
testfillcircles (10, ST77XX_BLUE);
testdrawcircles (10, ST77XX_WHITE);
delay (500);
testroundrects ();
delay (500);
testtriangles ();
delay (500);
mediabuttons ();
delay (500);
Serial.println ("done");
delay (1000);
tft.invertDisplay (true);
delay (500);
tft.invertDisplay (false);
delay (500);
tft.invertDisplay (true);
delay (500);
}
void testmylines (void)
{
int16_t x, y;
int16_t cx, cy;
long c;
cx = tft.width () / 2;
cy = tft.height () / 2;
c = random (0, 65536);
tft.fillScreen (ST77XX_BLACK);
for (x = 0; x < tft.width (); x += 4)
{
for (y = 0; y < tft.height (); y += 4)
{
tft.drawLine (x, y, cx, cy, c);
}
}
}
void testlines (uint16_t color)
{
tft.fillScreen (ST77XX_BLACK);
for (int16_t x = 0; x < tft.width(); x += 6)
{
tft.drawLine (0, 0, x, tft.height () - 1, color);
}
for (int16_t y = 0; y < tft.height (); y += 6)
{
tft.drawLine (0, 0, tft.width () - 1, y, color);
}
tft.fillScreen (ST77XX_BLACK);
for (int16_t x = 0; x < tft.width (); x += 6)
{
tft.drawLine (tft.width () - 1, 0, x, tft.height () - 1, color);
}
for (int16_t y = 0; y < tft.height (); y += 6)
{
tft.drawLine (tft.width () - 1, 0, 0, y, color);
}
tft.fillScreen (ST77XX_BLACK);
for (int16_t x = 0; x < tft.width (); x += 6)
{
tft.drawLine (0, tft.height () - 1, x, 0, color);
}
for (int16_t y = 0; y < tft.height (); y += 6)
{
tft.drawLine (0, tft.height () - 1, tft.width () - 1, y, color);
}
tft.fillScreen (ST77XX_BLACK);
for (int16_t x = 0; x < tft.width (); x += 6)
{
tft.drawLine (tft.width () - 1, tft.height () - 1, x, 0, color);
}
for (int16_t y = 0; y < tft.height (); y += 6)
{
tft.drawLine (tft.width () - 1, tft.height () - 1, 0, y, color);
}
}
void testdrawtext (char *text, uint16_t color)
{
tft.setCursor (0, 40);
tft.setTextColor (color);
tft.setTextWrap (true);
tft.print (text);
}
void testfastlines (uint16_t color1, uint16_t color2)
{
tft.fillScreen (ST77XX_BLACK);
for (int16_t y = 0; y < tft.height (); y += 5)
{
tft.drawFastHLine (0, y, tft.width (), color1);
}
for (int16_t x = 0; x < tft.width (); x += 5)
{
tft.drawFastVLine (x, 0, tft.height (), color2);
}
}
void testdrawrects (uint16_t color)
{
tft.fillScreen (ST77XX_BLACK);
for (int16_t x = 0; x < tft.height (); x += 6)
{
tft.drawRect (tft.width () / 2 - x / 2, tft.height () / 2 - x / 2 , x, x, color);
}
}
void testfillrects (uint16_t color1, uint16_t color2)
{
tft.fillScreen (ST77XX_BLACK);
for (int16_t x = tft.height () - 1; x > 6; x -= 6)
{
tft.fillRect (tft.width () / 2 - x / 2, tft.height () / 2 - x / 2 , x, x, color1);
tft.drawRect (tft.width () / 2 - x / 2, tft.height () / 2 - x / 2 , x, x, color2);
}
}
void testfillcircles (uint8_t radius, uint16_t color)
{
for (int16_t x = radius; x < tft.width (); x += radius * 2)
{
for (int16_t y = radius; y < tft.height (); y += radius * 2)
{
tft.fillCircle (x, y, radius, color);
}
}
}
void testdrawcircles (uint8_t radius, uint16_t color)
{
for (int16_t x = 0; x < tft.width () + radius; x += radius * 2)
{
for (int16_t y = 0; y < tft.height () + radius; y += radius * 2)
{
tft.drawCircle (x, y, radius, color);
}
}
}
void testtriangles ()
{
tft.fillScreen (ST77XX_BLACK);
uint16_t color = 0xF800;
int t;
int w = tft.width () / 2;
int x = tft.height () - 1;
int y = 0;
int z = tft.width ();
for (t = 0 ; t <= 15; t++)
{
tft.drawTriangle (w, y, y, x, z, x, color);
x -= 4;
y += 4;
z -= 4;
color += 100;
}
}
void testroundrects ()
{
tft.fillScreen (ST77XX_BLACK);
uint16_t color = 100;
int x = 0;
int y = 0;
int w = tft.width ()-2;
int h = tft.height ()-2;
while ((w > 10) && (h > 10))
{
tft.drawRoundRect (x, y, w, h, 5, color);
x += 2;
y += 3;
w -= 4;
h -= 6;
color += 1100;
}
}
void tftPrintTest ()
{
tft.setTextWrap (false);
tft.fillScreen (ST77XX_BLACK);
tft.setCursor (0, 40);
tft.setTextColor (ST77XX_RED);
tft.setTextSize (1);
tft.println ("Hello World!");
tft.setTextColor (ST77XX_YELLOW);
tft.setTextSize (2);
tft.println ("Hello World!");
tft.setTextColor (ST77XX_GREEN);
tft.setTextSize (3);
tft.println ("Hello World!");
tft.setTextColor (ST77XX_BLUE);
tft.setTextSize (4);
tft.print (1234.567);
delay (1500);
tft.setCursor (0, 40);
tft.fillScreen (ST77XX_BLACK);
tft.setTextColor (ST77XX_WHITE);
tft.setTextSize (0);
tft.println ("Hello World!");
tft.setTextSize (1);
tft.setTextColor (ST77XX_GREEN);
tft.print (p, 6);
tft.println (" Want pi?");
tft.println (" ");
tft.print (8675309, HEX); // print 8,675,309 out in HEX!
tft.println (" Print HEX!");
tft.println (" ");
tft.setTextColor (ST77XX_WHITE);
tft.println ("Sketch has been");
tft.println ("running for: ");
tft.setTextColor (ST77XX_MAGENTA);
tft.print (millis () / 1000);
tft.setTextColor (ST77XX_WHITE);
tft.print (" seconds.");
}
void mediabuttons ()
{
// play
tft.fillScreen (ST77XX_BLACK);
tft.fillRoundRect (0, 10, 78, 60, 8, ST77XX_WHITE);
tft.fillTriangle (17, 20, 17, 60, 65, 40, ST77XX_RED);
delay (500);
// pause
tft.fillRoundRect (82, 10, 78, 60, 8, ST77XX_WHITE);
tft.fillRoundRect (96, 18, 20, 45, 5, ST77XX_GREEN);
tft.fillRoundRect (127, 18, 20, 45, 5, ST77XX_GREEN);
delay (500);
// play color
tft.fillTriangle (17, 20, 17, 60, 65, 40, ST77XX_BLUE);
delay (50);
// pause color
tft.fillRoundRect (39, 98, 20, 45, 5, ST77XX_RED);
tft.fillRoundRect (69, 98, 20, 45, 5, ST77XX_RED);
// play color
tft.fillTriangle (17, 20, 17, 60, 65, 40, ST77XX_GREEN);
}
'ESP32' 카테고리의 다른 글
사용할 수 있는 PIN (0) | 2022.05.10 |
---|---|
ESP32-CAM에서 카메라를 찾을 수 없을 때. (0) | 2021.12.30 |
ESP32 WebServer with GPIO and MultiCore (0) | 2021.09.09 |