Display (LCD / OLED / EPD) graphics library (for ESP32 SPI, I2C, 8bitParallel / ESP8266 SPI / ATSAMD51 SPI).
M5Stack / M5StickC / TTGO T-Watch / ODROID-GO / ESP-WROVER-KIT / WioTerminal / and more...
ESP32ãšSPI, I2C, 8ããããã©ã¬ã«æ¥ç¶ã®ãã£ã¹ãã¬ã€ / ESP8266ãšSPIæ¥ç¶ã®ãã£ã¹ãã¬ã€ / ATSAMD51ãšSPIæ¥ç¶ã®ãã£ã¹ãã¬ã€ã®çµã¿åããã§åäœããã°ã©ãã£ãã¯ã©ã€ãã©ãªã§ãã
This is a graphics library that works with a combination of ESP32 with SPI, I2C, 8-bit parallel / ESP8266 with SPI / ATSAMD51 with SPI to the Display. (see compatibility list below).
AdafruitGFX ã TFT_eSPI ãšäºææ§ãããçšåºŠæã¡ã€ã€ãããé«æ©èœã»é«éåäœãç®æšãšããŠããŸãã
This library mimics AdafruitGFX and TFT_eSPI APIs while aiming for higher functional coverage and performances.
æ¢åã®ã©ã€ãã©ãªã«å¯ŸããŠã以äžã®ã¢ããã³ããŒãžããããŸãã
- ArduinoESP32 / ESP-IDF 察å¿
- 16bit / 24bitã«ã©ãŒã¢ãŒã䞡察å¿(å®éã®è²æ°ã¯ãã£ã¹ãã¬ã€ã®ä»æ§ã«ãããŸã)
- DMA転éãçšããéä¿¡åäœäžã®å¥åŠçå®è¡
- ãªãã¹ã¯ãªãŒã³ãããã¡ïŒã¹ãã©ã€ãïŒã®é«éãªå転/æ¡çž®æç»
- è€æ°ãã£ã¹ãã¬ã€ã®åæå©çš
- ã¢ãã¯ããã£ã¹ãã¬ã€ã«å¯Ÿããæžè²æç»ã®èªååŠç
This library has the following advantages.
- ArduinoESP32 and ESP-IDF are supported.
- Both 16bit and 24bit color modes are supported. (actual number of colors depends on display specifications)
- Execute another process during communication operation using DMA transfer.
- Fast rotation/expansion of the off-screen buffer (sprite).
- Simultaneous use of multiple displays.
- Automatic processing of color reduction drawing for monochrome displays.
-
ãã©ãããã©ãŒã Platform
- ESP-IDF
- Arduino ESP32
- Arduino ATSAMD51 (Seeed)
-
ãã£ã¹ãã¬ã€ Displays
- GC9A01
- GDEW0154M09 (M5Stack CoreInk)
- HX8357
- ILI9163
- ILI9341 (WioTerminal, ESP-WROVER-KIT, ODROID-GO, LoLin D32 Pro, WiFiBoy Pro)
- ILI9342 (M5Stack, M5Stack Core2)
- ILI9481
- ILI9486
- ILI9488 (Makerfabs Touch with Camera)
- IT8951 (M5Paper)
- SH110x (SH1106, SH1107, M5UnitOLED)
- SSD1306 (SSD1309)
- SSD1327
- SSD1331
- SSD1351 (SSD1357)
- ST7735 (M5StickC, TTGO T-Wristband, TTGO TS, LoLin D32 Pro, WiFiBoy mini, PyBadge)
- ST7789 (M5StickCPlus, TTGO T-Watch, ESP-WROVER-KIT, Makerfabs MakePython, DSTIKE D-duino-32 XS)
- ST7796 (WT32-SC01)
-
ã¿ããã¹ã¯ãªãŒã³ TouchScreens (only ESP32)
- I2C FT5x06 (FT5206, FT5306, FT5406, FT6206, FT6236, FT6336, FT6436)
- I2C GT911
- SPI XPT2046
- SPI STMPE610
èšå®æ¹æ³ã®ãµã³ãã«ã¯src/lgfx_userã«ãããŸãã
äžèšå¯Ÿå¿æ©çš®ãšã³ãã³ãäœç³»ã®é¡äŒŒãããã£ã¹ãã¬ã€ã§ããã°å¯Ÿå¿å¯èœã§ãããåœæ¹ã§å
¥æãåäœç¢ºèªãåãããã®ã®ã¿æ£åŒå¯Ÿå¿ãšããŠããŸãã
察å¿èŠæãé ããæ©çš®ã«ã¯åªå
çã«å¯Ÿå¿ãæ€èšèŽããŸãã
setting examples is src/lgfx_user
This library is also compatible with the above models and display panels with a similar command system,
but only those that have been obtained and confirmed to work are officially supported.
examplesã«å ·äœçãªãµã³ãã«ããããŸãã
// â» ãã察å¿æ©çš®ã ArduinoIDE以å€ã®ç°å¢ã§äœ¿çšããå Žåãã
// 察å¿æ©çš®ãããŒããããŒãžã£ã«ç¡ãå Žå ( TTGO T-Wristband ã ESP-WROVER-KITç ) ã¯ã
// LovyanGFX.hppã®includeããåã«ãdefine LGFX_ïœ ã®å®çŸ©ãèšè¿°ããŠãã ããã
// #define LGFX_M5STACK // M5Stack (Basic / Gray / Go / Fire)
// #define LGFX_M5STACK_CORE2 // M5Stack Core2
// #define LGFX_M5STACK_COREINK // M5Stack CoreInk
// #define LGFX_M5STICK_C // M5Stick C / CPlus
// #define LGFX_M5PAPER // M5Paper
// #define LGFX_M5TOUGH // M5Tough
// #define LGFX_ODROID_GO // ODROID-GO
// #define LGFX_TTGO_TS // TTGO TS
// #define LGFX_TTGO_TWATCH // TTGO T-Watch
// #define LGFX_TTGO_TWRISTBAND // TTGO T-Wristband
// #define LGFX_DDUINO32_XS // DSTIKE D-duino-32 XS
// #define LGFX_LOLIN_D32_PRO // LoLin D32 Pro
// #define LGFX_ESP_WROVER_KIT // ESP-WROVER-KIT
// #define LGFX_WIFIBOY_PRO // WiFiBoy Pro
// #define LGFX_WIFIBOY_MINI // WiFiBoy mini
// #define LGFX_MAKERFABS_TOUCHCAMERA // Makerfabs Touch with Camera
// #define LGFX_MAKERFABS_MAKEPYTHON // Makerfabs MakePython
// #define LGFX_WT32_SC01 // Seeed WT32-SC01
// #define LGFX_WIO_TERMINAL // Seeed Wio Terminal
// #define LGFX_PYBADGE // Adafruit PyBadge
#define LGFX_AUTODETECT // èªåèªè (D-duino-32 XS, PyBadge ã¯ããã«IDèªåããåºæ¥ãªãããèªåèªèã®å¯Ÿè±¡ããå€ããŠããŸã)
// è€æ°æ©çš®ã®å®çŸ©ãè¡ãããLGFX_AUTODETECTãå®çŸ©ããããšã§ãå®è¡æã«ããŒããèªåèªèããŸãã
// v1.0.0 ãæå¹ã«ããŸã(v0ããã®ç§»è¡æéã®ç¹å¥æªçœ®ã§ãããããæžããªãå Žåã¯æ§v0ç³»ã§åäœããŸãã)
#define LGFX_USE_V1
// ããããincludeããŸãã
#include <LovyanGFX.hpp>
#include <LGFX_AUTODETECT.hpp> // ã¯ã©ã¹"LGFX"ãçšæããŸã
// #include <lgfx_user/LGFX_ESP32_sample.hpp> // ãŸãã¯ãŠãŒã¶èªèº«ãçšæããLGFXã¯ã©ã¹ãæºåããŸã
static LGFX lcd; // LGFXã®ã€ã³ã¹ã¿ã³ã¹ãäœæã
static LGFX_Sprite sprite(&lcd); // ã¹ãã©ã€ãã䜿ãå Žåã¯LGFX_Spriteã®ã€ã³ã¹ã¿ã³ã¹ãäœæã
// ããçŸåš TFT_eSPI ã䜿çšäžã§ããœãŒã¹ããªãã¹ãå€æŽããããªãå Žåã¯ããã¡ãã®ããããå©çšã§ããŸãã
// #include <LGFX_TFT_eSPI.hpp>
// static TFT_eSPI lcd; // TFT_eSPIãLGFXã®å¥åãšããŠå®çŸ©ãããŸãã
// static TFT_eSprite sprite(&lcd); // TFT_eSpriteãLGFX_Spriteã®å¥åãšããŠå®çŸ©ãããŸãã
// 察å¿æ©çš®ã«ç¡ãæ§æã§äœ¿ãå Žåã¯ã examples/HowToUse/2_user_setting.ino ãåç
§ããŠãã ããã
// ãŸãèšå®äŸã¯src/lgfx_userãã©ã«ãã«ããããŸãã
void setup(void)
{
// æåã«åæåé¢æ°ãåŒã³åºããŸãã
lcd.init();
// å転æ¹åã 0ïœ3 ã®4æ¹åããèšå®ããŸãã(4ïœ7ã䜿çšãããšäžäžå転ã«ãªããŸãã)
lcd.setRotation(1);
// ããã¯ã©ã€ãã®èŒåºŠã 0ïœ255 ã®ç¯å²ã§èšå®ããŸãã
lcd.setBrightness(128);
// å¿
èŠã«å¿ããŠã«ã©ãŒã¢ãŒããèšå®ããŸããïŒåæå€ã¯16ïŒ
// 16ã®æ¹ãSPIéä¿¡éãå°ãªãé«éã«åäœããŸãããèµ€ãšéã®è«§èª¿ã5bitã«ãªããŸãã
// 24ã®æ¹ãSPIéä¿¡éãå€ããªããŸããã諧調衚çŸã綺éºã«ãªããŸãã
//lcd.setColorDepth(16); // RGB565ã®16ãããã«èšå®
lcd.setColorDepth(24); // RGB888ã®24ãããã«èšå®(衚瀺ãããè²æ°ã¯ããã«æ§èœã«ããRGB666ã®18ãããã«ãªããŸã)
// åºæ¬çãªå³åœ¢ã®æç»é¢æ°ã¯ä»¥äžã®éãã§ãã
/*
fillScreen ( color); // ç»é¢å
šäœã®å¡ã朰ã
drawPixel ( x, y , color); // ç¹
drawFastVLine ( x, y , h , color); // åçŽç·
drawFastHLine ( x, y, w , color); // æ°Žå¹³ç·
drawRect ( x, y, w, h , color); // ç©åœ¢ã®å€åš
fillRect ( x, y, w, h , color); // ç©åœ¢ã®å¡ã
drawRoundRect ( x, y, w, h, r, color); // è§äžžã®ç©åœ¢ã®å€åš
fillRoundRect ( x, y, w, h, r, color); // è§äžžã®ç©åœ¢ã®å¡ã
drawCircle ( x, y , r, color); // åã®å€åš
fillCircle ( x, y , r, color); // åã®å¡ã
drawEllipse ( x, y, rx, ry , color); // æ¥åã®å€åš
fillEllipse ( x, y, rx, ry , color); // æ¥åã®å¡ã
drawLine ( x0, y0, x1, y1 , color); // ïŒç¹éã®çŽç·
drawTriangle ( x0, y0, x1, y1, x2, y2, color); // ïŒç¹éã®äžè§åœ¢ã®å€åš
fillTriangle ( x0, y0, x1, y1, x2, y2, color); // ïŒç¹éã®äžè§åœ¢ã®å¡ã
drawBezier ( x0, y0, x1, y1, x2, y2, color); // ïŒç¹éã®ããžãšæ²ç·
drawBezier ( x0, y0, x1, y1, x2, y2, x3, y3, color); // ïŒç¹éã®ããžãšæ²ç·
drawArc ( x, y, r0, r1, angle0, angle1, color); // å匧ã®å€åš
fillArc ( x, y, r0, r1, angle0, angle1, color); // å匧ã®å¡ã
*/
// äŸãã°drawPixelã§ç¹ãæžãå Žåã¯ãåŒæ°ã¯ X座æš,Y座æš,è² ã®ïŒã€ã
lcd.drawPixel(0, 0, 0xFFFF); // 座æš0:0ã«çœã®ç¹ãæç»
// ã«ã©ãŒã³ãŒããçæããé¢æ°ãçšæãããŠãããè²ã®æå®ã«äœ¿çšã§ããŸãã
// åŒæ°ã¯ãèµ€,ç·,éããããã 0ïœ255ã§æå®ããŸãã
// è²æ
å ±ã®æ¬ èœãé²ããããcolor888ã䜿ãäºãæšå¥šããŸãã
lcd.drawFastVLine(2, 0, 100, lcd.color888(255, 0, 0)); // èµ€ã§åçŽã®ç·ãæç»
lcd.drawFastVLine(4, 0, 100, lcd.color565( 0, 255, 0)); // ç·ã§åçŽã®ç·ãæç»
lcd.drawFastVLine(6, 0, 100, lcd.color332( 0, 0, 255)); // éã§åçŽã®ç·ãæç»
// ã«ã©ãŒã³ãŒãçæé¢æ°ã䜿çšããªãå Žåã¯ä»¥äžã®ããã«ãªããŸãã
// RGB888 24ãããã§æå® uint32_tå
// RGB565 16ãããã§æå® uint16_tåãint32_tå
// RGB332 8ãããã§æå® uint8_tå
// uint32_tåã䜿çšãããšãRGB888ã®24ããããšããŠæ±ãããŸãã
// 16é²æ°2æ¡ã§èµ€ç·éã®é ã«èšè¿°ã§ããŸãã
// uint32_tåã®å€æ°ã䜿ãããæ«å°Ÿã«Uãä»ããããuint32_tåã«ãã£ã¹ãããŠäœ¿çšããŸãã
uint32_t red = 0xFF0000;
lcd.drawFastHLine(0, 2, 100, red); // èµ€ã§æ°Žå¹³ã®ç·ãæç»
lcd.drawFastHLine(0, 4, 100, 0x00FF00U); // ç·ã§æ°Žå¹³ã®ç·ãæç»
lcd.drawFastHLine(0, 6, 100, (uint32_t)0xFF); // éã§æ°Žå¹³ã®ç·ãæç»
// uint16_tåããã³int32_tåã䜿çšãããšãRGB565ã®16ããããšããŠæ±ãããŸãã
// ç¹å¥ãªæžãæ¹ãããªãå Žåã¯int32_tåãšããŠæ±ãããã®ã§ããã®æ¹åŒã«ãªããŸãã
// ïŒAdafruitGFX ã TFT_eSPI ãšã®äºææ§ã®ããã«ããã®ããã«ããŠããŸããïŒ
uint16_t green = 0x07E0;
lcd.drawRect(10, 10, 50, 50, 0xF800); // èµ€ã§ç©åœ¢ã®å€åšãæç»
lcd.drawRect(12, 12, 50, 50, green); // ç·ã§ç©åœ¢ã®å€åšãæç»
lcd.drawRect(14, 14, 50, 50, (uint16_t)0x1F); // éã§ç©åœ¢ã®å€åšãæç»
// int8_tåãuint8_tåã䜿çšãããšãRGB332ã®8ããããšããŠæ±ãããŸãã
uint8_t blue = 0x03;
lcd.fillRect(20, 20, 20, 20, (uint8_t)0xE0); // èµ€ã§ç©åœ¢ã®å¡ããæç»
lcd.fillRect(30, 30, 20, 20, (uint8_t)0x1C); // ç·ã§ç©åœ¢ã®å¡ããæç»
lcd.fillRect(40, 40, 20, 20, blue); // éã§ç©åœ¢ã®å¡ããæç»
// æç»é¢æ°ã®åŒæ°ã®è²ã¯çç¥ã§ããŸãã
// çç¥ããå ŽåãsetColoré¢æ°ã§èšå®ããè² ãŸãã¯æåŸã«äœ¿çšããè²ãæç»è²ãšããŠäœ¿çšããŸãã
// åãè²ã§ç¹°ãè¿ãæç»ããå Žåã¯ãçç¥ããæ¹ããããã«éãåäœããŸãã
lcd.setColor(0xFF0000U); // æç»è²ã«èµ€è²ãæå®
lcd.fillCircle ( 40, 80, 20 ); // èµ€è²ã§åã®å¡ã
lcd.fillEllipse( 80, 40, 10, 20); // èµ€è²ã§æ¥åã®å¡ã
lcd.fillArc ( 80, 80, 20, 10, 0, 90); // èµ€è²ã§å匧ã®å¡ã
lcd.fillTriangle(80, 80, 60, 80, 80, 60); // èµ€è²ã§äžè§ã®å¡ã
lcd.setColor(0x0000FFU); // æç»è²ã«éè²ãæå®
lcd.drawCircle ( 40, 80, 20 ); // éè²ã§åã®å€åš
lcd.drawEllipse( 80, 40, 10, 20); // éè²ã§æ¥åã®å€åš
lcd.drawArc ( 80, 80, 20, 10, 0, 90); // éè²ã§å匧ã®å€åš
lcd.drawTriangle(60, 80, 80, 80, 80, 60); // éè²ã§äžè§ã®å€åš
lcd.setColor(0x00FF00U); // æç»è²ã«ç·è²ãæå®
lcd.drawBezier( 60, 80, 80, 80, 80, 60); // ç·è²ã§äºæ¬¡ããžãšæ²ç·
lcd.drawBezier( 60, 80, 80, 20, 20, 80, 80, 60);// ç·è²ã§äžæ¬¡ããžãšæ²ç·
// ã°ã©ããŒã·ã§ã³ã®ç·ãæç»ããdrawGradientLine ã¯è²ã®æå®ãçç¥ã§ããŸããã
lcd.drawGradientLine( 0, 80, 80, 0, 0xFF0000U, 0x0000FFU);// èµ€ããéãžã®ã°ã©ããŒã·ã§ã³çŽç·
delay(1000);
// clearãŸãã¯fillScreenã§ç»é¢å
šäœãå¡ã朰ããŸãã
// fillScreenã¯fillRectã®ç»é¢å
šäœãæå®ããã®ãšåãã§ãè²ã®æå®ã¯æç»è²ã®æ±ãã«ãªããŸãã
lcd.fillScreen(0xFFFFFFu); // çœã§å¡ã朰ã
lcd.setColor(0x00FF00u); // æç»è²ã«ç·è²ãæå®
lcd.fillScreen(); // ç·ã§å¡ã朰ã
// clearã¯æç»ç³»ã®é¢æ°ãšã¯å¥ã§èæ¯è²ãšããæ±ãã§è²ãä¿æããŠããŸãã
// èæ¯è²ã¯åºçªãå°ãªãã§ãããã¹ã¯ããŒã«æ©èœäœ¿çšæã®ééãå¡ãè²ãšããŠã䜿çšãããŸãã
lcd.clear(0xFFFFFFu); // èæ¯è²ã«çœãæå®ããŠå¡ã朰ã
lcd.setBaseColor(0x000000u);// èæ¯è²ã«é»ãæå®
lcd.clear(); // é»ã§å¡ã朰ã
// SPIãã¹ã®ç¢ºä¿ãšè§£æŸã¯æç»é¢æ°ãåŒã³åºããæã«èªåçã«è¡ãããŸããã
// æç»ã¹ããŒããéèŠããå Žåã¯ãæç»åŠçã®ååŸã« startWriteãšendWriteã䜿çšããŸãã
// SPIãã¹ã®ç¢ºä¿ãšè§£æŸãæå¶ãããé床ãåäžããŸãã
// é»åããŒããŒ(EPD)ã®å ŽåãstartWrite()以éã®æç»ã¯ãendWrite()ãåŒã¶äºã§ç»é¢ã«åæ ãããŸãã
lcd.drawLine(0, 1, 39, 40, red); // SPIãã¹ç¢ºä¿ãç·ãæç»ãSPIãã¹è§£æŸ
lcd.drawLine(1, 0, 40, 39, blue); // SPIãã¹ç¢ºä¿ãç·ãæç»ãSPIãã¹è§£æŸ
lcd.startWrite(); // SPIãã¹ç¢ºä¿
lcd.drawLine(38, 0, 0, 38, 0xFFFF00U); // ç·ãæç»
lcd.drawLine(39, 1, 1, 39, 0xFF00FFU); // ç·ãæç»
lcd.drawLine(40, 2, 2, 40, 0x00FFFFU); // ç·ãæç»
lcd.endWrite(); // SPIãã¹è§£æŸ
// startWriteãšendWriteã¯åŒåºãåæ°ãå
éšã§ã«ãŠã³ãããŠããã
// ç¹°ãè¿ãåŒã³åºããå Žåã¯æåãšæåŸã®ã¿åäœããŸãã
// startWriteãšendWriteã¯å¿
ã察ã«ãªãããã«äœ¿çšããŠãã ããã
// (SPIãã¹ãå æããŠæ§ããªãå Žåã¯ãæåã«startWriteãäžåºŠåŒã³ãendWriteããªã䜿ãæ¹ãå¯èœã§ãã)
lcd.startWrite(); // ã«ãŠã³ã+1ãSPIãã¹ç¢ºä¿
lcd.startWrite(); // ã«ãŠã³ã+1
lcd.startWrite(); // ã«ãŠã³ã+1
lcd.endWrite(); // ã«ãŠã³ã-1
lcd.endWrite(); // ã«ãŠã³ã-1
lcd.endWrite(); // ã«ãŠã³ã-1ãSPIãã¹è§£æŸ
lcd.endWrite(); // äœãããªã
// ãªãéå°ã«endWriteãåŒã³åºããå Žåã¯äœãè¡ãããã«ãŠã³ãããã€ãã¹ã«ãªãããšããããŸããã
// startWriteã®ã«ãŠã³ãã®ç¶æ
ã«äŸããã匷å¶çã«SPIãã¹ã解æŸã»ç¢ºä¿ãããå Žåã¯ã
// endTransactionã»beginTransactionã䜿çšããŸãã
// ã«ãŠã³ãã¯ã¯ãªã¢ãããªãã®ã§ã蟻è€ãåããªããªããªããã泚æããŠãã ããã
lcd.startWrite(); // ã«ãŠã³ã+1ãSPIãã¹ç¢ºä¿
lcd.startWrite(); // ã«ãŠã³ã+1
lcd.drawPixel(0, 0); // æç»
lcd.endTransaction(); // SPIãã¹è§£æŸ
// ããã§ä»ã®SPIããã€ã¹ã®äœ¿çšãå¯èœ
// åãSPIãã¹ã®å¥ã®ããã€ã¹(SDã«ãŒãç)ã䜿ãå Žåã
// å¿
ãSPIãã¹ã解æŸãããç¶æ
ã§è¡ã£ãŠãã ããã
lcd.beginTransaction(); // SPIãã¹ã®ç¢ºä¿
lcd.drawPixel(0, 0); // æç»
lcd.endWrite(); // ã«ãŠã³ã-1
lcd.endWrite(); // ã«ãŠã³ã-1ãSPIãã¹è§£æŸ
// drawPixelãšã¯å¥ã«ãwritePixelãšããç¹ãæç»ããé¢æ°ããããŸãã
// drawPixelã¯å¿
èŠã«å¿ããŠSPIãã¹ã®ç¢ºä¿ãè¡ãã®ã«å¯Ÿãã
// writePixelã¯SPIãã¹ã®ç¶æ
ããã§ãã¯ããŸããã
lcd.startWrite(); // SPIãã¹ç¢ºä¿
for (uint32_t x = 0; x < 128; ++x) {
for (uint32_t y = 0; y < 128; ++y) {
lcd.writePixel(x, y, lcd.color888( x*2, x + y, y*2));
}
}
lcd.endWrite(); // SPIãã¹è§£æŸ
// ååã writeïœ ã§å§ãŸãé¢æ°ã¯å
šãŠæ瀺çã«startWriteãåŒã³åºããŠããå¿
èŠããããŸãã
// writePixelãwriteFastVLineãwriteFastHLineãwriteFillRect ã該åœããŸãã
delay(1000);
// ã¹ãã©ã€ãïŒãªãã¹ã¯ãªãŒã³ïŒãžã®æç»ãåæ§ã®æç»é¢æ°ã䜿ããŸãã
// æåã«ã¹ãã©ã€ãã®è²æ·±åºŠãsetColorDepthã§æå®ããŸããïŒçç¥ããå Žåã¯16ãšããŠæ±ãããŸããïŒ
//sprite.setColorDepth(1); // 1ããã( 2è²)ãã¬ããã¢ãŒãã«èšå®
//sprite.setColorDepth(2); // 2ããã( 4è²)ãã¬ããã¢ãŒãã«èšå®
//sprite.setColorDepth(4); // 4ããã(16è²)ãã¬ããã¢ãŒãã«èšå®
//sprite.setColorDepth(8); // RGB332ã®8ãããã«èšå®
//sprite.setColorDepth(16); // RGB565ã®16ãããã«èšå®
sprite.setColorDepth(24); // RGB888ã®24ãããã«èšå®
// â» setColorDepth(8);ãèšå®åŸã« createPalette()ãåŒã¶äºã§ã256è²ãã¬ããã¢ãŒãã«ãªããŸã
// sprite.createPalette();
// createSpriteã§å¹
ãšé«ããæå®ããŠã¡ã¢ãªã確ä¿ããŸãã
// æ¶è²»ããã¡ã¢ãªã¯è²æ·±åºŠãšé¢ç©ã«æ¯äŸããŸãã倧ãããããšã¡ã¢ãªç¢ºä¿ã«å€±æããŸãã®ã§æ³šæããŠãã ããã
sprite.createSprite(65, 65); // å¹
65ãé«ã65ã§ã¹ãã©ã€ããäœæã
for (uint32_t x = 0; x < 64; ++x) {
for (uint32_t y = 0; y < 64; ++y) {
sprite.drawPixel(x, y, lcd.color888(3 + x*4, (x + y)*2, 3 + y*4)); // ã¹ãã©ã€ãã«æç»
}
}
sprite.drawRect(0, 0, 65, 65, 0xFFFF);
// äœæããã¹ãã©ã€ãã¯pushSpriteã§ä»»æã®åº§æšã«åºåã§ããŸãã
// åºåå
ã¯ã€ã³ã¹ã¿ã³ã¹äœææã«åŒæ°ã§æž¡ããLGFXã«ãªããŸãã
sprite.pushSprite(64, 0); // lcdã®åº§æš64,0ã«ã¹ãã©ã€ããæç»
// spriteã®ã€ã³ã¹ã¿ã³ã¹äœææã«æç»å
ã®ãã€ã³ã¿ãæž¡ããŠããªãå Žåãã
// è€æ°ã®LGFXãããå Žåãªã©ã¯ãåºåå
ã第äžåŒæ°ã«æå®ããŠpushSpriteããããšãã§ããŸãã
sprite.pushSprite(&lcd, 0, 64); // lcdã®åº§æš0,64ã«ã¹ãã©ã€ããæç»
delay(1000);
// pushRotateZoomã§ã¹ãã©ã€ããå転æ¡å€§çž®å°ããŠæç»ã§ããŸãã
// setPivotã§èšå®ãã座æšãå転äžå¿ãšããŠæ±ãããæç»å
ã®åº§æšã«å転äžå¿ãäœçœ®ããããã«æç»ãããŸãã
sprite.setPivot(32, 32); // 座æš32,32ãäžå¿ãšããŠæ±ã
int32_t center_x = lcd.width()/2;
int32_t center_y = lcd.height()/2;
lcd.startWrite();
for (int angle = 0; angle <= 360; ++angle) {
sprite.pushRotateZoom(center_x, center_y, angle, 2.5, 3); // ç»é¢äžå¿ã«è§åºŠangleãå¹
2.5åãé«ã3åã§æç»
if ((angle % 36) == 0) lcd.display(); // é»åããŒããŒã®å Žåã®è¡šç€ºæŽæ°ã 36åã«äžåºŠè¡ã
}
lcd.endWrite();
delay(1000);
// 䜿çšããªããªã£ãã¹ãã©ã€ãã®ã¡ã¢ãªã解æŸããã«ã¯ deleteSprite ã䜿çšããŸãã
sprite.deleteSprite();
// deleteSprite ã®åŸã§ããåãã€ã³ã¹ã¿ã³ã¹ã®åå©çšãå¯èœã§ãã
sprite.setColorDepth(4); // 4ããã(16è²)ãã¬ããã¢ãŒãã«èšå®
sprite.createSprite(65, 65);
// ãã¬ããã¢ãŒãã®ã¹ãã©ã€ãã§ã¯ãæç»é¢æ°ã®åŒæ°ã®è²ããã¬ããçªå·ãšããŠæ±ããŸãã
// pushSpriteçã§æç»ããéã«ããã¬ãããåç
§ããŠå®éã®æç»è²ã決ãŸããŸãã
// 4ããã(16è²)ãã¬ããã¢ãŒãã®å Žåããã¬ããçªå·ã¯0ïœ15ã䜿çšå¯èœã§ãã
// ãã¬ããã®åæè²ã¯ã0ãé»,æ«å°Ÿã®ãã¬ãããçœã§ã0ããæ«å°Ÿã«ãããŠã°ã©ããŒã·ã§ã³ã«ãªã£ãŠããŸãã
// ãã¬ããã®è²ãèšå®ããã«ã¯ setPaletteColor ã䜿çšããŸãã
sprite.setPaletteColor(1, 0x0000FFU); // ãã¬ãã1çªãéã«èšå®
sprite.setPaletteColor(2, 0x00FF00U); // ãã¬ãã2çªãç·ã«èšå®
sprite.setPaletteColor(3, 0xFF0000U); // ãã¬ãã3çªãèµ€ã«èšå®
sprite.fillRect(10, 10, 45, 45, 1); // ãã¬ãã1çªã§ç©åœ¢ã®å¡ã
sprite.fillCircle(32, 32, 22, 2); // ãã¬ãã2çªã§åã®å¡ã
sprite.fillTriangle(32, 12, 15, 43, 49, 43, 3); // ãã¬ãã3çªã§äžè§ã®å¡ã
// pushSpriteã®æåŸã®åŒæ°ã§ãæç»ããªãè²ãæå®ããããšãã§ããŸãã
sprite.pushSprite( 0, 0, 0); // ãã¬ãã0ãééæ±ãã§ã¹ãã©ã€ããæç»
sprite.pushSprite(65, 0, 1); // ãã¬ãã1ãééæ±ãã§ã¹ãã©ã€ããæç»
sprite.pushSprite( 0, 65, 2); // ãã¬ãã2ãééæ±ãã§ã¹ãã©ã€ããæç»
sprite.pushSprite(65, 65, 3); // ãã¬ãã3ãééæ±ãã§ã¹ãã©ã€ããæç»
delay(5000);
lcd.startWrite(); // ããã§startWrite()ããããšã§ãSPIãã¹ãå æãããŸãŸã«ããã
}
void loop(void)
{
static int count = 0;
static int a = 0;
static int x = 0;
static int y = 0;
static float zoom = 3;
++count;
if ((a += 1) >= 360) a -= 360;
if ((x += 2) >= lcd.width()) x -= lcd.width();
if ((y += 1) >= lcd.height()) y -= lcd.height();
sprite.setPaletteColor(1, lcd.color888( 0, 0, count & 0xFF));
sprite.setPaletteColor(2, lcd.color888( 0,~count & 0xFF, 0));
sprite.setPaletteColor(3, lcd.color888( count & 0xFF, 0, 0));
sprite.pushRotateZoom(x, y, a, zoom, zoom, 0);
if ((count % 100) == 0) lcd.display(); // é»åããŒããŒã®å Žåã®è¡šç€ºæŽæ°ã 100åã«äžåºŠè¡ã
}
include <M5Stack.h> ããåŸã« include <LovyanGFX.hpp> ãæžããŠãã ããã
M5.Lcdã¯äœ¿ããã«ãå¥éLGFXã®ã€ã³ã¹ã¿ã³ã¹ãçšæããŠäœ¿çšããŠãã ããã
ESP32-Chimera-Core ãå©çšãããšãM5.Lcd ã LovyanGFX ã«ãªããŸãã
TFT_eSPIã¯çŽ æŽãããã©ã€ãã©ãªã§ããããããè€æ°ã®ã¢ãŒããã¯ãã£ã察象ãšããããæ§é çã«è€éãšãªã£ãŠãããESP-IDFãžã®å¯Ÿå¿ã18bitã«ã©ãŒãžã®å¯Ÿå¿ãªã©ãæ±ããæ©èœã®è¿œå ãè¡ãäºãéåžžã«å°é£ãšãªã£ãŠããŸããã
LovyanGFX ã¯ãããã®æ©èœã®è¿œå ãšããã©ãŒãã³ã¹ã®æé©åãå®çŸããããã«äœæããŸããã
TFT_eSPI is a great library. However, it is structurally complex because it targets multiple architectures, making it very difficult to add required functions such as ESP-IDF support and 18-bit color support.
LovyanGFX has been created to add these features and optimize performance.
ãã®ã©ã€ãã©ãªãäœæããã«ããããã€ã³ã¹ãã¬ãŒã·ã§ã³ãé ããTFT_eSPIã©ã€ãã©ãªã®äœè
Bodmeræ°ãžæè¬ããããŸãã
TFT_eSPIã®ããŒã¹ãšãªã£ããAdafruitGFXãå
¬éããŠããAdafruit Industriesãžæè¬ããããŸãã
TJpgDec (Tiny JPEG Decompressor) ã®äœè
ChaNæ°ãžæè¬ããããŸãã
Pngle (PNG Loader for Embedding) ã®äœè
kikuchanæ°ãžæè¬ããããŸãã
QRCode (QR code generation library) ã®äœè
Richard Mooreæ°ãžæè¬ããããŸãã
å€ãã®æè¡çãªã¢ããã€ã¹ãESP-IDFç°å¢ã§ã®æ€èšŒã«ååããŠãããcinimlæ°ãžæè¬ããããŸãã
äžå
·åã®å€ãéçºåæããã®åäœæ€èšŒããã³å€æ°ã®å©èšããã ãã£ãmongonta0716æ°ãžæè¬ããããŸãã
å€æ°ã®ããŒãã§ã®åäœæ€èšŒãè±èªãžã®ç¿»èš³ããã³å€æ°ã®å©èšããã ãã£ãtobozoæ°ãžæè¬ããããŸãã
ãã©ã³ãããŒã¿ã®äœæã«ååããŠãã ãã£ãTANAKA Masayukiæ°ãžæè¬ããããŸãã
æ¥æ¬èªãã©ã³ããµãã»ãããžã§ãã¬ãŒã¿ãŒã補äœããŠãã ãã£ãYAMANEKOæ°ãžæè¬ããããŸãã
Thanks to Bodmer, author of the TFT_eSPI library, for the inspiration to create this library.
Thanks to Adafruit Industries for publishing AdafruitGFX, which is the basis for TFT_eSPI.
Thanks to ChaN, author of TJpgDec (Tiny JPEG Decompressor).
Thanks to kikuchan, author of Pngle (PNG Loader for Embedding).
Thanks to Richard Moore, author of QRCode (QR code generation library).
Thanks to ciniml, for many technical tips and help with validation in the ESP-IDF environment.
Thanks to mongonta0716, for verifying the work from the beginning of the development with many bugs and for his advice.
Thanks to tobozo, for testing it on various boards, translating it into English and giving me a lot of advice.
Thanks to TANAKA Masayuki, for creating the font data.
Thanks to YAMANEKO, for creating the lgfxFontSubsetGenerator.
TJpgDec ChaN
Pngle kikuchan
QRCode Richard Moore and Nayuki
main : FreeBSD
TJpgDec : original ChaN
Pngle : MIT kikuchan
QRCode : MIT Richard Moore and Nayuki
result : MIT Matthew Rodusek
GFX font and GLCD font : 2-clause BSD Adafruit Industries
Font 2,4,6,7,8 : FreeBSD Bodmer
converted IPA font : IPA Font License IPA
efont : 3-clause BSD The Electronic Font Open Laboratory
TomThumb font : 3-clause BSD Brian J. Swetland / Vassilii Khachaturov / Dan Marks