آموزش راه اندازی ماژول نمایشگر 1.3 اینچ OLED تمام رنگ IPS دارای ارتباط SPI با آردوینو

ویژگی‌های ماژول نمایشگر 1.3 اینچ OLED تمام رنگ IPS

نمایشگرهای OLED مزایای بسیاری نسبت به نمایشگرهای LCD و LED قدیمی دارند. این ماژول‌ها به صورت تمام رنگ و با کیفیت بسیار بالا هستند. این ماژول نمایشگر 1.3 اینچ OLED تمام رنگ بوده و دارای ارتباط SPI است. همچنین رزولوشن این نمایشگر 240×240 بوده، یعنی دارای 57600 پیکسل است و در نتیجه از کیفیت نمایش بسیار واضح و شفافی برخوردار است.

معرفی پایه ها (Pinout) ماژول نمایشگر 1.3 اینچ OLED تمام رنگ IPS

ماژول نمایشگر 1.3 اینچ  OLED دارای 7 پایه به شرح زیر است:

  • GND: زمین
  • VCC: تغذیه ماژول –3.3 ولت
  • SCL: کلاک SPI
  • SDA: دیتا SPI
  • RES: ریست
  • DC: انتخاب Data/Command
  • BLK: کنترل نور پس ­زمینه

پین اوت (Pinout) این ماژول را می‌توانید در تصویر زیر مشاهده کنید.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 1
ماژول نمایشگر 1.3 اینچ OLED تمام رنگ IPS دارای ارتباط SPI × 1
سیم جامپر × 1

نرم افزارهای مورد نیاز

آردوینو IDE

راه اندازی ماژول نمایشگر 1.3 اینچ OLED تمام رنگ IPS با آردوینو

گام اول: سیم بندی

برای کار کردن با این ماژول باید مطابق مدار زیر، ماژول را به آردوینو وصل کنید.

گام دوم: نصب کتابخانه

به Library manager رفته و کتابخانه Adafruit GFX Library را نصب کنید.

سپس کتابخانه Arduino_ST7789_Fast را از اینجا دانلود کنید. پس از دانلود این کتابخانه، به قسمت Include Library رفته و کتابخانه را نصب کنید.

توجه

اگر برای نصب کتابخانه نیاز به راهنمایی بیشتر دارید، به اینجا مراجعه کنید.

گام سوم: کد

کد زیر را روی برد آردوینو آپلود کنید. پس از آپلود کد، پنجره Serial Monitor را باز کنید.

 /* 
Modified on Dec 8, 2020
Modified by MehranMaleki from Arduino Examples
Home<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" title="&#8220;Home&#8221; &#8212; Electropeak" src="https://electropeak.com/learn/embed/#?secret=9Lx72ZZcCw" data-secret="9Lx72ZZcCw" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
*/


// ST7789 library example
// (c) 2019-20 Pawel A. Hernik

/*
 ST7789 240x240 IPS (without CS pin) connections (only 6 wires required):

 #01 GND -> GND
 #02 VCC -> VCC (3.3V only!)
 #03 SCL -> D13/SCK
 #04 SDA -> D11/MOSI
 #05 RES -> D8 or any digital
 #06 DC  -> D7 or any digital
 #07 BLK -> NC
*/

#define SCR_WD   240
#define SCR_HT   240
#include <SPI.h>
#include <Adafruit_GFX.h>

#if (__STM32F1__) // bluepill
#define TFT_DC  PA1
#define TFT_RST PA0
//#include <Arduino_ST7789_STM.h>
#else
#define TFT_DC  7
#define TFT_RST 8
#include <Arduino_ST7789_Fast.h>
//#include <Arduino_ST7789.h>
#endif

Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST);

// ------------------------------------------------
unsigned long FillScreenTest()
{
  unsigned long start = millis();
  for(int i=0;i<5;i++) {
    tft.fillScreen(RED);
    tft.fillScreen(GREEN);
    tft.fillScreen(BLUE);
    tft.fillScreen(YELLOW);
  }
  return millis()-start;
}

// ------------------------------------------------
unsigned long ClearScreenTest()
{
  unsigned long start = millis();
  for(int i=0;i<5*4;i++) 
    tft.fillScreen(BLACK);
  return millis()-start;
}

// ------------------------------------------------
const uint16_t imgF[] PROGMEM = {0xF800,0xF840,0xF8A0,0xF900,0xF960,0xF9C0,0xFA20,0xFA80,0xFAE0,0xFB40,0xFBA0,0xFC00,0xFC60,0xFCC0,0xFD20,0xFD80,0xFDE0,0xFE40,0xFEA0,0xFF00,0xFF60,0xFFC0,0xFFE0,0xEFE0,0xE7E0,0xD7E0,0xCFE0,0xBFE0,0xB7E0,0xA7E0,0x9FE0,0x8FE0,0x87E0,0x77E0,0x6FE0,0x5FE0,0x57E0,0x47E0,0x3FE0,0x2FE0,0x27E0,0x17E0,0xFE0,0x7E0,0x7E1,0x7E3,0x7E4,0x7E6,0x7E7,0x7E9,0x7EA,0x7EC,0x7ED,0x7EF,0x7F0,0x7F2,0x7F3,0x7F5,0x7F6,0x7F8,0x7F9,0x7FB,0x7FC,0x7FE,0x7FF,0x79F,0x73F,0x6DF,0x67F,0x61F,0x5BF,0x55F,0x4FF,0x49F,0x43F,0x3DF,0x37F,0x31F,0x2BF,0x25F,0x1FF,0x19F,0x13F,0xDF,0x7F,0x1F,0x81F,0x101F,0x201F,0x281F,0x381F,0x401F,0x501F,0x581F,0x681F,0x701F,0x801F,0x881F,0x981F,0xA01F,0xB01F,0xB81F,0xC81F,0xD01F,0xE01F,0xE81F,0xF81F,0xF81F,0xF81D,0xF81C,0xF81A,0xF819,0xF817,0xF816,0xF814,0xF813,0xF811,0xF810,0xF80E,0xF80D,0xF80B,0xF80A,0xF808,0xF807,0xF805,0xF804,0xF802,0xF801,
                                 0xF800,0xF840,0xF8A0,0xF900,0xF960,0xF9C0,0xFA20,0xFA80,0xFAE0,0xFB40,0xFBA0,0xFC00,0xFC60,0xFCC0,0xFD20,0xFD80,0xFDE0,0xFE40,0xFEA0,0xFF00,0xFF60,0xFFC0,0xFFE0,0xEFE0,0xE7E0,0xD7E0,0xCFE0,0xBFE0,0xB7E0,0xA7E0,0x9FE0,0x8FE0,0x87E0,0x77E0,0x6FE0,0x5FE0,0x57E0,0x47E0,0x3FE0,0x2FE0,0x27E0,0x17E0,0xFE0,0x7E0,0x7E1,0x7E3,0x7E4,0x7E6,0x7E7,0x7E9,0x7EA,0x7EC,0x7ED,0x7EF,0x7F0,0x7F2,0x7F3,0x7F5,0x7F6,0x7F8,0x7F9,0x7FB,0x7FC,0x7FE,0x7FF,0x79F,0x73F,0x6DF,0x67F,0x61F,0x5BF,0x55F,0x4FF,0x49F,0x43F,0x3DF,0x37F,0x31F,0x2BF,0x25F,0x1FF,0x19F,0x13F,0xDF,0x7F,0x1F,0x81F,0x101F,0x201F,0x281F,0x381F,0x401F,0x501F,0x581F,0x681F,0x701F,0x801F,0x881F,0x981F,0xA01F,0xB01F,0xB81F,0xC81F,0xD01F,0xE01F,0xE81F,0xF81F,0xF81F,0xF81D,0xF81C,0xF81A,0xF819,0xF817,0xF816,0xF814,0xF813,0xF811,0xF810,0xF80E,0xF80D,0xF80B,0xF80A,0xF808,0xF807,0xF805,0xF804,0xF802,0xF801};
uint16_t img[SCR_WD+16];
unsigned long DrawImageTest()
{
  for(int i=0;i<SCR_WD+16;i++) img[i] = tft.rgbWheel(500L*i/SCR_WD);
  unsigned long start = millis();
  for(int i=0;i<5*4;i++) for(int y=0;y<SCR_HT;y++) tft.drawImage(0,y,SCR_WD,1,img+(((y>>2)+i)&0xf));
  return millis()-start;
}

// ------------------------------------------------ 
unsigned long DrawImageFTest()
{
  unsigned long start = millis();
  for(int i=0;i<5*4;i++) for(int y=0;y<SCR_HT;y++) tft.drawImageF(0,y,SCR_WD,1,imgF+(((y>>2)+i)&0xf));
  return millis()-start;
}
// ------------------------------------------------
// original Adafruit
unsigned long orig[14]={ 5872, 5872, 1468292,394696,2938532,132952,121996,4068208,925276,1319512, 1278096,1930524,602080,4649200 };
// pre 18.09.2020 Fast
//unsigned long orig[14]={2645,3577,661616,114064,579036,56216,49500,1830864,222936,259340,175460,903348,138264,1853300};

unsigned long res[14];
void result(int i)
{
  Serial.print(res[i]);
  if(res[i]<1000000) Serial.print("\t");
  Serial.print("\t\t\t");
  Serial.print(100*orig[i]/res[i]);
  Serial.println("%");
}

void setup(void) 
{
  Serial.begin(9600);
  Serial.println(F("IPS 240x240 ST7789"));
  //tft.reset();
  //tft.init(SCR_WD, SCR_HT);
  tft.begin();
  tft.fillScreen(BLACK);
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.println("IPS 240x240 ST7789");
  tft.println("Library Benchmark");
  tft.println("starts in 3s ...");
  delay(3000);

  Serial.println(F("Benchmark                Time (microseconds)"));

  res[0]=FillScreenTest();
  Serial.print(F("FillScreen Mbps          "));
  Serial.println(String(res[0])+"ms  "+String(1000*20.0/res[0])+"fps  "+String(20.0*SCR_WD*SCR_HT*16/res[0]/1000.0)+" Mbps\t"+100*orig[0]/res[0]+"%");
//for(int i=0;i<100;i++) tft.fillRect(i,i,SCR_WD-i*2,SCR_HT-i*2,tft.rgbWheel(i*10)); delay(1000);

  res[1]=ClearScreenTest();
  Serial.print(F("ClearScreen Mbps         "));
  Serial.println(String(res[1])+"ms  "+String(1000*20.0/res[1])+"fps  "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps\t"+100*orig[1]/res[1]+"%");

  res[1]=DrawImageTest();
  Serial.print(F("DrawImage Mbps           "));
  Serial.println(String(res[1])+"ms  "+String(1000*20.0/res[1])+"fps  "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps\t"+100*orig[1]/res[1]+"%"); 

  res[1]=DrawImageFTest();
  Serial.print(F("DrawImageF Mbps          "));
  Serial.println(String(res[1])+"ms  "+String(1000*20.0/res[1])+"fps  "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps\t"+100*orig[1]/res[1]+"%"); 

  res[2]=testFillScreen();
  Serial.print(F("Screen fill              "));
  result(2);
  delay(500);

  res[3]=testText();
  Serial.print(F("Text                     "));
  result(3);
  delay(3000);

  res[4]=testLines(CYAN);
  Serial.print(F("Lines                    "));
  result(4);
  delay(500);

  res[5]=testFastLines(RED, BLUE);
  Serial.print(F("Horiz/Vert Lines         "));
  result(5);
  delay(500);

  res[6]=testRects(GREEN);
  Serial.print(F("Rectangles (outline)     "));
  result(6);
  delay(500);

  res[7]=testFilledRects(YELLOW, MAGENTA);
  Serial.print(F("Rectangles (filled)      "));
  result(7);
  delay(500);

  res[8]=testFilledCircles(10, MAGENTA);
  Serial.print(F("Circles (filled)         "));
  result(8);

  res[9]=testCircles(10, WHITE);
  Serial.print(F("Circles (outline)        "));
  result(9);
  delay(500);

  res[10]=testTriangles();
  Serial.print(F("Triangles (outline)      "));
  result(10);
  delay(500);

  res[11]=testFilledTriangles();
  Serial.print(F("Triangles (filled)       "));
  result(11);
  delay(500);

  res[12]=testRoundRects();
  Serial.print(F("Rounded rects (outline)  "));
  result(12);
  delay(500);

  res[13]=testFilledRoundRects();
  Serial.print(F("Rounded rects (filled)   "));
  result(13);
  delay(500);

  Serial.println(F("Done!"));
  Serial.println(F("Results:"));
  for(int i=0;i<14;i++) { Serial.print(res[i]); Serial.print(","); }
  Serial.println();

  int c1=YELLOW, c2=WHITE;
  tft.fillScreen(BLACK);
  tft.setCursor(0, 0);
  tft.setTextSize(2);
  tft.setTextColor(CYAN);
  tft.println("RESULTS:");

  tft.setTextSize(1);
  tft.println();
  tft.setTextColor(GREEN);
  tft.println(F("Benchmark               Time (us)"));
  tft.setTextColor(c1); tft.print(F("FillScreen Mbps         "));
  tft.setTextColor(c2); tft.println(String(res[0])+"ms "+String(20.0*SCR_WD*SCR_HT*16/res[0]/1000.0)+" Mbps");
  //tft.setTextColor(c1); tft.print(F("ClearScreen Mbps        "));
  //tft.setTextColor(c2); tft.print(String(res[1])+"ms "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps");
  tft.setTextColor(c1); tft.print(F("DrawImageF Mbps         "));
  tft.setTextColor(c2); tft.println(String(res[1])+"ms "+String(20.0*SCR_WD*SCR_HT*16/res[1]/1000.0)+" Mbps");

  tft.setTextColor(c1); tft.print(F("Screen fill             "));
  tft.setTextColor(c2); tft.println(res[3]);
  tft.setTextColor(c1); tft.print(F("Text                    "));
  tft.setTextColor(c2); tft.println(res[4]);
  tft.setTextColor(c1); tft.print(F("Lines                   "));
  tft.setTextColor(c2); tft.println(res[5]);
  tft.setTextColor(c1); tft.print(F("Horiz/Vert Lines        "));
  tft.setTextColor(c2); tft.println(res[6]);
  tft.setTextColor(c1); tft.print(F("Rectangles (outline)    "));
  tft.setTextColor(c2); tft.println(res[8]);
  tft.setTextColor(c1); tft.print(F("Rectangles (filled)     "));
  tft.setTextColor(c2); tft.println(res[9]);
  tft.setTextColor(c1); tft.print(F("Circles (filled)        "));
  tft.setTextColor(c2); tft.println(res[10]);
  tft.setTextColor(c1); tft.print(F("Circles (outline)       "));
  tft.setTextColor(c2); tft.println(res[11]);
  tft.setTextColor(c1); tft.print(F("Triangles (outline)     "));
  tft.setTextColor(c2); tft.println(res[12]);
  tft.setTextColor(c1); tft.print(F("Triangles (filled)      "));
  tft.setTextColor(c2); tft.println(res[13]);
  tft.setTextColor(c1); tft.print(F("Rounded rects (outline) "));
  tft.setTextColor(c2); tft.println(res[14]);
  tft.setTextColor(c1); tft.print(F("Rounded rects (filled)  "));
  tft.setTextColor(c2); tft.println(res[15]);
  tft.setTextColor(RED); tft.println(F("Done!"));
}

/*
Optimizations from 18.9.2020

-- IPS 240x240 ST7789, back to old setAddrWindow() with writeSPI, flash: 28,550
Benchmark                Time (microseconds)
FillScreen Mbps          2609ms  7.67fps  7.06 Mbps 225%
ClearScreen Mbps         2609ms  7.67fps  7.06 Mbps 225%
DrawImage Mbps           2740ms  7.30fps  6.73 Mbps 214%
DrawImageF Mbps          3579ms  5.59fps  5.15 Mbps 164%
Screen fill              652528       225%
Text                     109748       359%
Lines                    572992       512%
Horiz/Vert Lines         54696        243%
Rectangles (outline)     47916        254%
Rectangles (filled)      1805552      225%
Circles (filled)         208212       444%
Circles (outline)        255744       515%
Triangles (outline)      173468       736%
Triangles (filled)       880160       219%
Rounded rects (outline)  135920       442%
Rounded rects (filled)   1819660      255%
Done!
Results:
2609,3579,652528,109748,572992,54696,47916,1805552,208212,255744,173468,880160,135920,1819660,


-- IPS 240x240 ST7789 + back to old drawPixel, flash: 28,456
Benchmark                Time (microseconds)
FillScreen Mbps          2609ms  7.67fps  7.06 Mbps 225%
ClearScreen Mbps         2609ms  7.67fps  7.06 Mbps 225%
DrawImage Mbps           2750ms  7.27fps  6.70 Mbps 213%
DrawImageF Mbps          3588ms  5.57fps  5.14 Mbps 163%
Screen fill              652540       225%
Text                     114004       346%
Lines                    609216       482%
Horiz/Vert Lines         54884        242%
Rectangles (outline)     48216        253%
Rectangles (filled)      1805640      225%
Circles (filled)         213896       432%
Circles (outline)        272036       485%
Triangles (outline)      184020       694%
Triangles (filled)       885728       217%
Rounded rects (outline)  142432       422%
Rounded rects (filled)   1821976      255%
Done!
Results:
2609,3588,652540,114004,609216,54884,48216,1805640,213896,272036,184020,885728,142432,1821976,


-- IPS 240x240 ST7789 - all previous + no _x/ystart in setAddrWindow(), flash: 28,462
Benchmark                Time (microseconds)
FillScreen Mbps          2609ms  7.67fps  7.06 Mbps  225%
ClearScreen Mbps         2609ms  7.67fps  7.06 Mbps 225%
DrawImage Mbps           2749ms  7.28fps  6.70 Mbps 213%
DrawImageF Mbps          3588ms  5.57fps  5.14 Mbps 163%
Screen fill              652536       225%
Text                     115248       342%
Lines                    622492       472%
Horiz/Vert Lines         54876        242%
Rectangles (outline)     48216        253%
Rectangles (filled)      1805608      225%
Circles (filled)         213896       432%
Circles (outline)        278020       474%
Triangles (outline)      187872       680%
Triangles (filled)       885744       217%
Rounded rects (outline)  144708       416%
Rounded rects (filled)   1821980      255%
Done!
Results:
2609,3588,652536,115248,622492,54876,48216,1805608,213896,278020,187872,885744,144708,1821980,

-- IPS 240x240 ST7789 optimized write and copy, flash 28,506
Benchmark                Time (microseconds)
FillScreen Mbps          2609ms  7.67fps  7.06 Mbps  225%
ClearScreen Mbps         2608ms  7.67fps  7.07 Mbps 225%
DrawImage Mbps           2751ms  7.27fps  6.70 Mbps 213%
DrawImageF Mbps          3592ms  5.57fps  5.13 Mbps 163%
Screen fill              652552       225%
Text                     117240       336% (---)
Lines                    639400       459% (---)
Horiz/Vert Lines         54968        241%
Rectangles (outline)     48364        252%
Rectangles (filled)      1805680      225%
Circles (filled)         216544       427%
Circles (outline)        285624       461%
Triangles (outline)      192788       662%
Triangles (filled)       888328       217%
Rounded rects (outline)  147748       407% (---)
Rounded rects (filled)   1823064      255%
Done!
Results:
2609,3592,652552,117240,639400,54968,48364,1805680,216544,285624,192788,888328,147748,1823064,

-- IPS 240x240 ST7789 Fast original before 18.9.20 changes, flash: 29,356 bytes
Benchmark                Time (microseconds)
FillScreen Mbps          2645ms  7.56fps  6.97 Mbps  222%
ClearScreen Mbps         2645ms  7.56fps  6.97 Mbps 222%
DrawImage Mbps           3026ms  6.61fps  6.09 Mbps 194%
DrawImageF Mbps          3577ms  5.59fps  5.15 Mbps 164%
Screen fill              661616       221%
Text                     114064       346%
Lines                    579036       507%
Horiz/Vert Lines         56216        236%
Rectangles (outline)     49500        246%
Rectangles (filled)      1830864      222%
Circles (filled)         222936       415%
Circles (outline)        259340       508%
Triangles (outline)      175460       728%
Triangles (filled)       903348       213%
Rounded rects (outline)  138264       435%
Rounded rects (filled)   1853300      250%
Done!
Results:
2645,3577,661616,114064,579036,56216,49500,1830864,222936,259340,175460,903348,138264,1853300,

-- IPS 240x240 ST7789 in COMPATIBILITY mode
Benchmark                Time (microseconds)
FillScreen Mbps          5361ms  3.73fps  3.44 Mbps  109%
ClearScreen Mbps         5362ms  3.73fps  3.44 Mbps 109%
DrawImage Mbps           5665ms  3.53fps  3.25 Mbps 103%
DrawImageF Mbps          5706ms  3.51fps  3.23 Mbps 102%
Screen fill              1340716      109%
Text                     244268       161%
Lines                    1652188      177%
Horiz/Vert Lines         114840       115%
Rectangles (outline)     101892       119%
Rectangles (filled)      3711592      109%
Circles (filled)         487852       189%
Circles (outline)        741392       177%
Triangles (outline)      494348       258%
Triangles (filled)       1614292      119%
Rounded rects (outline)  363292       165%
Rounded rects (filled)   3761392      123%
Done!
Results:
5361,5706,1340716,244268,1652188,114840,101892,3711592,487852,741392,494348,1614292,363292,3761392,

*/

/*
IPS ST7789 original:
Benchmark                Time (microseconds)
FillScreen               5872ms 3.41fps
ClearScreen              5872ms 3.41fps
Screen fill              1468292
Text                     394696
Lines                    2938532
Horiz/Vert Lines         132952
Rectangles (outline)     121996
Rectangles (filled)      4068208
Circles (filled)         925276
Circles (outline)        1319512
Triangles (outline)      1278096
Triangles (filled)       1930524
Rounded rects (outline)  602080
Rounded rects (filled)   4649200
Done!


IPS 240x240 ST7789 optimized - FINAL
Benchmark                Time (microseconds)
FillScreen               2645ms 7.56fps
ClearScreen              2645ms 7.56fps
Screen fill              661488
Text                     108816
Lines                    563888
Horiz/Vert Lines         56192
Rectangles (outline)     49128
Rectangles (filled)      1830804
Circles (filled)         270728
Circles (outline)        250940
Triangles (outline)      245104
Triangles (filled)       897880
Rounded rects (outline)  135416
Rounded rects (filled)   2030816
Done!

Fill speed:
240*240*2 = 115 200b  *20 *8bit/2.645 ->6.9Mbps (!)


IPS 240x240 ST7789
Benchmark                Time (microseconds)
FillScreen Mbps          2645ms  7.56fps  6.97 Mbps  222%
ClearScreen Mbps         2645ms  7.56fps  6.97 Mbps 222%
Screen fill              661624       221%
Text                     109496       360%
Lines                    563888       521%
Horiz/Vert Lines         56216        236%
Rectangles (outline)     49168        248%
Rectangles (filled)      1830880      222%
Circles (filled)         271772       340%
Circles (outline)        251000       525%
Triangles (outline)      245104       521%
Triangles (filled)       898632       214%
Rounded rects (outline)  135368       444%
Rounded rects (filled)   2031308      228%
Done!

*/
// ------------------------------------------------

void loop(void) 
{
}

// ------------------------------------------------

unsigned long testFillScreen() {
  unsigned long start = micros();
  tft.fillScreen(BLACK);
  tft.fillScreen(RED);
  tft.fillScreen(GREEN);
  tft.fillScreen(BLUE);
  tft.fillScreen(BLACK);
  return micros() - start;
}

// ------------------------------------------------
unsigned long testText() {
  tft.fillScreen(BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;
}

// ------------------------------------------------
unsigned long testLines(uint16_t color) {
  unsigned long start, t;
  int           x1, y1, x2, y2,
                w = tft.width(),
                h = tft.height();

  tft.fillScreen(BLACK);

  x1 = y1 = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t     = micros() - start; // fillScreen doesn't count against timing

  tft.fillScreen(BLACK);

  x1    = w - 1;
  y1    = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(BLACK);

  x1    = 0;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(BLACK);

  x1    = w - 1;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);

  return micros() - start;
}

// ------------------------------------------------
unsigned long testFastLines(uint16_t color1, uint16_t color2) {
  unsigned long start;
  int           x, y, w = tft.width(), h = tft.height();

  tft.fillScreen(BLACK);
  start = micros();
  for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
  for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);

  return micros() - start;
}

// ------------------------------------------------
unsigned long testRects(uint16_t color) {
  unsigned long start;
  int           n, i, i2,
                cx = tft.width()  / 2,
                cy = tft.height() / 2;

  tft.fillScreen(BLACK);
  n     = min(tft.width(), tft.height());
  start = micros();
  for(i=2; i<n; i+=6) {
    i2 = i / 2;
    tft.drawRect(cx-i2, cy-i2, i, i, color);
  }

  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;
}

// ------------------------------------------------
unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

  tft.fillScreen(BLACK);
  start = micros();
  for(x=radius; x<w; x+=r2) {
    for(y=radius; y<h; y+=r2) {
      tft.fillCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

// ------------------------------------------------
unsigned long testCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int           x, y, r2 = radius * 2,
                w = tft.width()  + radius,
                h = tft.height() + radius;

  // Screen is not cleared for this one -- this is
  // intentional and does not affect the reported time.
  start = micros();
  for(x=0; x<w; x+=r2) {
    for(y=0; y<h; y+=r2) {
      tft.drawCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

// ------------------------------------------------
unsigned long testTriangles() {
  unsigned long start;
  int           n, i, cx = tft.width()  / 2 - 1,
                      cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  n     = min(cx, cy);
  start = micros();
  for(i=0; i<n; i+=5) {
    tft.drawTriangle(
      cx    , cy - i, // peak
      cx - i, cy + i, // bottom left
      cx + i, cy + i, // bottom right
      tft.color565(0, 0, i));
  }

  return micros() - start;
}

// ------------------------------------------------
unsigned long testFilledTriangles() {
  unsigned long start, t = 0;
  int           i, cx = tft.width()  / 2 - 1,
                   cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  start = micros();
  for(i=min(cx,cy); i>10; i-=5) {
    start = micros();
    tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(0, i, i));
    t += micros() - start;
    tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(i, i, 0));
  }

  return t;
}

// ------------------------------------------------
unsigned long testRoundRects() {
  unsigned long start;
  int           w, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  w     = min(tft.width(), tft.height());
  start = micros();
  for(i=0; i<w; i+=6) {
    i2 = i / 2;
    tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
  }

  return micros() - start;
}

// ------------------------------------------------
unsigned long testFilledRoundRects() {
  unsigned long start;
  int           i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(BLACK);
  start = micros();
  for(i=min(tft.width(), tft.height()); i>20; i-=6) {
    i2 = i / 2;
    tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
  }

  return micros() - start;
}
// ------------------------------------------------
   
Arduino

در کد بالا که از مثال­‌های آردوینو است، انواع شکل­‌ها با رنگ‌­های گوناگون بر روی نمایشگر نمایش داده می‌­شود و می­‌توان از آن برای تست نمایشگر استفاده کرد.

آموزش های مشابه

Comments (11)

  • razi901 Reply

    برای من کار میکنه ولی یکم انگار از بعضی از پیکسل ها میپره بعد مثلا ری استارت میکنم بور رو برا چند صدم ثانیه تصویر درسته بعد ریلود میشه از اول میاد کد

    دسامبر 11, 2023 at 6:56 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      لطف میکنید سوال خود را در بخش انجمن مطرح کنید و یک عکس از این موردی که باهاش برخورده اید نیز ارسال کنید تا بیشتر مورد بررسی قرار بگیرد.

      دسامبر 12, 2023 at 7:48 ق.ظ
  • بابک Reply

    سلام. روی نمایشگر SDA و SCL نوشته شده. آیا با رابط I2C هم راه اندازی می شود؟؟ ممنونم

    جولای 12, 2024 at 8:25 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      خیر، این نمایشگر از نوع SPI می باشد.
      برای کوتاه شدن نوشته بر روی PCB به این صورت نوشته شده است.
      از بخش معرفی پایه ها مشخص شده است که هر کدام از پایه ها برای چه کاری می باشد.

      جولای 13, 2024 at 10:13 ق.ظ
  • Mehrad Reply

    سلام ببخشید من اینو می‌خوام امتحان کنم هنوز اتصالشو انجام ندادم می‌خوام امتحان کنم اگه من اونو زدم توی نمایشگر چه عکسی رو نشون خواهد داد مثلاً من اگه می‌خواستم خودم عکس تعیین کنم میشه خودم عکس تعیین کنم براش

    اکتبر 4, 2024 at 5:23 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      این کد یک تعداد از عکس های نمونه و شکل های نمونه را برای شما نمایش میدهد.
      برای نشان دادن عکس های مخصوص ابتدا باید عکس خود را به صورت HEX 16 بیتی باید تبدیل بکنید و داخل متغییر imgF بریزید تا برای شما نمایش داده شود.
      البته این کار بر روی آردوینو و این جور نمایشگر ها سخت می باشد. پیشنهاد میکنم از برد های ESP32 به همراه نمایشگر های 2.4 اینچی به بالا که قابلیت پورت SPI دارند استفاده بکنید که از لایبراری TFT_eSPI پیشتیانی میکنند و از کتابخانه کمکی JPEGDecoder برای نمایش فایل های JPEG بر روی این نمایشگر ها استفاده میشود استفاده بکنید. همچنین فایل های خود را میتوانید بر روی SD Card یا پروتکل SPIFFS خود ESP32 بریزید و به راحتی عکس های خود را نمایش بدهید.

      اکتبر 5, 2024 at 3:23 ب.ظ
  • محمدحسین حسین پور Reply

    کل کد بالا در کتابخانه است؟
    یعنی فقط کافیست ما آن را نصب و کپی کنیم؟

    نوامبر 10, 2024 at 12:40 ق.ظ
    • محمد دمیرچی Reply

      با سلام
      کتابخانه با کد متفاوت می باشد. شما باید کتابخانه را نصب بکنید.
      سپس از بخش Example های برنامه آردوینو می توانید به مثال هایی که مربوط به کتابخانه های نصب شده دسترسی پیدا بکنید.
      کتابخانه مورد نظر را پیدا بکنید و میتوانید تک به تک مثال ها را اجرا و بررسی بنمایید.

      نوامبر 17, 2024 at 12:31 ب.ظ
  • نظامی پور Reply

    سلام ببخشید من همه کار رو کردم ولی فقط چند تا از پیکسل ها روشن میشد بعد از چند لحظه خاموش می شد هیچ تصویری نمی داد باید چیکار کنم؟

    دسامبر 8, 2024 at 9:59 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      از سیم کشی خود مطمئن بشوید. هم چنین در صورتی که راه‌اندازی نشد سؤال خود را در انجمن مطرح بکنید و یک عکس از شرایط خود نیز در آنجا ارسال بنمایید.

      دسامبر 9, 2024 at 10:52 ق.ظ
  • نظامی پور Reply

    ببخشید انجمن کجاست؟

    دسامبر 9, 2024 at 11:55 ق.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.