ESP32 and ST7789V2

ESP32 2023. 9. 24. 12:36

[기록용]
알리에서 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'

이다.

예제는 위 라이브러리에 있는 예제를 참조했으며 내가 만든 그래픽 부분도 하나 포함시켰다.

속도는 기대보다 빨랐고 전체적으로 마음에 들었다.

 

아래는 예제를 실행한 동영상이다.

 

https://youtu.be/HWw1nrdc9Ro

 

소스는 다음과 같다.

/*
 * 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
Posted by codebank
,